在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32編程之軟件模擬IIC對(duì)24C02存儲(chǔ)器讀寫(xiě)操作

            STM32編程之軟件模擬IIC對(duì)24C02存儲(chǔ)器讀寫(xiě)操作

            作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò) 收藏
            1、主程序

            本文引用地址:http://www.biyoush.com/article/201611/315582.htm

            #include "stm32f10x_conf.h"
            #include "led.h"
            #include "key.h"
            #include "usart.h"
            #include "lcd.h"
            #include "24cxx.h"
            #include "myiic.h"
            #include "delay.h"
            u8 tabel[]="write data is:0 1 2 3 4 5 6 7 8 9 ";
            /*
            程序功能:STM32實(shí)現(xiàn)24C02讀寫(xiě)操作
            當(dāng)按下KEY1時(shí),向24C02寫(xiě)入數(shù)組中的數(shù)據(jù);
            當(dāng)按下KEY2時(shí),從24C02中讀出數(shù)據(jù)到數(shù)組。
            用LCD液晶顯示操作過(guò)程;
            用串口顯示寫(xiě)入和讀出的數(shù)據(jù)。
            LED0指示程序的工作狀態(tài)。
            作者:王廬山
            日期:2015年7月24日
            地點(diǎn):湖北工業(yè)職業(yè)技術(shù)學(xué)院電子工程
            硬件連接:PC12--SCL
            PC11--SDA
            備注:采用軟件模擬IIC來(lái)實(shí)現(xiàn)的。

            */

            int main(void)
            {
            u8 i=0;
            delay_init();
            LED_Init();
            key_init();
            uart_init(9600);
            LCD_Init();
            AT24CXX_Init();
            LCD_Clear(RED);
            POINT_COLOR=BLUE;
            LCD_ShowString(30,60,200,16,16,"24c02_IIC test! ");
            LCD_ShowString(30,80,200,16,16,"press k1 to write.");
            LCD_ShowString(30,100,200,16,16,"press k2 to read.");
            while(AT24CXX_Check()==1)
            {
            LCD_ShowString(30,120,200,16,16,"error,please check!");
            }

            while(1)
            {
            switch(keyscan())
            {
            case 1:
            {
            LCD_ShowString(30,120,200,16,16,"24c02 is writing!");
            AT24CXX_Write(0X0000,tabel,sizeof(tabel)-1);
            printf("24c02 is writing! n");
            printf("Write data is:%sn",tabel);
            break;
            }
            case 2:
            {
            LCD_ShowString(30,120,200,16,16,"24c02 is reading!");
            AT24CXX_Read(0X0000,tabel,sizeof(tabel)-1);
            printf("24c02 is reading! n");

            printf("Read data is:%sn",tabel);
            break;
            }
            default:break;
            }
            delay_ms(10);
            i++;
            if(i>25)
            {i=0;LED0=~LED0;}
            }

            }

            2、IIC驅(qū)動(dòng)程序

            #include "myiic.h"
            #include "delay.h"
            /*
            程序功能:通用STM32系列IIC總線(xiàn)軟件模擬方式驅(qū)動(dòng)程序

            */

            //初始化IIC
            void IIC_Init(void)
            {
            GPIO_InitTypeDef GPIO_InitStructure;
            //RCC->APB2ENR|=1<<4;//先使能外設(shè)IO PORTC時(shí)鐘
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE );

            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽輸出
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
            GPIO_Init(GPIOC, &GPIO_InitStructure);

            IIC_SCL=1;
            IIC_SDA=1;

            }
            //產(chǎn)生IIC起始信號(hào)
            void IIC_Start(void)
            {
            SDA_OUT(); //sda線(xiàn)輸出
            IIC_SDA=1;
            IIC_SCL=1;
            delay_us(4);
            IIC_SDA=0;//START:when CLK is high,DATA change form high to low
            delay_us(4);
            IIC_SCL=0;//鉗住I2C總線(xiàn),準(zhǔn)備發(fā)送或接收數(shù)據(jù)
            }
            //產(chǎn)生IIC停止信號(hào)
            void IIC_Stop(void)
            {
            SDA_OUT();//sda線(xiàn)輸出
            IIC_SCL=0;
            IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
            delay_us(4);
            IIC_SCL=1;
            IIC_SDA=1;//發(fā)送I2C總線(xiàn)結(jié)束信號(hào)
            delay_us(4);
            }
            //等待應(yīng)答信號(hào)到來(lái)
            //返回值:1,接收應(yīng)答失敗
            // 0,接收應(yīng)答成功
            u8 IIC_Wait_Ack(void)
            {
            u8 ucErrTime=0;
            SDA_IN(); //SDA設(shè)置為輸入
            IIC_SDA=1;delay_us(1);
            IIC_SCL=1;delay_us(1);
            while(READ_SDA)
            {
            ucErrTime++;
            if(ucErrTime>250)
            {
            IIC_Stop();
            return 1;
            }
            }
            IIC_SCL=0;//時(shí)鐘輸出0
            return 0;
            }
            //產(chǎn)生ACK應(yīng)答
            void IIC_Ack(void)
            {
            IIC_SCL=0;
            SDA_OUT();
            IIC_SDA=0;
            delay_us(2);
            IIC_SCL=1;
            delay_us(2);
            IIC_SCL=0;
            }
            //不產(chǎn)生ACK應(yīng)答
            void IIC_NAck(void)
            {
            IIC_SCL=0;
            SDA_OUT();
            IIC_SDA=1;
            delay_us(2);
            IIC_SCL=1;
            delay_us(2);
            IIC_SCL=0;
            }
            //IIC發(fā)送一個(gè)字節(jié)
            //返回從機(jī)有無(wú)應(yīng)答
            //1,有應(yīng)答
            //0,無(wú)應(yīng)答
            void IIC_Send_Byte(u8 txd)
            {
            u8 t;
            SDA_OUT();
            IIC_SCL=0;//拉低時(shí)鐘開(kāi)始數(shù)據(jù)傳輸
            for(t=0;t<8;t++)
            {
            IIC_SDA=(txd&0x80)>>7;
            txd<<=1;
            delay_us(2); //對(duì)TEA5767這三個(gè)延時(shí)都是必須的
            IIC_SCL=1;
            delay_us(2);
            IIC_SCL=0;
            delay_us(2);
            }
            }
            //讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK
            u8 IIC_Read_Byte(unsigned char ack)
            {
            unsigned char i,receive=0;
            SDA_IN();//SDA設(shè)置為輸入
            for(i=0;i<8;i++ )
            {
            IIC_SCL=0;
            delay_us(2);
            IIC_SCL=1;
            receive<<=1;
            if(READ_SDA)receive++;
            delay_us(1);
            }
            if (!ack)
            IIC_NAck();//發(fā)送nACK
            else
            IIC_Ack(); //發(fā)送ACK
            return receive;
            }

            void SDA_IN(void)
            {
            GPIO_InitTypeDef GPIO_InitStructure;
            GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//GPIO_Mode_IN_FLOATING
            GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
            GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
            GPIO_Init(GPIOC,&GPIO_InitStructure);

            }

            void SDA_OUT(void)
            {
            GPIO_InitTypeDef GPIO_InitStructure;
            GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
            GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
            GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
            GPIO_Init(GPIOC,&GPIO_InitStructure);

            }

            IIC驅(qū)動(dòng)頭文件

            #ifndef __MYIIC_H
            #define __MYIIC_H
            #include "sys.h"
            /*
            程序功能:通用STM32系列IIC總線(xiàn)軟件模擬方式驅(qū)動(dòng)程序頭文件
            */

            //IO方向設(shè)置
            /* 方法1 :用寄存器的方式來(lái)實(shí)現(xiàn)
            #define SDA_IN() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
            #define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}*/
            //方法2:用函數(shù)的方法來(lái)實(shí)現(xiàn)
            void SDA_IN();
            void SDA_OUT();

            //IO操作函數(shù)
            #define IIC_SCL PCout(12) //SCL
            #define IIC_SDA PCout(11) //SDA
            #define READ_SDA PCin(11) //輸入SDA


            //IIC所有操作函數(shù)
            void IIC_Init(void); //初始化IIC的IO口
            void IIC_Start(void);//發(fā)送IIC開(kāi)始信號(hào)
            void IIC_Stop(void); //發(fā)送IIC停止信號(hào)
            void IIC_Send_Byte(u8 txd);//IIC發(fā)送一個(gè)字節(jié)
            u8 IIC_Read_Byte(unsigned char ack);//IIC讀取一個(gè)字節(jié)
            u8 IIC_Wait_Ack(void); //IIC等待ACK信號(hào)
            void IIC_Ack(void);//IIC發(fā)送ACK信號(hào)
            void IIC_NAck(void);//IIC不發(fā)送ACK信號(hào)

            void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
            u8 IIC_Read_One_Byte(u8 daddr,u8 addr);
            #endif

            3、24C02讀寫(xiě)驅(qū)動(dòng)

            #include "24cxx.h"
            #include "delay.h"

            //初始化IIC接口
            void AT24CXX_Init(void)
            {
            IIC_Init();
            }
            //在A(yíng)T24CXX指定地址讀出一個(gè)數(shù)據(jù)
            //ReadAddr:開(kāi)始讀數(shù)的地址
            //返回值 :讀到的數(shù)據(jù)
            u8 AT24CXX_ReadOneByte(u16 ReadAddr)
            {
            u8 temp=0;
            IIC_Start();
            if(EE_TYPE>AT24C16)
            {
            IIC_Send_Byte(0XA0); //發(fā)送寫(xiě)命令
            IIC_Wait_Ack();
            IIC_Send_Byte(ReadAddr>>8);//發(fā)送高地址
            IIC_Wait_Ack();
            }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //發(fā)送器件地址0XA0,寫(xiě)數(shù)據(jù)

            IIC_Wait_Ack();
            IIC_Send_Byte(ReadAddr%256); //發(fā)送低地址
            IIC_Wait_Ack();
            IIC_Start();
            IIC_Send_Byte(0XA1); //進(jìn)入接收模式
            IIC_Wait_Ack();
            temp=IIC_Read_Byte(0);
            IIC_Stop();//產(chǎn)生一個(gè)停止條件
            return temp;
            }
            //在A(yíng)T24CXX指定地址寫(xiě)入一個(gè)數(shù)據(jù)
            //WriteAddr :寫(xiě)入數(shù)據(jù)的目的地址
            //DataToWrite:要寫(xiě)入的數(shù)據(jù)
            void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
            {
            IIC_Start();
            if(EE_TYPE>AT24C16)
            {
            IIC_Send_Byte(0XA0); //發(fā)送寫(xiě)命令
            IIC_Wait_Ack();
            IIC_Send_Byte(WriteAddr>>8);//發(fā)送高地址
            }else
            {
            IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //發(fā)送器件地址0XA0,寫(xiě)數(shù)據(jù)
            }
            IIC_Wait_Ack();
            IIC_Send_Byte(WriteAddr%256); //發(fā)送低地址
            IIC_Wait_Ack();
            IIC_Send_Byte(DataToWrite); //發(fā)送字節(jié)
            IIC_Wait_Ack();
            IIC_Stop();//產(chǎn)生一個(gè)停止條件
            delay_ms(10);
            }
            //在A(yíng)T24CXX里面的指定地址開(kāi)始寫(xiě)入長(zhǎng)度為L(zhǎng)en的數(shù)據(jù)
            //該函數(shù)用于寫(xiě)入16bit或者32bit的數(shù)據(jù).
            //WriteAddr :開(kāi)始寫(xiě)入的地址
            //DataToWrite:數(shù)據(jù)數(shù)組首地址
            //Len :要寫(xiě)入數(shù)據(jù)的長(zhǎng)度2,4
            void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
            {
            u8 t;
            for(t=0;t{
            AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
            }
            }

            //在A(yíng)T24CXX里面的指定地址開(kāi)始讀出長(zhǎng)度為L(zhǎng)en的數(shù)據(jù)
            //該函數(shù)用于讀出16bit或者32bit的數(shù)據(jù).
            //ReadAddr :開(kāi)始讀出的地址
            //返回值 :數(shù)據(jù)
            //Len :要讀出數(shù)據(jù)的長(zhǎng)度2,4
            u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)
            {
            u8 t;
            u32 temp=0;
            for(t=0;t{
            temp<<=8;
            temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);
            }
            return temp;
            }
            //檢查AT24CXX是否正常
            //這里用了24XX的最后一個(gè)地址(255)來(lái)存儲(chǔ)標(biāo)志字.
            //如果用其他24C系列,這個(gè)地址要修改
            //返回1:檢測(cè)失敗
            //返回0:檢測(cè)成功
            u8 AT24CXX_Check(void)
            {
            u8 temp;
            temp=AT24CXX_ReadOneByte(255);//避免每次開(kāi)機(jī)都寫(xiě)AT24CXX
            if(temp==0X55)return 0;
            else//排除第一次初始化的情況
            {
            AT24CXX_WriteOneByte(255,0X55);
            temp=AT24CXX_ReadOneByte(255);
            if(temp==0X55)return 0;
            }
            return 1;
            }

            //在A(yíng)T24CXX里面的指定地址開(kāi)始讀出指定個(gè)數(shù)的數(shù)據(jù)
            //ReadAddr :開(kāi)始讀出的地址 對(duì)24c02為0~255
            //pBuffer :數(shù)據(jù)數(shù)組首地址
            //NumToRead:要讀出數(shù)據(jù)的個(gè)數(shù)
            void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
            {
            while(NumToRead)
            {
            *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);
            NumToRead--;
            }
            }
            //在A(yíng)T24CXX里面的指定地址開(kāi)始寫(xiě)入指定個(gè)數(shù)的數(shù)據(jù)
            //WriteAddr :開(kāi)始寫(xiě)入的地址 對(duì)24c02為0~255
            //pBuffer :數(shù)據(jù)數(shù)組首地址
            //NumToWrite:要寫(xiě)入數(shù)據(jù)的個(gè)數(shù)
            void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
            {
            while(NumToWrite--)
            {
            AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
            WriteAddr++;
            pBuffer++;
            }
            }


            24C驅(qū)動(dòng)頭文件

            #ifndef __24CXX_H
            #define __24CXX_H
            #include "myiic.h"

            #define AT24C01127
            #define AT24C02255
            #define AT24C04511
            #define AT24C081023
            #define AT24C162047
            #define AT24C324095
            #define AT24C64 8191
            #define AT24C12816383
            #define AT24C25632767
            //Mini STM32開(kāi)發(fā)板使用的是24c02,所以定義EE_TYPE為AT24C02
            #define EE_TYPE AT24C02

            u8 AT24CXX_ReadOneByte(u16 ReadAddr);//指定地址讀取一個(gè)字節(jié)
            void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite);//指定地址寫(xiě)入一個(gè)字節(jié)
            void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len);//指定地址開(kāi)始寫(xiě)入指定長(zhǎng)度的數(shù)據(jù)
            u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len);//指定地址開(kāi)始讀取指定長(zhǎng)度數(shù)據(jù)
            void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite);//從指定地址開(kāi)始寫(xiě)入指定長(zhǎng)度的數(shù)據(jù)
            void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead); //從指定地址開(kāi)始讀出指定長(zhǎng)度的數(shù)據(jù)

            u8 AT24CXX_Check(void); //檢查器件
            void AT24CXX_Init(void); //初始化IIC
            #endif



            評(píng)論


            技術(shù)專(zhuān)區(qū)

            關(guān)閉