第一步:在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蜂鸣器鸣叫;
标签:RT,PCF8574T,i2c,Thread,iic2,bus,msg,rt From: https://www.cnblogs.com/jiayezi/p/17508947.html