1.實現過程說明
利用兩個GPIO來模擬IIC總線,一跟用來模擬時鐘SCL輸出,而另一根用來模擬數據線SDA,通過時鐘線產生的時序來傳輸(讀or寫)數據。
IIC總線的寫數據過程:
1. 傳輸開始信號啓動從機
2. 傳輸8位的從機地址(slave ID)
3. 從機應答信號(0:應答(ACK);1:無應答)
4. 寫從機寄存器地址
5. 從機應答信號
6. 寫一個字節數據
7. 從機應答信號
8. 傳輸停止信號(設備停止)
9. 延時1ms左右(是必要的,因爲設備關閉需要一定的時間,否則下一次啓動會發生錯誤)
IIC總線的讀數據過程:
1. 傳輸開始信號啓動從機
2. 傳輸8位的從機地址(slave ID)
3. 寫從機寄存器地址
4. 從機停止
5. 重新啓動從機
6. 傳輸8位的從機地址與讀信號(slave ID|0x01)
7. 讀數據(8位數據無應答,16位數據傳輸前8位後主機要應答一次)
8. 從機停止
9. 延時1ms左右(是必要的,因爲設備關閉需要一定的時間,否則下一次啓動會發生錯誤)
(從及地址最低位爲本次數據傳輸的方向:0爲寫,1爲讀)
在每次數據傳輸的時候都需要發送啓動信號和停止信號!
2.開始結束條件實現
開始條件和結束條件
開始條件代碼:結束條件代碼:
{
IIC_GPIO_SDA_CFG_OUTPUT;
IIC_SDA_HIGH;
IIC_SCL_HIGH;
//SCL must >4.7us
IIC_Wait(5);
IIC_SDA_LOW;
IIC_Wait(5);
IIC _SCL_LOW;
return 0;
}
{
IIC_GPIO_SDA_CFG_OUTPUT;
IIC_SDA_LOW;
IIC_Wait(5);
IIC_SCL_HIGH;
//SCL must >4.7us
IIC_Wait(5);
IIC_SDA_HIGH;
return 0;
}
由於初始化的時候我們將模擬SCL的GPIO初始化爲輸出,而對SDA的GPIO不進行初始化,根據操作來設置SDA的方向。
其中IIC的延時根據你的當前系統時鐘等需要重新的調試。
3.IIC讀寫顯示
寫字節的代碼如下,真正的實現可以在對本文檔中的函數進行再封裝!
{
uint32 bit;
int Status;
IIC_GPIO_SDA_CFG_OUTPUT;
IIC_Wait(1);
for(bit=0;bit<8;bit++)
{
//we start write the data, now we write high bit
if((data<<bit)&0x80)
{
IIC_SDA_HIGH;
}
else
{
IIC_SDA_LOW;
}
// we must delay //then we may debug ok
IIC_Wait (5);
IIC_SCL_HIGH;
IIC_Wait (5);
IIC_SCL_LOW;
}
//the following receiver ack signed
IIC_GPIO_SDA_CFG_INPUT;
IIC_Wait(1);
IIC_SCL_HIGH;
IIC_Wait(1);
if(IIC_SDA_VALUE&0x0100)
{
Status = -1;
}
else
{
Status = 0;
}
IIC_Wait(2);
IIC_SCL_LOW;
return Status;
}
讀字節的代碼:附上8位數據傳輸序列圖:
{
uint32 bit;
int Status = 0;
*data=0;
IIC_SCL_LOW;
IIC_GPIO_SDA_CFG_INPUT;
IIc_Delay(50);
for(bit=0; bit<8; bit++)
{
IIC_Wait(5);
//set clock is high
IIC_SCL_HIGH;
//then clock is high get data for IIC
IIC_Wait(1);
(*data) = (*data)<<1;
if (IIC_SDA_VALUE&0x100)
{
(*data)=(*data) + 1;
}
IIC_Wait(4);
IIC_SCL_LOW;
}
return Status;
}
8-Bit Write Sequence:
8-Bit Read Sequence:
做了已經半年多了,因此有很多東西都記不清了,希望這次能夠簡單的總結一下!