STM32 的硬件 I2C 一直存在着一些问题,在使用的过程中容易出现死锁的现象。因此在大多数场合下,我们都会抛弃硬件 I2C,改用 GPIO 模拟的方式去实现。这里通过模拟 I2C 的时序去读写 AT24C02, 从而也能更为深刻的了解 I2C 的时序。 I2C 的时序产生代码如下 :
/* SCL 设置为高电平 */
void SetSCLHigh(void)
{
GPIO_SetBits(GPIO_I2C, I2C_SCL);
}
/* SCL 设置为低电平 */
void SetSCLLow(void)
{
GPIO_ResetBits(GPIO_I2C, I2C_SCL);
}
/* SDA 设置为高电平 */
void SetSDAHigh(void)
{
GPIO_SetBits(GPIO_I2C, I2C_SDA);
}
/* SDA 设置为低电平 */
void SetSDALow(void)
{
GPIO_ResetBits(GPIO_I2C, I2C_SDA);
}
/* 设置 SDA 为输出模式 */
void SetSDAOut(void)
{
/* 定义 GPIO 结构体 */
GPIO_InitTypeDef GPIO_InitStruct;
/* ----------------- I2C 管脚配置 ------------------ */
GPIO_InitStruct.GPIO_Pin = I2C_SDA;
GPIO_InitStruct.GPIO_Spe