在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
原作者:weixin_43885532