??IIC協議在Dock看來是最簡單易懂的協議之一。本文介紹IIC協議的基礎要點。
image.png
1.IIC基礎要點
- 在時鐘的高電平周期內,SDA線上的數據必須保持穩定,數據線僅可以在時鐘SCL為低電平時改變。
image.png
- 起始條件:當SCL為高電平的時候,SDA線上由高到低的跳變被定義為起始條件
- 結束條件:當SCL為高電平的時候,SDA線上由低到高的跳變被定義為停止條件
image.png
- 每當主機向從機發送完一個字節的數據,主機總是需要等待從機給出一個應答信號,以確認從機是否成功接收到了數據,從機應答主機所需要的時鐘仍是主機提供的,應答出現在每一次主機完成8個數據位傳輸后緊跟著的時鐘周期,低電平0表示應答,1表示非應答。
image.png
2 IIC的C實現
- 初始時SDA、SCL都處于高電平
void Init()
{
SCL = 1;
delay();
SDA = 1;
delay();
}
- 起始信號 SDA在SCL為高電平時產生下降沿:
void StartUp
{
SCL = 1;
SDA = 1;
delay();
SDA = 0;
delay();
}
- 結束信號 SDA在SCL為高電平時產生上升沿:
void End()
{
SCL = 1;
SDA = 0;
delay();
SDA = 1;
delay();
}
- 字節發送函數 SCL為低時SDA變為有效數據,SCL為高時,采集數據
void Transfer(int8_t i8Send)
{
int32_t nIndex = 0;
for(nIndex = 7; nIndex >= 0; nIndex++)
{
SCL = 0;
SDA = (i8Send >> nIndex) & 0x01; //MSB方式進行發送
delay();
SCL = 1; //變為高電平,SLAVE短進行數據鎖存
delay();
}
}
- 判斷回復報文 Slave端主動拉低SDA
int8_t CheckAck()
{
delay();
if(SDA == 0)
{
return 1;
}
else
{
return 0;
}
}