1. 程式人生 > >解析I2C通訊協議

解析I2C通訊協議

一、I2C的概念

1. I2C匯流排是PHLIPS公司推出的一種序列匯流排,I2C匯流排只有兩根雙向訊號線。其中一根是資料線SDA,另一根是時鐘線SCL


2. 每個接到I2C總線上的器件都有唯一的地址。傳送資料到總線上的稱為傳送器,從總線上接收資料的器件稱為接收器。


每個I2C總線上的器件的地址唯一,主機就是通過尋找唯一的地址來進行資料傳輸。當主機為傳送器的時候,器件接收資料,當主機為接收器的時候,器件傳送資料。

二、常用的序列擴充套件匯流排

  I2C(Inter Ic BUS)匯流排、單匯流排(1-WIRE BUS)、SPI(Serial Peripheral Interface)等。

三、I2C的六個訊號

1. 起始訊號

定義:SCL線為高電平期間,SDA線由高電平向低電平的變化。


void iic_start(void)
{
    SDA = 1;
    SCL = 1;
    delay_us(1);
    SDA = 0;
    delay_us(1);
    SCL = 0;
}
2. 終止訊號
定義:SCL線為高電平期間,SDA線由低電平向高電平的變化。


void iic_stop(void)
{
    SDA = 0;
    SCL = 1;
    delay_us(1);
    SDA = 1;
    delay_us(1);
    SCL = 0;
}
3. 寫資料訊號

I2C匯流排進行資料傳送時,時鐘訊號為高電平期間,資料線上的資料必須保持穩定,只有在時鐘線上的訊號為低電平期間,資料線上的高低電平狀態才允許變化。

bit iic_send_byte(unsigned char byte)
{
    unsigned char i;
    
    for(i = 0; i < 8; i++)
    {
        SDA = byte & 0x80;
        SCL = 1;
        delay_us(1);
        SCL = 0;
        byte <<= 1;
    }
    
    SCL = 1;
    SDA = 1;
    delay_us(1);
    if(0 == SDA)
    {
        ack = 1;
    }
    else
    {
        ack = 0;
    }
    
    SCL = 0;
    return ack;
}
4. 讀資料訊號
I2C匯流排進行資料傳送時,時鐘訊號為高電平期間,資料線上的資料必須保持穩定,只有在時鐘線上的訊號為低電平期間,資料線上的高低電平狀態才允許變化。


unsigned char iic_rcv_byte(void)
{
    unsigned char i;
    unsigned char temp = 0;
    unsigned char a;
    
    SDA = 1;
    for(i = 0; i < 8; i++)
    {
        SCL = 0;
        delay_us(1);
        SCL = 1;
        if(SDA)
        {
            a = 0x01;
        }
        else
        {
            a = 0;
        }
        
        temp |= (a << (7 - i));
        delay_us(1);
    }
    
    SCL = 0;
    
    return temp;
}
5. 應答訊號
I2C匯流排協議規定,每傳送一個位元組資料,都要有一個應答訊號以確定資料傳送是否被對方接收。應答訊號由接收裝置產生,在SCL為高電平期間,接收裝置將SDA拉低為低電平,表示資料傳輸正確。


void iic_ack(void)
{
    SDA = 0;
    SCL = 1;
    delay_us(1);
    SCL = 0;
}
6. 非應答訊號

void iic_noack(void)
{
    SDA = 1;
    SCL = 1;
    delay_us(1);
    SCL = 0;
}