hi3516 i2c i2cread


原文链接: 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 . sample:

            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

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;
[END]
~ #

读取 0x3010-0x3012地址的数据 地址长度为2字节 数据占1字节

i2c_read 0x0 0x35 0x3010 0x3012 2 1
*** Board tools : ver0.0.1_20121120 ***

i2c_num:0x0, dev_addr:0x34; reg_addr:0x3010; reg_addr_end:0x3012; reg_width: 2; data_width: 1; reg_step: 1.

0x3010: 0x21
0x3011: 0x2
0x3012: 0x64

二、读取两个长度

~ # i2c_read 0x0 0x35 0x306e 0x3070 2 2 2

i2c_num:0x0, dev_addr:0x34; reg_addr:0x306e; reg_addr_end:0x3070; reg_width: 2; data_width: 2; reg_step: 2.

0x306e: 0x0
0x3070: 0x211
[END]

各位,由于项目需要在3516A上加AR0134 Sensor , 海思SDK5.0里面是没有提供AR0134 sensor驱动的,但是有相关类型的,所以我们参考谢了这个0134的驱动来调试。
AR0134Sensor 板是一个新做的板,所以首先验证I2C是否通,海思有I2c读写工具i2c_read / i2c_write。现通过这个读写工具来验证.
问题是:

    1、通过i2c_read 读的时候,默认能读出1个长度,但是读2个长度就报错。
    2、如何有效地调试这个i2c?

请问各位,问题可能出现在什么地方呢?有什么好的方法或 建议不?

测试结果:

    备注:i2c_read 命令的解释
    ~ # i2c_read

*** Board tools : ver0.0.1_20121120 ***

usage: i2c_read . sample:

            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.

do errro
[END]
~

I2C 读写命令示例
此操作示例通过 I2C 读写命令实现对 I2C 外围设备的读写操作。

a. 在控制台使用 i2c_read 命令对 I2C 外围设备进行读操作:
~ $ i2c_read
例如读挂载在 I2C 控制器 2 上的 sil9024 设备的 0x8 寄存器:
~ $ i2c_read 2 0x72 0x8 0x8 0x1 0x1
说明:

i2c_num: I2C 控制器序号(对应《 Hi3516A 专业型 HD IP Camera Soc 用户指南》中的 I2C 控制器 0、 1、 2)
device_addr:外围设备地址( Hi3516A 只支持 7bit 设备地址)
reg_addr:读外围设备寄存器操作的开始地址
end_reg_addr:读外围设备寄存器操作的结束地址
reg_width:外围设备的寄存器位宽( Hi3516A 支持 8/16bit)
data_width:外围设备的数据位宽( Hi3516A 支持 8/16bit)
reg_step:连续读外围设备寄存器操作时递增幅值,默认为 1,即连续读寄存器,读取单个寄存器时不使用该参数

b. 在控制台使用 i2c_write 命令对 I2C 外围设备进行写操作:
~ $ i2c_write
例如向挂载在 I2C 控制器 2 上的 sil9024 设备的 0x8 寄存器写入数据 0xa5:
~ $ i2c_write 2 0x72 0x8 0xa5 0x1 0x1
说明:

i2c_num: I2C 控制器编号(对应《 Hi3516A 专业型 HD IP Camera Soc 用户指南》中的 I2C 控制器 0、 1、 2)
device_addr:外围设备地址( Hi3516A 的 I2C 控制器只支持 7bit 设备地址)
reg_addr:写外围设备寄存器操作的地址
value:写外围设备寄存器操作的数据
reg_width:外围设备的寄存器位宽( Hi3516A 的 I2C 控制器支持 8/16bit)
data_width:外围设备的数据位宽( Hi3516A 的 I2C 控制器支持 8/16bit)

SPI 读写命令示例
此操作示例通过 SPI 读写命令实现对 SPI 外围设备的读写操作。
在控制台使用 spi_read 命令对 SPI 外围设备进行读操作:
~ $ ssp_read [num_reg] [dev_width] [reg_width] [data_width]
其中[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

说明:

spi_num: SPI 控制器号(对应《 Hi3516A 专业型 HD IP Camera Soc 用户指南》中的 SPI 控制器0、 1)
csn:片选号( Hi3516A 的 SPI 控制器 0 有 1 个片选、控制器 1 有 3 个片选)
dev_addr:外围设备地址
reg_addr:外围设备寄存器开始地址
num_reg:读外围设备寄存器个数
dev_width:外围设备地址位宽(支持 8 位)
reg_width:外围设备寄存器地址位宽(支持 8 位)
data_width:外围设备的数据位宽(支持 8 位)

在控制台使用 spi_write 命令对 SPI 外围设备进行写操作:
~ $ ssp_write [dev_width] [reg_width] [data_width]
其中[dev_width] [reg_width] [data_width]可以省略,缺省值都是 1(表示 1Byte)。
例如向挂载在 SPI 控制器 0 片选 0 上设备地址为 0x2 的设备的 0x0 寄存器写入数据 0x65:
~ $ ssp_write 0x0 0x0 0x2 0x0 0x65 0x1 0x1 0x1

说明:

spi_num: SPI 控制器序号(对应《 Hi3516A 专业型 HD IP Camera Soc 用户指南》中的 SPI 控制器 0、 1)
csn:片选号( Hi3516A 的 SPI 控制器 0 有 1 个片选、控制器 1 有 3 个片选)
dev_addr:外围设备地址
reg_addr:外围设备寄存器地址
data:写外围设备寄存器的数据
dev_width:外围设备地址位宽(支持 8 位)
reg_width:外围设备寄存器地址位宽(支持 8 位)
data_width:外围设备的数据位宽(支持 8 位)
此 SPI 读写命令仅支持 sensor 的读写操作。

参看:外围设备驱动 操作指南

一、首先下载安装包:

i2c-tools-3.0.1 linux上调试i2c的工具 源码

二、解压安装

1、解压tar -zxvf i2c-tools-3.0.1.tar.gz

2、修改Makefile

将 CC := gcc
修改为CC := arm-hisiv300-linux-gcc

3、修改vi tools/i2cdetect.c

308 #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  

否则会出现:

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目录下。

三、使用方法

参看:Linux I2C工具查看配置I2C设备

四、参看外围设备驱动 操作指南

Hi3516A根文件系统中是有I2C操作工具的。

具体操作指南,参看外围设备驱动 操作指南:I2C/SPI操作指南

`