RT-Thread 正点原子阿波罗STM32F429IGT6-软件IIC控制I/O扩展模块PCF8574T(踩坑)

发布时间 2023-06-27 15:19:36作者: 伽椰子真可爱

第一步:在RT-Thread Settings中打开I2C设备驱动,Ctrl + S 保存

 第二步:在 drivers -> board.h 中进行配置,取消 BSP_USING_I2C2 的注释,并根据说明定义好引脚;

 第三步:对引脚进行初始化,这里可使用CubeMX进行生成;

 第四步:根据设备名查找设备

 第五步:调用  rt_i2c_transfer  发送数据,源代码如下:

rt_uint8_t data = 0x01;
struct rt_i2c_msg iic2_msg = {0};
static struct rt_i2c_bus_device *iic2_bus = RT_NULL;     /* I2C总线设备句柄 */int main(void)
{
    MX_GPIO_Init();
    iic2_bus = (struct rt_i2c_bus_device *)rt_device_find(IIC2_DEV_NAME);while (1)
    {
        iic2_msg.addr  = 0x40 >> 1;
        iic2_msg.flags = RT_I2C_WR;
        iic2_msg.buf   = &data;
        iic2_msg.len   = 1;

        rt_i2c_transfer(iic2_bus, &iic2_msg, 1);
    }
   return RT_EOK;
}

坑点:

在进行I2C驱动时,首先参考了RT-Thread参考手册中的 “AHT10温湿度传感器示例”,但模仿示例去编写程序,I2C输出波形就是不对,PCF8574T设备地址为0x40,但是直接调用 rt_i2c_transfer 发出去变成了0x80; 经过Debug发现在文件 i2c-bit-ops.c的第360行,对地址左移了1位,因此导致i2c输出设备地址不对;波形输出如下:(黄色为SDA,蓝色为SCL)

 因此在填充设备地址时右移1位再发送,此时i2c输出波形终于正常了。 

 查阅数据手册,再结合阿波罗底板原理图,使用i2c发送0x01即可控制P0角输出高电平(蜂鸣器不叫),发送0x00蜂鸣器鸣叫;

 PCF8574T数据手册