yangjking

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking  发布于  2016-10-13 21:15:30
采纳率 0%
8个问答
10374

[结帖]hi3516a开发板上,i2c2读写命令对一些从设备无效

 
本帖最后由 yangjking 于 2016-11-8 14:19 编辑

问题如题,i2c_read i2c_write函数对一些从设备无效。
这些命令可以与开发板上自带的从设备通讯,但是目前我外接了个从设备,slave_address为0x41,其register_address_width为2字节,数据宽度是1字节,但每次都是4的倍数。
时序如下:
-----------------------------------------------------------------------------------------------------------------------------------
结果:海思i2c2确实无法满足i2c的数据连读连写,后面用GPIO模拟i2c解决问题。
我来回答
回答14个
时间排序
认可量排序

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-10-13 21:16:59
认可0
看来很多帖子,发现好像很多人有这个问题。不知道大家是否已有有效的解决方案:(

hanfei69882

2个粉丝

26

问答

0

专栏

2

资料

hanfei69882 2016-10-14 09:39:09
认可0
问题描述不够细,别人只能去猜问题
1、采用什么操作去读
2、已经确认哪些没有问题
i2c操作可以参考外围设备驱动操作指南.pdf

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-10-14 10:45:51
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=39417&ptid=12989]hanfei69882 发表于 2016-10-14 09:39[/url]
问题描述不够细,别人只能去猜问题
1、采用什么操作去读
2、已经确认哪些没有问题
[/quote]

hanfei,
问题是这样的,使用i2c-2,用其自带命令i2c_read i2c_write可以读写3516a开发板上外接的那些slave外设没有问题。但是我用i2c_read去读另一个我连线的slave 外设就不成功了。
例如,开发板自带slave外设其slave address为0x72,使用命令i2c_read 0x02 0x72 0x08 0x08 1 1//读取成功,有返回数据。
但是我另一块外设,其slave address为0x41,register_width为2, data_width为1,但是读取或写入的data length都需为4的倍数。所以我开始的时候继续使用其自带命令i2c_read 0x02 0x41 0x00 0x00 2 1//读取失败。
后来查看i2c_ops.c代码,里面使用的read长度有限定为data_width,稍作修改使read(fd, addr, 4);但还是失败了。:(

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-10-14 10:49:06
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=39417&ptid=12989]hanfei69882 发表于 2016-10-14 09:39[/url]
问题描述不够细,别人只能去猜问题
1、采用什么操作去读
2、已经确认哪些没有问题
[/quote]

而我slave外设的i2c的时序就是帖子上的读写要求

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-10-14 10:52:14
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=39417&ptid=12989]hanfei69882 发表于 2016-10-14 09:39[/url]
问题描述不够细,别人只能去猜问题
1、采用什么操作去读
2、已经确认哪些没有问题
[/quote]

硬件上,3516a的i2c由于是100K速率,所以有上拉1K电阻;我的另一从设备可以支持到400K速率,所以有接4.3K的上拉电阻。不知道这样用跳线直接连起来会不会有问题?
从设备的I2C没有问题,我用另外的设备读写成功的。

ljx6233535

0个粉丝

10

问答

0

专栏

4

资料

ljx6233535 2016-10-14 11:49:51
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=39443&ptid=12989]yangjking 发表于 2016-10-14 10:45[/url]
hanfei,
问题是这样的,使用i2c-2,用其自带命令i2c_read i2c_write可以读写3516a开发板上外接的那些sl ...[/quote]

i2c_ops.c源码
for (cur_addr = reg_addr; cur_addr <= reg_addr_end; cur_addr += reg_step)
        {
                if (reg_width == 2) {
                        recvbuf[0] = cur_addr & 0xff;
                        recvbuf[1] = (cur_addr >> 8) & 0xff;
                } else
                        recvbuf[0] = cur_addr & 0xff;

                ret = read(fd, recvbuf, reg_width);

======================================
recvbuf[0]为低8位地址,recvbuf[1]为高8位地址
你的时序要求高8位地址先传,所以你可以把地址反过来试试,或者抓一下I2C的通信数据,看看是不是符合设备的时序要求。
连续读4个可以这样读:i2c_read 0x02 0x41 0x0000 0x0004 2 1

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-10-14 14:10:22
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=39456&ptid=12989]ljx6233535 发表于 2016-10-14 11:49[/url]
i2c_ops.c源码
for (cur_addr = reg_addr; cur_addr > 8) & 0xff;
                } else
[/quote]

我刚刚测试了还是读失败的。因为我的寄存器地址为0x0000,所以这个高低就不影响了。然后,i2c_read 0x02 0x41 0x0000 0x0004 2 1//这是连续地址读取?我的应该是同一地址连读4个字节吧。
而且失败的时候,它在for循环的第一次read就失败了。

ljx6233535

0个粉丝

10

问答

0

专栏

4

资料

ljx6233535 2016-10-17 10:23:53
认可0
本帖最后由 ljx6233535 于 2016-10-17 10:26 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=39475&ptid=12989]yangjking 发表于 2016-10-14 14:10[/url]
我刚刚测试了还是读失败的。因为我的寄存器地址为0x0000,所以这个高低就不影响了。然后,i2c_read 0x02  ...[/quote]

那这样建议你抓I2c数据吧 ,这样直接就能看出是哪个环节出问题了。

抓时序看看是不是写完slave地址后设备没有回ACK,这个地方导致I2c失败可能性最大。

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-10-18 10:55:41
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=39597&ptid=12989]ljx6233535 发表于 2016-10-17 10:23[/url]
那这样建议你抓I2c数据吧 ,这样直接就能看出是哪个环节出问题了。

抓时序看看是不是写完slave地址 ...[/quote]

@ljx感谢您的回复,波形也抓过,不过可能我的示波器毕竟差,波形很不清晰。这两天我查找了相关底层代码,后来发现int hi_i2c_dma_read(const struct i2c_client *client, unsigned int data_addr,
                unsigned int reg_addr, unsigned int reg_addr_num,
                unsigned int length)
这个函数,实现连续读取功能。但是失败了,最后查到海思自己根本没实现对于i2c-2的DMA功能,他们自己都应该没测试过,因为在对DMA设置的代码里就没有支持i2c-2这项。所以除非自己根据datasheet重写i2c-2了。我目前是放弃的,准备用GPIO模拟I2C了。从下图看出,海思没实现i2c-2的DMA。

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-10-18 10:56:58
认可0
本帖最后由 yangjking 于 2016-10-18 10:58 编辑

如图所示,海思没有支持I2C-2的DMA连续传输功能,所以要么自己根据datasheet自己写,要么走其他途径了。

qn1517370112

0个粉丝

0

问答

0

专栏

0

资料

qn1517370112 2018-02-07 11:19:16
认可0
最近也遇到了,感觉不知道怎么去读写。

longage

0个粉丝

4

问答

0

专栏

0

资料

longage 2018-02-09 13:32:36
认可0
楼主解决了吗?我也遇到这个问题,看了下linux的层驱动,如果读数据超过2字节会使用dma去操作

chenhai

0个粉丝

1

问答

0

专栏

0

资料

chenhai 2020-05-07 10:42:48
认可0
我也是这个问题,楼主后来是用GPIO模拟I2C解决的?楼主可否分享一下所用的模拟I2C程序,非常感谢

yzm12345

0个粉丝

0

问答

0

专栏

0

资料

yzm12345 2017-10-17 14:31:14
认可0
感谢分享:):):)
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区