Linux I2C 设备的基本结构
在Linux系统中,可以使用i2c-tools软件包提供的工具来操作I2C总线设备
查看i2c总线使用情况
i2cdetect -l
1、设备树
(1)I2C控制器的设备树
进入SOC芯片的顶层设备树目录 tegra210-soc-base.dtsi。I2C控制器的描述,自己的设备需要挂载到这个设备树。
(2)对应驱动设备mpu6050的设备树
2、I2C总线驱动
(1)英伟达平台的I2C总线驱动类定义
(2)struct i2c_adapter结构体
(3)struct i2c_algorithm结构体
(4)匹配probe()
注册、分配空间、初始化
3、陀螺仪MPU6050
(1)硬件部分
在tegra210-p3448-0000-p3449-0000-b00.dts设备树i2c1总线节点下添加mpu6050节点
管脚复用默认已配置好
(2)struct i2c_client 结构体
(3)struct i2c_driver结构体
(4)驱动实现整体架构
4、编译 插入模块报错
分析:搜索"pio timed out addr"字符串,按照字意理解,初步判断是通讯超时
定位到drivers/i2c/busses/i2c-tegra.c文件的tegra_i2c_xfer_msg函数
问题排查思路:
(1)查看I2C设备情况
ls /sys/bus/i2c/devices
解释:i2c-0 ~ i2c-8 对应SOC里 9个 I2C控制器
0-0068:标识i2c-0 adapter上的从机地址为0x68的i2c设备 即为:mpu6050设备
(2)设备树虚拟文件系统
/sys/firmware/devicetree/base
base是一个虚拟文件系统目录,用于在 Linux 中表示设备树(Device Tree)。设备树是一种描述硬件平台信息和设备连接关系的数据结构,它在 Linux 中被广泛用于描述嵌入式系统的硬件架构和设备信息。
查看i2c节点信息,找到mpu6050对应生成的节点
(3)查看管脚复用情况
(4)最后发现是驱动程序中的读写函数有问题
定位到i2c_transfer中,最后一个参数传参出现问题,因为发送消息数量为1,但是ARRAY_SIZE(msg)为2,就可能导致发送消息为空,通讯超时。
将传入的参数修改为1,完美解决!
按照模块,编译运行应用程序,成功获取传感器数据
(5)i2c_transfer函数的上层到底层
5、OLED屏控制
oled型号为ssd1306,从机地址0111100 -> 0x3c,挂载在4-003c处。
6、小车马达控制
(1)硬件设备介绍
PCA9685 接收来自 Jetson 设备 I2C 总线的指令,然后驱动 TB6612 芯片按照 PWM 控制信号对两个 TT 电机,透过改变电流大小去调整电机转速与方向,来执行 Jetbot 小车的移动。
PCA9685
:是NXP推出,一款基于IIC总线通信的12位精度16通道PWM波输出的芯片,一边与主控通过 I2C 总线通信,另一边连接 TB6612 马达驱动芯片。
TB6612
:用pwm控制的电机驱动芯片,可控制2个电机(停止 正传 反转)
//STBY: 使能端口,高电平有效
//PWM 电机提供pwm脉冲。
//IN1 IN2 00:停止 01:正转 10:反转
//O1 O2 输出接电机
TT电机
:直流减速电机TT马达。改变 O1、O2 极性可正传 反转, pwm调节输出电压值,可控制转速。马达速度差来实现转弯, 故没有方向盘的舵机
(2)设备树
(3)驱动
drivers/pwm/pwm-pca9685.c