1. 程式人生 > >模擬IIC讀取EEPROM存儲單元AT24C02(新唐M051系列單片機)

模擬IIC讀取EEPROM存儲單元AT24C02(新唐M051系列單片機)

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)
#define
IIC_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系列單片機)