解析I2C通訊協議
阿新 • • 發佈:2019-01-28
一、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線由低電平向高電平的變化。
3. 寫資料訊號void iic_stop(void) { SDA = 0; SCL = 1; delay_us(1); SDA = 1; delay_us(1); SCL = 0; }
I2C匯流排進行資料傳送時,時鐘訊號為高電平期間,資料線上的資料必須保持穩定,只有在時鐘線上的訊號為低電平期間,資料線上的高低電平狀態才允許變化。
4. 讀資料訊號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; }
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;
}