生活随笔
收集整理的這篇文章主要介紹了
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)容還不錯,歡迎將生活随笔 推薦給好友。