模擬IIC讀取EEPROM存儲單元AT24C02(新唐M051系列單片機)
阿新 • • 發佈:2019-03-14
string target fin spa code iic font init ret
本文只包含IIC協議和AT24C02的單字節讀取,寫入部分也是類似就不贅述了。
AT24C02資料鏈接-->點我
詳細理解描述可以看這位老哥-->跳轉
本文代碼需要的聲明和宏定義如下:
#define IIC_SDA E_PORT1,E_PIN5 #define IIC_SCL E_PORT1,E_PIN6 #define IIC_SDA_SET DrvGPIO_SetBit(IIC_SDA) #define IIC_SDA_CLR DrvGPIO_ClrBit(IIC_SDA) #define IIC_SCL_SET DrvGPIO_SetBit(IIC_SCL) #defineIIC_SCL_CLR DrvGPIO_ClrBit(IIC_SCL) #define SDA_READ DrvGPIO_GetBit(IIC_SDA) typedef unsigned char u8; typedef unsigned short u16; typedef unsigned long u32;
IIC協議起始和終止
遊戲起始的規則:數據線(SDA)在時鐘線(SCL)保持在高位的情況下產生變化:高→低
遊戲終止的規則:數據線(SDA)在時鐘線(SCL)保持在高位的情況下產生變化:低→高
代碼如下(延時一般保證大於4.7us就行,可稍微大些):
void IIC_Start(void) { IIC_SDA_SET; IIC_SCL_SET; DrvSYS_Delay(8); IIC_SDA_CLR; DrvSYS_Delay(8); IIC_SCL_CLR; } void IIC_Stop(void) { IIC_SCL_CLR; IIC_SDA_CLR; DrvSYS_Delay(8); IIC_SCL_SET; DrvSYS_Delay(8); IIC_SDA_SET; }
IIC協議等待響應
void IIC_Wait_Ack(void) { u8 i=0; IIC_SDA_SET; DrvSYS_Delay(8); IIC_SCL_SET; DrvSYS_Delay(8); while(SDA_READ&&i<200) { i++; SendString("ack fail \n"); } IIC_SCL_CLR;//<--------這裏千萬不能忘,漏掉讀出來的全都是255 DrvSYS_Delay(8); }
IIC協議發送一個字節
void IIC_Send_Byte(u8 byte) { char str[20]; u8 i; for(i=0;i<8;i++) { IIC_SCL_CLR; DrvSYS_Delay(8); if(byte&(1<<(7-i))) IIC_SDA_SET; else IIC_SDA_CLR; DrvSYS_Delay(8); IIC_SCL_SET; DrvSYS_Delay(8); } IIC_SCL_CLR; IIC_SDA_SET; DrvSYS_Delay(8); sprintf(str,"--%x--",byte); SendString(str); }
IIC協議接收一個字節
u8 IIC_Read_Byte(void) { char str[22]; u8 i,dat=0; IIC_SDA_SET; IIC_SCL_CLR; DrvSYS_Delay(8); for(i=0;i<8;i++) { IIC_SCL_SET; DrvSYS_Delay(8); dat<<=1; dat|=SDA_READ; DrvSYS_Delay(8); IIC_SCL_CLR; DrvSYS_Delay(8); sprintf(str,"--%d--",dat); SendString(str); } return dat; }
以上是IIC協議的部分,下面是對AT24C02進行操作
初始化
首先模擬的IIC需要對兩時鐘和數據線連接的引腳進行配置,時鐘線讓它保持輸出就行,數據線則需要設置為準雙向,代碼如下:
void IIC_Init(void) { DrvGPIO_Open(IIC_SDA, E_IO_QUASI); DrvGPIO_Open(IIC_SCL, E_IO_OUTPUT); }
向EEPROM中寫數據
u8 AT24C02_ReadOneByte(u16 ReadAddr) { u8 temp=0; IIC_Start(); IIC_Send_Byte(0XA0); //發送器件地址0XA0,寫數據 IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr); //發送低地址 IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(0XA1); //進入接收模式 IIC_Wait_Ack(); temp=IIC_Read_Byte(); IIC_Stop();//產生一個停止條件 return temp; }
模擬IIC讀取EEPROM存儲單元AT24C02(新唐M051系列單片機)