日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32单片机初学者常用函数--I2C配置

發(fā)布時間:2024/3/24 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32单片机初学者常用函数--I2C配置 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

I2C的配置必須要按照其時序邏輯,首先先來了解I2C常見的幾種工作情況:
A、主機(jī)向從機(jī)發(fā)送數(shù)據(jù),數(shù)據(jù)傳輸方向在整個傳輸過程中不變:

B、主機(jī)在第一個字節(jié)后,立即從從機(jī)讀數(shù)據(jù):

C、在傳輸過程中,當(dāng)需要改變傳輸方向時,起始信號和從機(jī)地址都被重復(fù)產(chǎn)生一次,但兩次讀/寫方向位正好相反:

此外,I2C的時序如下圖所示:

接下來正式開始進(jìn)入I2C程序階段(I2C管腳配置、宏定義等假設(shè)已完成):
(1)I2C起始函數(shù)(嚴(yán)格按照上圖中起始信號的時序邏輯):
void IIC_Start(void)
{
IIC_SDA_OUT();//這里是I2C中數(shù)據(jù)信號輸出的配置模式,一般配置為推挽輸出

IIC_SDA_SET;//數(shù)據(jù)拉高 IIC_SCL_SET;//時鐘拉高 IIC_DelayUs(5); //延時5us,滿足起始信號剛開始時的大于4.7us的時序IIC_SDA_CLR; //START: when CLK is high,DATA change form high to low;數(shù)據(jù)拉低 IIC_DelayUs(5); //保證滿足至少大于4us的時序IIC_SCL_CLR; //鉗住I2C總線,準(zhǔn)備發(fā)送或者接收數(shù)據(jù);時鐘拉低

}

(2)I2C終止函數(shù)(嚴(yán)格按照上圖中終止信號的時序邏輯):
void IIC_Stop(void)
{
IIC_SDA_OUT();//同理,配置為推挽輸出

IIC_SCL_CLR;//時鐘拉低 IIC_SDA_CLR; //數(shù)據(jù)拉低;SCL在低電平期間,SDA變化無效IIC_SCL_SET;//時鐘拉高 IIC_DelayUs(5); //保持時間>4usIIC_SDA_SET; //STOP:when CLK is high DATA change form low to high IIC_DelayUs(5); //保持時間>4.7us

}

(3)I2C發(fā)送函數(shù):
void IIC_SendData(uint8_t dat)
{
uint8_t i;

IIC_SDA_OUT(); IIC_SCL_CLR;for(i=0; i<8; i++) //要發(fā)送8位,從最高位開始 {if((dat & 0x80) == 0x80){IIC_SDA_SET;}else{IIC_SDA_CLR;}dat <<= 1;IIC_DelayUs(2);IIC_SCL_SET;IIC_DelayUs(5); //保持時間>4.7usIIC_SCL_CLR;IIC_DelayUs(2); }

}

(4)I2C接收函數(shù):
uint8_t IIC_ReceiveData(uint8_t ack)
{
uint8_t i, readValue;

IIC_SDA_OUT(); IIC_SDA_SET; IIC_SDA_IN(); IIC_SCL_CLR;for(i=0; i<8; i++) //接收8個字節(jié),從高到低 {IIC_SCL_SET;IIC_DelayUs(2);readValue <<= 1;if(IIC_SDA != 0){readValue |= 0x01;} IIC_DelayUs(1);IIC_SCL_CLR;IIC_DelayUs(5); }if(ack) //是否應(yīng)答,1:產(chǎn)生應(yīng)答;0:非應(yīng)答 {IIC_SendAck(); } else {IIC_NoAck(); }return readValue;//這里返回值即是讀取到的數(shù)據(jù)

}

(5)I2C等待應(yīng)答函數(shù):
int8_t IIC_WaitAck(void)
{
uint32_t i;

IIC_SDA_IN(); IIC_SDA_SET; IIC_DelayUs(1); IIC_SCL_SET;while(IIC_SDA)//在SCL高電平的情況下,SDA產(chǎn)生一個下降沿 {i++;if(i > 0xFFFF){return 0xFF;} }IIC_SCL_CLR; IIC_DelayUs(2);return 0; //返回值為1:應(yīng)答成功;0:應(yīng)答失敗

}

(6)I2C發(fā)送應(yīng)答函數(shù):
static void IIC_SendAck(void)
{
IIC_SCL_CLR;
IIC_SDA_OUT();

IIC_SDA_CLR; IIC_DelayUs(2); IIC_SCL_SET; IIC_DelayUs(2); IIC_SCL_CLR;

}

(7)I2C無應(yīng)答函數(shù):
static void IIC_NoAck(void)
{
IIC_SCL_CLR;
IIC_SDA_OUT();

IIC_SDA_SET; IIC_DelayUs(2); IIC_SCL_SET; IIC_DelayUs(2); IIC_SCL_CLR;

}

總結(jié)

以上是生活随笔為你收集整理的STM32单片机初学者常用函数--I2C配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。