USRP N310通过I2C读取TCA6408A I/O扩展器报No such device or address错误
问题描述
我有一个为USRP N310交叉编译的应用程序,借助TCA9548 I²C开关,使用Linux内置I2C驱动对子板上的TCA6408 I/O扩展器进行数据读写,开发过程参考了内核官方的用户空间I2C驱动开发教程。该功能在ZC706嵌入式平台上测试运行正常,但在USRP平台上读取数据时出现故障,我的代码如下:
#include "i2c_dev.hpp" int main() { int i2cfd; __s32 num; //Opening i2c adapter 6 printf("Opening bus adapter\n"); i2cfd = open("/dev/i2c-6", O_RDWR); if ( i2cfd <0 ) { printf("Failed to open /dev/i2c-6: %s\n",strerror( errno )); return (1); } //Instatiating three objects of IO_Expander class IO_Expander dba; //Reading data from the IO Expander printf("Setting slave address of device\n"); if (ioctl(i2cfd, I2C_SLAVE, 0x20) < 0) { printf("Error setting slave address:%s\n",strerror(errno)); return(1); } printf("Reading data from the IO Expander for DB-A Object\n"); num =dba.read_data(i2cfd, 0x00); if (num<0){ printf("Error reading data: %s\n",strerror(errno)); } else { printf("The input value is %d: \n", num); } printf("Leaving DB-A Object \n\n\n"); //Closing the adapter close(i2cfd); }
运行该应用程序时,尝试读取I/O扩展器数据阶段抛出错误字符串No such device or address。根据数据手册,设备的7位从站地址为010 0000(十六进制0x20),输入寄存器地址为0x00。目前我不清楚问题出在哪里,我是相关领域的新手,不知道下一步该如何排查。
故障排查解决方案
- 优先检查TCA9548 I2C开关的通道配置
USRP N310的子板I2C外设都是通过TCA9548开关挂载到主I2C总线的,这和你之前测试用的ZC706平台直接连接TCA6408的架构不同。访问TCA6408之前,你必须先向TCA9548的控制寄存器写入对应子板通道的掩码,打通上游I2C总线和下游子板的链路,否则直接访问下游设备肯定会报找不到设备的错误。 - 用系统工具验证设备链路
先交叉编译或者安装i2c-tools工具包到USRP的文件系统里,执行i2cdetect -y 6扫描/dev/i2c-6总线上的所有设备:- 如果能扫描到0x20的地址,说明硬件链路、开关配置都正常,问题出在软件读写逻辑
- 如果扫不到0x20,先排查TCA9548的地址配置、通道掩码是否正确,再检查硬件连接
- 检查
read_data函数的实现逻辑
你贴出的代码里没有展示IO_Expander类的read_data实现,标准的I2C寄存器读取流程是:先向从站写入要访问的寄存器地址(这里是0x00),再发起读操作。如果你直接调用read()系统调用读取设备,会因为没有指定寄存器地址导致访问错误。 - 兜底检查项
确认内核I2C驱动是否正常加载,USRP N310的设备树是否已经启用了I2C适配器6,不存在硬件复用冲突。
内容的提问来源于stack exchange,提问作者Tellrell White
相关产品推荐
相关产品推荐

