hi3516 i2c i2cread
把SENSOR的I2C地址,及寄存器地址长度,数据长度搞清楚,先读写芯片型号
IMX178的I2C调试
参考IMX385手册,获取I2C Slave Address为0x34,Slave Address长度为8bit,Register Address长度为16比特,高位在前、低位在后
imx385 28页介绍芯片的IIC 地址为 0x34
SLAVE Address
MSB/LSB 0 0 1 1 0 1 0 R/W
写地址为: 0x34
读地址为: 0x35
直接参考下面两个测试的代码,想收发多少字节都可以做到,对于限定最大为2的地方也可以自行修改。
i2c_read
usage: i2c_read ~ # i2c_num:0x0, dev_addr:0x34; reg_addr:0x306e; reg_addr_end:0x306e; reg_width: 1; data_width: 1; reg_step: 1. 0x300a: 0x0 这里获取到错误的值, 因为地址长度是2,这里 reg_width却为 1; i2c_num:0x0, dev_addr:0x34; reg_addr:0x3010; reg_addr_end:0x3012; reg_width: 2; data_width: 1; reg_step: 1. 0x3010: 0x21 ~ # i2c_num:0x0, dev_addr:0x34; reg_addr:0x306e; reg_addr_end:0x3070; reg_width: 2; data_width: 2; reg_step: 2. 0x306e: 0x0 各位,由于项目需要在3516A上加AR0134 Sensor , 海思SDK5.0里面是没有提供AR0134 sensor驱动的,但是有相关类型的,所以我们参考谢了这个0134的驱动来调试。 请问各位,问题可能出现在什么地方呢?有什么好的方法或 建议不? 测试结果: *** Board tools : ver0.0.1_20121120 *** do errro I2C 读写命令示例 a. 在控制台使用 i2c_read 命令对 I2C 外围设备进行读操作: i2c_num: I2C 控制器序号(对应《 Hi3516A 专业型 HD IP Camera Soc 用户指南》中的 I2C 控制器 0、 1、 2) b. 在控制台使用 i2c_write 命令对 I2C 外围设备进行写操作: i2c_num: I2C 控制器编号(对应《 Hi3516A 专业型 HD IP Camera Soc 用户指南》中的 I2C 控制器 0、 1、 2) SPI 读写命令示例 说明: spi_num: SPI 控制器号(对应《 Hi3516A 专业型 HD IP Camera Soc 用户指南》中的 SPI 控制器0、 1) 在控制台使用 spi_write 命令对 SPI 外围设备进行写操作: 说明: spi_num: SPI 控制器序号(对应《 Hi3516A 专业型 HD IP Camera Soc 用户指南》中的 SPI 控制器 0、 1) 参看:外围设备驱动 操作指南 一、首先下载安装包: i2c-tools-3.0.1 linux上调试i2c的工具 源码 二、解压安装 1、解压tar -zxvf i2c-tools-3.0.1.tar.gz 2、修改Makefile 将 CC := gcc 3、修改vi tools/i2cdetect.c 否则会出现: Error: Can't use SMBus Read Byte command on this bus (ISA bus?) Error: Can't use SMBus Read Byte command on this bus (ISA bus?) 其实不用修改,因为没有用到I2C才会出现上述问题的。 4、编译完成后在tools/文件夹下会有如下几个可执行文件,i2cdetect, i2cdump, i2cget, i2cset,将其拷贝到开发板/usr/sbin目录下。 三、使用方法 四、参看外围设备驱动 操作指南 Hi3516A根文件系统中是有I2C操作工具的。 具体操作指南,参看外围设备驱动 操作指南:I2C/SPI操作指南 0x1 0x56 0x0 0x10 2 2.
0x1 0x56 0x0 0x10 2 2 2.
0x1 0x56 0x0 0x10. default reg_width, data_width, reg_step is 1.
一、默认读 地址为 0x3010 1个长度
i2c_read 0x0 0x35 0x300a
[END]
~ #读取 0x3010-0x3012地址的数据 地址长度为2字节 数据占1字节
i2c_read 0x0 0x35 0x3010 0x3012 2 1
*** Board tools : ver0.0.1_20121120 ***
0x3011: 0x2
0x3012: 0x64二、读取两个长度
i2c_read 0x0 0x35 0x306e 0x3070 2 2 2
0x3070: 0x211
[END]
AR0134Sensor 板是一个新做的板,所以首先验证I2C是否通,海思有I2c读写工具i2c_read / i2c_write。现通过这个读写工具来验证.
问题是: 1、通过i2c_read 读的时候,默认能读出1个长度,但是读2个长度就报错。
2、如何有效地调试这个i2c?
备注:i2c_read 命令的解释
~ # i2c_read
usage: i2c_read
i2c_read 0x1 0x56 0x0 0x10 2 2.
i2c_read 0x1 0x56 0x0 0x10 2 2 2.
i2c_read 0x1 0x56 0x0 0x10. default reg_width, data_width, reg_step is 1.
[END]
~
此操作示例通过 I2C 读写命令实现对 I2C 外围设备的读写操作。
~ $ i2c_read
例如读挂载在 I2C 控制器 2 上的 sil9024 设备的 0x8 寄存器:
~ $ i2c_read 2 0x72 0x8 0x8 0x1 0x1
说明:
device_addr:外围设备地址( Hi3516A 只支持 7bit 设备地址)
reg_addr:读外围设备寄存器操作的开始地址
end_reg_addr:读外围设备寄存器操作的结束地址
reg_width:外围设备的寄存器位宽( Hi3516A 支持 8/16bit)
data_width:外围设备的数据位宽( Hi3516A 支持 8/16bit)
reg_step:连续读外围设备寄存器操作时递增幅值,默认为 1,即连续读寄存器,读取单个寄存器时不使用该参数
~ $ i2c_write
例如向挂载在 I2C 控制器 2 上的 sil9024 设备的 0x8 寄存器写入数据 0xa5:
~ $ i2c_write 2 0x72 0x8 0xa5 0x1 0x1
说明:
device_addr:外围设备地址( Hi3516A 的 I2C 控制器只支持 7bit 设备地址)
reg_addr:写外围设备寄存器操作的地址
value:写外围设备寄存器操作的数据
reg_width:外围设备的寄存器位宽( Hi3516A 的 I2C 控制器支持 8/16bit)
data_width:外围设备的数据位宽( Hi3516A 的 I2C 控制器支持 8/16bit)
此操作示例通过 SPI 读写命令实现对 SPI 外围设备的读写操作。
在控制台使用 spi_read 命令对 SPI 外围设备进行读操作:
~ $ ssp_read
其中[num_reg] 可以省略,缺省值是 1(表示读 1 个寄存器)。[dev_width] [reg_width] [data_width]可以省略,缺省值都是1(表示1Byte)。
例如读挂载在 SPI 控制器 0 片选 0 上设备地址为 0x2 的设备的 0x0 寄存器:
~ $ ssp_read 0x0 0x0 0x2 0x0 0x10 0x1 0x1 0x1
csn:片选号( Hi3516A 的 SPI 控制器 0 有 1 个片选、控制器 1 有 3 个片选)
dev_addr:外围设备地址
reg_addr:外围设备寄存器开始地址
num_reg:读外围设备寄存器个数
dev_width:外围设备地址位宽(支持 8 位)
reg_width:外围设备寄存器地址位宽(支持 8 位)
data_width:外围设备的数据位宽(支持 8 位)
~ $ ssp_write
其中[dev_width] [reg_width] [data_width]可以省略,缺省值都是 1(表示 1Byte)。
例如向挂载在 SPI 控制器 0 片选 0 上设备地址为 0x2 的设备的 0x0 寄存器写入数据 0x65:
~ $ ssp_write 0x0 0x0 0x2 0x0 0x65 0x1 0x1 0x1
csn:片选号( Hi3516A 的 SPI 控制器 0 有 1 个片选、控制器 1 有 3 个片选)
dev_addr:外围设备地址
reg_addr:外围设备寄存器地址
data:写外围设备寄存器的数据
dev_width:外围设备地址位宽(支持 8 位)
reg_width:外围设备寄存器地址位宽(支持 8 位)
data_width:外围设备的数据位宽(支持 8 位)
此 SPI 读写命令仅支持 sensor 的读写操作。
修改为CC := arm-hisiv300-linux-gcc308 #if 0
309 if (mode != MODE_READ && !(funcs & I2C_FUNC_SMBUS_QUICK)) {
310 fprintf(stderr, "Error: Can't use SMBus Quick Write command "
311 "on this bus (ISA bus?)\n");
312 close(file);
313 exit(1);
314 }
315 if (mode != MODE_QUICK && !(funcs & I2C_FUNC_SMBUS_READ_BYTE)) {
316 fprintf(stderr, "Error: Can't use SMBus Read Byte command "
317 "on this bus (ISA bus?)\n");
318 close(file);
319 exit(1);
320 }
321 #endif