STM32的IIC应用详解1
概要
IIC(IIC,inter-Integrated circuit),兩線式串行總線,用于MCU和外設間的通信。?
IIC只需兩根線:數據線SDA和時鐘線SCL。以半雙工方式實現MCU和外設之間數據傳輸,速度可達400kbps。
多主機I2C總線結構
注意SDA和SCL兩根總線需要上拉,使總線處于空閑狀態。
IIC協議
空閑狀態
協議規定,SDA和SCL同時為高電平時,總線處于空閑狀態。上拉電阻保證電平處于高電平。
起始信號和停止信號
起始信號:SCL為高電平時,SDA電平發生高到低的跳變?
停止信號:SCL為高電平時,SDA電平發生低到高的跳變
應答信號
發送器每發送完一個字節(8個脈沖),在第9個脈沖間釋放總線,接收器返回一個ACK信號,協議規定,低電平為有效應答,高電平為無效應答。
數據有效性
協議對有效數據進行了規定:即時鐘信號為高電平期間,數據必須保持穩定,時鐘信號低電平期間,數據線上的電平才允許變化。也就是說,數據在時鐘信號到來前必須準備好,并保持到時鐘信號的下降沿之后。
數據傳輸
I2C為同步傳輸,時鐘控制數據位的傳輸,邊沿觸發。
驅動程序
直接引用實驗中的代碼。測試沒問題。
起始信號
//產生IIC起始信號 void IIC_Start(void) {SDA_OUT(); //sda線輸出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總線,準備發送或接收數據 }停止信號
//產生IIC停止信號 void IIC_Stop(void) {SDA_OUT();//sda線輸出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL=1; IIC_SDA=1;//發送I2C總線結束信號delay_us(4); }有效應答
//產生ACK應答 void IIC_Ack(void) {IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0; }無效應答
//不產生ACK應答 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發送一個字節 //返回從機有無應答 //1,有應答 //0,無應答 void IIC_Send_Byte(u8 txd) { u8 t; SDA_OUT(); IIC_SCL=0;//拉低時鐘開始數據傳輸for(t=0;t<8;t++){ IIC_SDA=(txd&0x80)>>7;txd<<=1; delay_us(2); //對TEA5767這三個延時都是必須的IIC_SCL=1;delay_us(2); IIC_SCL=0; delay_us(2);} }接收單字節
//讀1個字節,ack=1時,發送ACK,ack=0,發送nACK u8 IIC_Read_Byte(unsigned char ack) {unsigned char i,receive=0;SDA_IN();//SDA設置為輸入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();//發送nACKelseIIC_Ack(); //發送ACK return receive; }EEPROM
24C02為IIC接口,容量為256字節。
封裝如下圖:
管腳定義:
設備地址的高四位固定,中間為地址線定義的地址,最后一位為讀寫位。?
由于A0,A1,A2設置為0,所以?
讀的時候:Device Address = 0xA1;?
寫的時候:Device Address = 0xA0;
24C02字節寫時序
24C02字節讀時序
參考
STM32F3與 F4 系列 Cortex M4 內核編程手冊?
STM32F4xxx中文參考手冊?
STM32F4xxx英文參考手冊?
STM32F4 開發指南(寄存器版)
總結
以上是生活随笔為你收集整理的STM32的IIC应用详解1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32F030控制LED
- 下一篇: STM32的IIC应用详解2