IIC時序和24C02讀寫字節時序


    一年前剛學51單片機時,接觸到了IIC時序和用IIC通信讀寫AT24C02的學習歷程。那時剛剛大一,對數據線時鍾線等概念不是很清楚,也沒有分清IIC通信的底層時序和寫24c02的時序為什么不同。 

    借着學stm32的機會,再簡單整理一下現在對這兩種時序的認識。

 ---IIC時序是一種底層的通信協議,它規定了數據0,1寫入的有效性,起始終止等

 ---24C02的各種讀寫時序是該外設的讀寫規則,它規定了先寫XX地址,再寫XX地址,再寫XX數據……這些順序。它的各部分內容的寫入讀出都以IIC為基礎

 

 

   簡單說,IIC時序時24C02時序的基礎構成,IIC時序是一種通信時序,是最底層的,類似於SPI等。而24C02作為一種外設,他有着自己的讀寫操作的規則,先寫什么,再寫什么,

我(24C02)才能正確讓你對我進行讀寫操作。而因為這款芯片用的通信方式是I2C傳輸,所以它時序里的寫器件地址,寫字地址,寫數據內容無一例外用的都是I2C傳輸過去的。

 

   IIC時序理解起來很簡單,程序也簡單易寫。

  下面簡單分析一下24C02時序中的字節寫時序和字節讀時序。

 

 

這是器件地址格式

前四位固定為1010,,A2A1A0決定了IIC通信中作為從機的24C02的地址,最后一位R/W決定是對其進行讀還是寫。

比如說當我們將24C02的A2A1A0都接地,那么從機的寫地址就是1010 0000 即0xA0,而從機的讀地址就是0xA1

 

以寫時序為例

可以看到依次為起始信號,期間地址,應答,字節地址,應答,數據,應答,停止信號

下面附一段代碼

//在AT24CXX指定地址寫入一個數據
//WriteAddr  :寫入數據的目的地址    
//DataToWrite:要寫入的數據
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{                                                                                                  
    IIC_Start();  
    if(EE_TYPE>AT24C16)
    {
        IIC_Send_Byte(0XA0);        //發送寫命令
        IIC_Wait_Ack();
        IIC_Send_Byte(WriteAddr>>8);//發送高地址
     }else
    {
        IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //發送器件地址0XA0,寫數據   //為了兼容更大容量的芯片
    }     
    IIC_Wait_Ack();       
    IIC_Send_Byte(WriteAddr%256);   //發送字節地址
    IIC_Wait_Ack();                                                           
    IIC_Send_Byte(DataToWrite);     //發送字節                               
    IIC_Wait_Ack();                     
    IIC_Stop();//產生一個停止條件 
    delay_ms(10);     
}

這就是完全按照時序圖寫的對24C02指定字節寫數據程序。同理讀操作也一樣。

A2A1A0全部接地。

其中的WriteAddr時寫字節地址,也就是對24C02的256個字節中的哪一個進行寫操作

 

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM