STM32F4-------I2C通信
I2C:兩線式串行總線,是由資料線SDA和時鐘線SCL構成的串行總線,是一種半雙工通信方式,
資料線SDA有時需要用做輸入,有時需用做輸出,需要通過MODER暫存器進行配置;
#define SDA_IN() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<9*2;}
#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;}
#define IIC_SCL PBout(8) //SCL
#define IIC_SDA PBout(9) //SDA輸出
#define READ_SDA PBin(9) //SDA輸入
I2C協議
- 空閑狀態;
- 起始信號和停止信號;
- 應答信號ACK;
- 資料的有效性;
- 資料傳輸;
1.空閑狀態
資料線SDA和時鐘線SCL同時處于高電平時,為I2C總線的空閑狀態,
IIC_SDA = 1;
IIC_SCL = 1;
2.起始信號和停止信號
起始信號:在時鐘線SCL為高電平時,資料線SDA由高跳變至低;
停止信號:在時鐘線SCL為高電平時,資料線SDA由低跳變至高;
這兩種信號是一種電平跳變時序信號,而不是一個電平信號,

//起始信號
void IIC_Start(void)
{
SDA_OUT();
IIC_SDA = 1;
IIC_SCL = 1;
delay_us(4);
IIC_SDA = 0;
delay_us(4);
IIC_SCL = 0;
}
//停止信號
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;
delay_us(4);
}
3.應答信號ACK
發送器每發送一個位元組,就在時鐘脈沖9期間釋放資料線,由接收器反饋一個應答信號,
應答信號為低電平時,為有效應答位(ACK);應答信號為高電平時,為非應答位(NACK),一般表示接收器接收該位元組沒有成功,
有效應答位(ACK):接收器在第9個時鐘脈沖前的低電平期間將資料線SDA拉低,并且要保證在該時鐘高電平期間資料線SDA為穩定的低電平,

//產生應答信號
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//不產生應答信號
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//等待應答信號,回傳1為接收應答成功,回傳0為接收應答失敗
u8 IIC_Wait_Ack(void)
{
u8 ucErrTim=0;
SDA_IN();
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTim++;
if(ucErrTim>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;
return 0;
}
4.資料的有效性
使用I2C總線進行資料傳輸時,時鐘線SCL為高電平期間,資料線SDA上的資料必須保持穩定,在時鐘線上的信號轉為低電平時,資料線上的高電平或低電平狀態才允許變化,

5.資料傳輸
逐位地串行發送資料,從高位開始發送,每一位資料都有一個時鐘脈沖相對應,
//資料發送
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;
for(t=0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
}
//資料讀取
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(1);
}
if (!ack)
IIC_NAck();
else
IIC_Ack();
return receive;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274811.html
標籤:其他
