I2C和SPI是MCU和板载芯片之间最常用的通讯方式,现在先介绍下I2C总线。I2C的基本原理也很简单,只需要两根线(时钟线SCL和信号线SDA)即可实现挂载在I2C总线上设备之间的相互通讯。I2C协议并未规定I2C总线上哪个是主机?哪个是从机?,即每个I2C节点设备都可以做主机发号施令,也可以作为从机服从指挥。但是一般情况下,我们习惯将MCU作为主机,将I2C总线上挂载的其它芯片当做从机。

RT-Thread中引入了I2C设备的设备驱动框架,该驱动框架提供了基于芯片GPIO进行模拟的和基于芯片片内I2C外设实现的两种底层硬件接口。因为不同系列芯片的片内I2C外设使用会有所差异,因此常用GPIO模拟的方式实现I2C通讯。

RT-Thread 提供了一套 I/O 设备管理框架,它把 I/O 设备分成了三层进行处理:应用层、I/O 设备管理层、底层驱动。I/O 设备管理框架给上层应用提供了统一的设备操作接口和 I2C 设备驱动接口,给下层提供的是底层驱动接口。应用程序通过 I/O 设备模块提供的标准接口访问底层设备,底层设备的变更不会对上层应用产生影响,这种方式使得应用程序具有很好的可移植性,应用程序可以很方便的从一个 MCU 移植到另外一个 MCU。

使用正点原子的潘多拉开发板的例程07_driver_temp_humi进行说明:

在drv_i2c.c文件中使用INIT_BOARD_EXPORT(hw_i2c_init);即RT-Thread中的自动化初始机制,经过层层调用,最终使用rt_device_register()函数将I2C总线注册至I/O设备管理器。函数调用的顺序如下:

hw_i2c_init(【drv_i2c.c】)--->rt_i2c_bit_add_bus(【i2c-bit-ops.c】)--->rt_i2c_bus_device_register(【i2c_core.c】)--->rt_i2c_bus_device_device_init(【i2c_dev.c】)--->rt_device_register(【device.c】)

【drv_i2c.c】:设置I2C总线名称、I2C总线具体操作的引脚、初始化I2C引脚、定义STM32对I2C引脚电平读和写的函数、定义STM32中uS级延时函数、使用hw_i2c_init函数将这些设置的内容传入系统

  • stm32_i2c_gpio_init
  • stm32_set_sda
  • stm32_set_scl_s
  • stm32_set_scl
  • stm32_get_sda
  • stm32_get_scl_s
  • stm32_get_scl
  • stm32_udelay
  • stm32_i2c_bus_unlock
  • hw_i2c_init

【i2c-bit-ops.c】:通过对drv_i2c.c文件中提供的对引脚电平操作函数的封装实现i2c中的起始信号、终止信号、数据传输等函数,最后调用rt_i2c_bit_add_bus函数将数据传输函数传入

  • i2c_delay
  • i2c_delay2
  • SCL_H
  • i2c_start
  • i2c_restart
  • i2c_stop
  • i2c_waitack
  • i2c_writeb
  • i2c_readb
  • i2c_send_bytes
  • i2c_send_ack_or_nack
  • i2c_recv_bytes
  • i2c_send_address
  • i2c_bit_send_address4
  • i2c_bit_xfer
  • rt_i2c_bit_add_bus

【i2c_core.c】:实现i2c总线设备的注册、查找和数据传输函数

  • rt_i2c_bus_device_register
  • rt_i2c_bus_device_find
  • rt_i2c_transfer
  • rt_i2c_master_send
  • rt_i2c_master_recv
  • rt_i2c_core_init

【i2c_dev.c】:实现i2c_bus_device_read、i2c_bus_device_write、i2c_bus_device_control等I2C中的通用控制函数,通过rt_i2c_bus_device_device_init调用rt_device_register函数最终将I2C总线注册到I/O设备管理器中

  • i2c_bus_device_read
  • i2c_bus_device_write
  • i2c_bus_device_control
  • rt_i2c_bus_device_device_init

