RTThread 上设备IIC驱动移植与实践

RTThread 上设备IIC驱动移植与实践
趟过前面RTThread在GD32E230CotexM23上的坑之后,继续进行了RTThread端设备驱动的验证测试,IIC作为很多设备之间通信的基础通信方式,起使用程度和普及程度基本也算是很多MCU的标配,即使没有硬件IIC,用软件对GPIO口也可以模拟出软件方面的IIC,自然GD32E230作为ARMv8架构的CotexM23系列的芯片,硬件IIC还是有的,而且SDK里面也留了完整的例程,可以根据实际需求去使用。当然本文不是想使用裸机上的IIC驱动,而是RTThread RTOS上的IIC驱动,这里我们还是先来看看RTThread上外设驱动的结构,参考的官方文档。

其他的细节还是参考官方文档,以下是官方链接,
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/device
1, RTThread移植IIC到CotexM23中
工程文件
芯片软件IIC、硬件IIC选取


 
芯片硬件端使用函数

RTThread端驱动层

IIC数据传输里面比较关键的函数

处理好上面的相关内容后,还有一些宏的使用,以及硬件IIC使用的是那些IO口,然后跟裸机一样的情形,需要回到对硬件的一些初始化操作。要在RTThread上用上驱动框架的东西,实际上就是要中间使用一个过渡层,原来操作硬件使用直接操作寄存器,RTThread上处理直接操作寄存器,还需要对相应的读写等函数进行封装,供应用层直接使用,所以实际上较裸机程序多了很多内容,但是这个好处也是有的,可以将系统和硬件进行隔离。移植完上面开始进行EEPROM的操作实践
2, RTThread IIC驱动EEPROM
多的不用说,看写EEPROM寄存器

接下来看看读寄存器

读写EEPROM内容

这里有一些细节说明,根据IIC的操作时序,给寄存器写值之前,首先需要写入寄存器的地址,因此msg.buf 中需要包含寄存器的地址,和后续写入的值,如要写入EEPROM前面0-15寄存器的值,定义的msg.buf的长度为17个字节,读的过程直接将写地址和读寄存器分开写,这样更清晰,主要是根据IIC的操作时序,多字节读写等相关内容,具体的也可以百度查找。

3, RTThread IIC驱动EEPROM实践2
同样的首先看读写寄存器函数


读写EEPROM内容

运行结果如下图

这两者之间只是函数使用的不同,然后操作的细节可能不一样,但是还是前面一种更符合RTThread系统上使用的IIC驱动。
4, RTThread IIC总结
完成以上的移植和EEPROM上面的实践,下一步运用到实际项目中IIC驱动气压芯片,由于芯片、传感器紧张,打算使用多种气压传感器,以作备胎,呵呵!文章纯属个人意见,如有不妥之处请指正,谢谢!文章最后附上此次移植、实践工程代码。  GD32E23x_Demo_RTT_IIC.rar (1.5 MB, 下载次数: 29)

---------------------
作者:yanzhengxin1
链接:https://bbs.21ic.com/icview-3164238-1-1.html
来源:21ic.com
此文章来自于21ic网站,著作权归21ic所有,未经允许禁止转载。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 RT-Thread 中配置 I2C,你需要按照以下步骤进行: 1. 打开 RT-Thread 的包管理器,选择 I2C 驱动并安装。 2. 在 RT-Thread 的配置文件中启用 I2C 驱动。 3. 在设备树中配置 I2C 设备节点。例如,在 STM32F4xx 设备上,设备树中的 I2C 节点可以如下所示: ``` i2c1 { status = "okay"; pinctrl-0 = <&i2c1_pins>; clock-frequency = <100000>; sda-gpios = <&gpioa 9 GPIO_PIN_9 GPIO_PULLUP>; scl-gpios = <&gpioa 8 GPIO_PIN_8 GPIO_PULLUP>; }; ``` 4. 在应用程序中使用 I2C 驱动。以下是一个简单的示例,演示如何在 RT-Thread 中使用 I2C 驱动读取数据: ``` #include <rtthread.h> #include <rtdevice.h> #define I2C_BUS_NAME "i2c1" #define I2C_SLAVE_ADDRESS 0x50 int i2c_master_read(rt_uint8_t *read_buf, rt_size_t read_size) { rt_device_t i2c_bus = RT_NULL; struct rt_i2c_msg msgs[1]; struct rt_i2c_bus_device *i2c_bus_device = RT_NULL; int result = -RT_ERROR; i2c_bus = rt_device_find(I2C_BUS_NAME); if (!i2c_bus) { rt_kprintf("I2C bus %s not found!\n", I2C_BUS_NAME); goto __exit; } i2c_bus_device = (struct rt_i2c_bus_device *)i2c_bus->user_data; if (!i2c_bus_device) { rt_kprintf("I2C bus device not found!\n"); goto __exit; } msgs[0].addr = I2C_SLAVE_ADDRESS; msgs[0].flags = RT_I2C_RD; msgs[0].buf = read_buf; msgs[0].len = read_size; result = rt_i2c_transfer(i2c_bus_device->bus, msgs, 1); if (result != 1) { rt_kprintf("I2C read failed! Result: %d\n", result); } __exit: return result; } ``` 这个函数将从一个 I2C 从设备上读取指定数量的字节,并将它们存储在一个缓冲区中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值