外贸网站如何推广,电子商务网站建设与实践考试,建做网站,用自己电脑建设网站I2C和SPI是MCU和板载芯片之间最常用的通讯方式#xff0c;现在先介绍下I2C总线。I2C的基本原理也很简单#xff0c;只需要两根线#xff08;时钟线SCL和信号线SDA#xff09;即可实现挂载在I2C总线上设备之间的相互通讯。I2C协议并未规定I2C总线上哪个是主机#xff1f;哪…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_initstm32_set_sdastm32_set_scl_sstm32_set_sclstm32_get_sdastm32_get_scl_sstm32_get_sclstm32_udelaystm32_i2c_bus_unlockhw_i2c_init
【i2c-bit-ops.c】通过对drv_i2c.c文件中提供的对引脚电平操作函数的封装实现i2c中的起始信号、终止信号、数据传输等函数最后调用rt_i2c_bit_add_bus函数将数据传输函数传入
i2c_delayi2c_delay2SCL_Hi2c_starti2c_restarti2c_stopi2c_waitacki2c_writebi2c_readbi2c_send_bytesi2c_send_ack_or_nacki2c_recv_bytesi2c_send_addressi2c_bit_send_address4i2c_bit_xferrt_i2c_bit_add_bus
【i2c_core.c】实现i2c总线设备的注册、查找和数据传输函数
rt_i2c_bus_device_registerrt_i2c_bus_device_findrt_i2c_transferrt_i2c_master_sendrt_i2c_master_recvrt_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_readi2c_bus_device_writei2c_bus_device_controlrt_i2c_bus_device_device_init