IIC簡單實現!

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.開始結束條件實現

開始條件和結束條件

開始條件代碼:結束條件代碼:

int IIC_Start(void)
{
    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
;
}

 

int IIC_Stop(void)
{
    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;
}

     

由於初始化的時候我們將模擬SCLGPIO初始化爲輸出,而對SDAGPIO不進行初始化,根據操作來設置SDA的方向。

    其中IIC的延時根據你的當前系統時鐘等需要重新的調試。

3IIC讀寫顯示

   寫字節的代碼如下,真正的實現可以在對本文檔中的函數進行再封裝!

int IIC_WriteByte(uint8 data)
{
    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位數據傳輸序列圖:

int IIC_ReadByte(uint8 *data)
{
    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:

   做了已經半年多了,因此有很多東西都記不清了,希望這次能夠簡單的總結一下!

發佈了25 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章