IIC 的一些特征:
兩條總線:串行數據總線(SDA)和串行時鐘總線(SCL)真正的多主機總線連接到相同總線的ic數量隻受到總線的最大電容400pF限制。串行8位雙向數據在标準模式下可達100K bit/s快速模式400K bit/s,高速模式下3.4Mbit/s.數據有效性規定:IIC總線在進行數據傳輸時,SCL在高電平區間,SDA上的電平必須保持穩定SDA的數據的高或者低電平狀态隻有在SCL線的時鐘信号是低電平時才能改變。起始和停止條件:起始:SCL高電平時,SDA由高電平向低電平切換。停止:SCL高電平時,SDA由低電平向高電平切換。模拟時序如下:起始與終止:
應答與非應答:
總線上進行一次數據傳輸的通信格式:
相關模拟時序的驅動函數:包括(start,stop,respons,write_byte,read_byte)----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//SCL高電平區間,SDA一個下降沿啟動信号void Start(){ SDA=1; delay(); SCL=1; delay(); SDA=0; delay();}----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//SCL在高電平區間,SDA一個上升沿停止信号void Stop(){ SDA=0; delay(); SCL=1; delay(); SDA=1; delay();}----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//SCL在高電平區間,SDA被從設備拉低表示應答,//(SDA==1)&&(i<255)表示如果一段時間未收到從期間//的應答則默認從期間已經收到而不再等待應答信号void Respons(){ uchari=0; SCL=1; delay(); while((SDA==1)&&(i<255)) i ; SCL=0; delay(); }----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//CY 為PSW寄存器中的CY位//先移位,然互使用SCL控制發出去void Write_Byte(uchar date){ uchari,temp; temp=tada; for(i=0;i<8;i ) { temp=temp<<1; SCL=0; delay(); SDA=CY; delay(); SCL=1; delay(); } SCL=0; delay(); SDA=1; delay();}----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//定義臨時變量K,K左移一位後與SDA進行或運算,//依次把8個獨立地位放入一個字節中來接受完成void Read_Byte(){ uchari,k; SCL=0; delay(); SDA=1; for(i=0;i<8;i ) { SCL=1; delay(); k=(k<<1)|SDA; SCL=0; delay(); } delay(); returnk;}----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------底層驅動完成以後,我們需要對實際的芯片使用通訊協議來進行操作。目前大多的情況下一般比較受歡迎的是AT24cxx 系列。AT24Cxx系列主要有: 以下系列:
以下僅以AT24C02為例來進行說明:AT24C02芯片地址為:1010,其控制字格式如下:
其中A2,A1,A0為可編程選擇地址,此處A2,A1,A0均接地,即000,因此發送寫信号的尋址字節為:10100000,即0XA0,因此發送讀信号的尋址字節為:10100001,即0XA1,
下圖為寫一個字節的數據格式,有圖可知道:向AT24C02中寫入一個字節的時候,需要:先發一個起始信号,再發一個字節的控制字,在發送一個字節的控制字地址,都得到應答信号後,再發送要存入的數據,最後發一個停止信号!So,一個字節的數據已經寫入AT24C02中,OK!下面是數據格式,如圖:
程序如下:-----------------------------------------------------------------------------------------------------------------------//任意地址,寫入數據void Write_Add(uchar address,uchar date){ Start(); Write_Byte(0xA0); Respons(); Write_Byte(address); Respons(); Write_Byte(date); Respons(); Stop}----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------下圖為讀一個字節的數據格式,其讀取一個字節的數據和寫入時候差不多,此處不再累贅,讀一字節數據格式如圖:
程序如下:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------//任意地址,讀出數據void Read_Add(uchar address){ uchardate; Start(); Write_Byte(0XA0); Respons(); Write_Byte(address); Respons(); Start(); Write_Byte(0XA1); Respons(); date=Read_Byte(); Stop(); returnbyte; }
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!