I2C协议层独特特征:
1. 通过从地址(Slave Address)区分不同的设备。
2. ACK信号体制,即通过ACK表示是否进行继续传输。
3.由SCL、SDA的四种关系,映射数据有效性、起始信号、结束信号。
STM的硬件I2C编程:
1. 通过初始化I2C结构体,配置硬件I2C(所有STM32设备都有的部分)
2.有特有的发送起始信号、结束信号,使能 ACK信号的相关库函数命令。不需要手动模拟GPIO,由硬件按协议层要求发送。
3. 有特有的事件检测(EV)库函数和宏定义。通过检测各种事件,达到数据传输的可靠性。
STM32 软件模拟I2C编程要点
1. 配置GPIO的时候,模式要选择开漏输出(GPIO_Mode_Out_OD):(STM32硬件编程I2C时,为复用开漏输出GPIO_Mode_AF_OD)
2. 编写I2C协议层函数时,特别注意接收数据函数的左移次数:
//I2C协议规定:发送数据以一个字节(8bit)为单位,不能多也不能少。 //接收时,一位一位传输,优先接收高位(MSB) //当SCL为0时,SDA数据可变化(此时数据无效),SCL为1时,SDA数据有效 uint8_t i2c_ReadByte(void) { uint8_t dat = 0; uint8_t i; for(i=0; i<8; i++) { dat <<= 1;//循环总共进行8次,但有效的左移(采集数据位后)应该为7次,此语句不能放在接收收据之后 SCL_1; i2c_Delay(); if(EEPROM_I2C_SDA_READ() == 0) { dat &= ~(1<<0); }else { dat |= (1<<0); }//dat <<= 1;不能放在这里
SCL_0;
i2c_Delay(); }
return dat; }
注:另外,发送数据函数的左移语句应该放在数据位采集之后。
标签:SCL,ACK,编程,STM32,GPIO,I2C From: https://www.cnblogs.com/FBsharl/p/17101391.html