RT-Thread I2C设备驱动框架的对接使用相关推荐

  1. platform框架--Linux MISC杂项框架--Linux INPUT子系统框架--串行集成电路总线I2C设备驱动框架--串行外设接口SPI 设备驱动框架---通用异步收发器UART驱动框架

    platform框架 input. pinctrl. gpio 子系统都是 Linux 内核针对某一类设备而创建的框架, input子系统是管理输入的子系统 pinctrl 子系统重点是设置 PIN( ...

  2. 从零开始学习linux的I2C设备驱动框架——写一个简单的SHT20驱动

    目录 0.测试环境说明 1.设备树的修改 2.设备驱动框架 3.I2C数据传输过程 3.1 struct i2c_msg 3.2 SHT20的数据收发 4.I2C适配器超时等待时间的修改 本文资源 参 ...

  3. 使用RT-Thread Studio DIY 迷你桌面时钟(二)| 获取温湿度传感器数据(I2C设备驱动+SHT3x软件包)

    寻求更清爽的阅读体验,请移步:Mculover666的个人博客. 1. 项目进度 桌面Mini时钟项目用来演示如何使用RT-Thread Stduio开发项目,整个项目的架构如下: 在上一篇博文中简单 ...

  4. 使用RT-Thread Studio DIY 迷你桌面时钟| 获取温湿度传感器数据(I2C设备驱动+SHT3x软件包)...

    1. 项目进度 桌面Mini时钟项目用来演示如何使用RT-Thread Stduio开发项目,整个项目的架构如下: 在上一篇博文中简单的介绍了RT-ThreadStudio一站式工具,基于STM32L ...

  5. linux pcie驱动框架_Linux设备驱动框架设计

    引子 Linux操作系统的一大优势就是支持数以万计的芯片设备,大大小小的芯片厂商工程师都在积极地向Linux kernel提交设备驱动代码.能让这个目标得以实现,这背后隐藏着一个看不见的技术优势:Li ...

  6. linux下i2c设备驱动程序,Linux I2C 设备驱动

    I2C 设备驱动要使用 i2c_driver 和 i2c_client 数据结构并填充其中的成员函数.i2c_client 一般被包含在设备的私有信息结构体yyy_data 中,而 i2c_drive ...

  7. Linux总线设备驱动框架的理解(非常棒的文章!)

    以下内容源于微信公众号:嵌入式企鹅圈.有格式内容上的修改,如有侵权,请告知删除. Linux的设备驱动框架,即某类设备对应的驱动的框架. 这里是"Linux总线设备驱动框架",应该 ...

  8. Linux I2C设备驱动编写(二)

    I2C对外API I2C client的注册 i2c_register_board_info具体实现 i2c_new_device I2C driver 关于I2C设备驱动的小总结 I2C adapt ...

  9. Linux 设备驱动篇之I2c设备驱动

    ******************************************************************************************** 装载声明:希望 ...

最新文章

  1. java 返回值判断_在Java中判断方法重载的条件除了参数外,还可以通过返回值类型判断。_学小易找答案...
  2. bat比较有意思的代码_腾讯开源的 Unity全系列 代码逻辑热修复方案--InjectFix
  3. 在子线程中创建新的窗体,遇到的问题。
  4. 贝壳app Authorization参数分析
  5. 大数据集群部署时ssh的公钥和似钥作用汇总
  6. 耳机不分主从是什么意思_无延时音质好的蓝牙耳机能代替有线耳机吗—DOSS T60上手体验...
  7. 复数可以阐释的如此优雅
  8. OpenCV中直方图的计算和绘制
  9. 哈佛大学推荐:让自己变幸福的20件小事(值得收藏)
  10. html几个数据包,报文和数据包的区别
  11. 路由器与交换机怎么插线_网络设备:中继器、集线器、网桥、交换机、路由器、网关的超全总结!...
  12. JAVA计算机毕业设计疫情监测管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  13. Linux驱动之Kconfig语法——学习笔记(11)
  14. Excel表格不能插入行解决方案
  15. 矿物质电缆的优点与应用场所
  16. 计算机网络-自顶向下方法 读书笔记
  17. linux docker 软路由,OpenWrt软路由使用docker安装jellyfin影音中心
  18. Java swing简易浏览器(其二)前进后退与收藏夹实现
  19. 【弄nèng - SpringCloud】应用篇 —— 整合Zipkin【Finchley版】
  20. Push failed: Unable to access ‘https://github.com........

热门文章

  1. aix 7 oracle 10g,在64位aix上安装oracle10g
  2. idea创建springboot项目出现的问题
  3. Netty心跳机制-长连接
  4. 4、jeecg 笔记之 自定义显示按钮 (exp 属性)
  5. outerDocument访问外部属性方法
  6. mysql用户和权限备份_备份MySQL用户和权限
  7. 【js监听报错】页面监听js报错问题
  8. RabbitMQ/pika模块
  9. [UE4]更新UI的三种方式
  10. [poj3321]Apple Tree_dfs序_树状数组