yangq

yangq

0个粉丝

4

问答

0

专栏

0

资料

yangq  发布于  2016-08-26 09:01:50
采纳率 0%
4个问答
12632

海思3520dV300的i2c数据多字节读写的问题

 
对于i2c的发送和接收单个字节那是没有什麽问题的,但是调用i2c_master_send(client, buf, Len)写,返回值为2,还是只能单个字节的写,接收数据调用 ret = i2c_master_recv(client, buf, Len)接口,返回值为len,数据却还是接收到一个或者没有。为何i2c单个字节读写没有问题,一次性发多个或者接收多个字节的数据却是有问题的呢?大神们,求助啊
我来回答
回答15个
时间排序
认可量排序

goodman

4个粉丝

30

问答

18

专栏

17

资料

goodman 2016-08-26 10:59:54
认可0
提到这个我就忍不住要骂下海思的研发人员,XoxoOX
这个问题无解的,海思的驱动里面只实现了读寄存器(最多2个字节),要想连续读取3个解决方案。
1.你们家是大厂,有钱找海思给你们把驱动写全了
2.你们有牛B的驱动工程师,自己读datasheet把驱动实现了
3.放弃吧。

yangq

0个粉丝

4

问答

0

专栏

0

资料

yangq 2016-08-26 11:24:50
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=36697&ptid=12434]goodman 发表于 2016-8-26 10:59[/url]
提到这个我就忍不住要骂下海思的研发人员,XoxoOX
这个问题无解的,海思的驱动里面只实现了读寄存器(最多 ...[/quote]

还有其它方案吗?
1.比如自己做gpio的i2c模拟
2.驱动中的有
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)
以及
int hi_i2c_dma_write(const struct i2c_client *client, unsigned int data_addr,
                unsigned int reg_addr, unsigned int reg_addr_num,
                unsigned int length)
调用可以实现吗,我发现有这两个函数,不知道调用可以不可以实现。
还有就是你们那做有多个字节读写的i2c设备,后来你们都是如何解决的,抱怨太多没用啊,只能面对。

wxh

0个粉丝

2

问答

0

专栏

0

资料

wxh 2016-08-28 16:19:57
认可0
海思的是用GPIO模拟I2C的,可以自己根据I2C协议自己来改的

myearth

0个粉丝

3

问答

0

专栏

3

资料

myearth 2016-08-30 09:25:35
认可0
用GPIO模拟I2C,海思的I2C估计芯片有bug,用不了。模拟I2C多耗电CPU而已。

kennybluezy

0个粉丝

16

问答

0

专栏

0

资料

kennybluezy 2016-09-06 18:45:35
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=36817&ptid=12434]myearth 发表于 2016-8-30 09:25[/url]
用GPIO模拟I2C,海思的I2C估计芯片有bug,用不了。模拟I2C多耗电CPU而已。[/quote]

请问确定有这问题? 我在用3531,利用标准的I2C子设备驱动程序模型写的驱动程序。能实现正常的I2C通信,但发现个问题,就是中断标志寄存器经常出现bit7为1,bit6~bit0为0,意为总线忙,这时只有等待;但有时等待几十ms后仍然还是这个情况。这时只有认为传输已经完成,退出中断服务程序。
现在的问题是我想确认下海思的I2C模块是不是有问题?工程实践中是不是利用GPIO来模拟I2C通信的?
请各位前辈不吝赐教,谢谢

DarkQin

1个粉丝

8

问答

0

专栏

2

资料

DarkQin 2016-09-08 13:58:51
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=36708&ptid=12434]yangq 发表于 2016-8-26 11:24[/url]
还有其它方案吗?
1.比如自己做gpio的i2c模拟
2.驱动中的有
[/quote]

不可以用这两个函数...但可以自己修改实现...或者自己重新写一个驱动...

myearth

0个粉丝

3

问答

0

专栏

3

资料

myearth 2016-09-13 09:52:12
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37289&ptid=12434]kennybluezy 发表于 2016-9-6 18:45[/url]
请问确定有这问题? 我在用3531,利用标准的I2C子设备驱动程序模型写的驱动程序。能实现正常的I2C通信, ...[/quote]

确定,海思的都这样。他自己就没有I2C驱动,用模拟的

kennybluezy

0个粉丝

16

问答

0

专栏

0

资料

kennybluezy 2016-09-13 14:08:27
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37695&ptid=12434]myearth 发表于 2016-9-13 09:52[/url]
确定,海思的都这样。他自己就没有I2C驱动,用模拟的[/quote]

感谢回复。太坑了。。。
另再打扰一下,工程中能否用SDK包中的gpioi2c.ko,代码中gpio_i2c_write和gpio_i2c_read用到了锁spin_lock(&gpioi2c_lock)和spin_unlock(&gpioi2c_lock)不确定是否会引起异常啊? 另外代码中好像没有判断I2C总线状态,是否不妥?
再次感谢

drafour

1个粉丝

7

问答

0

专栏

1

资料

drafour 2016-09-13 15:27:20
认可0
可以用。
ad芯片的驱动里面基本都用gpio_i2c_write和gpio_i2c_read。

myearth

0个粉丝

3

问答

0

专栏

3

资料

myearth 2016-09-13 18:29:55
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37709&ptid=12434]kennybluezy 发表于 2016-9-13 14:08[/url]
感谢回复。太坑了。。。
另再打扰一下,工程中能否用SDK包中的gpioi2c.ko,代码中gpio_i2c_write和gpio_ ...[/quote]

如果I2C上挂多设备的话,又多线程读写,应该会用到锁。I2C是模拟的没有总线状态(寄存器)这一说。
就是I2C只能保证同时一个人用,用完别的可以用。这个锁应该只是这个作用,我的3520D没看到你说的这个锁。

myearth

0个粉丝

3

问答

0

专栏

3

资料

myearth 2016-09-13 18:37:19
认可0
应该这样说海思的芯片I2C设计这块有问题,他们自己都搞不定,用模拟的,我们就别去搞了。

kennybluezy

0个粉丝

16

问答

0

专栏

0

资料

kennybluezy 2016-09-14 08:52:49
认可0
OK.非常感谢两位的回复。之前我是利用标准的I2C子设备驱动模型来写的驱动,目前是将SCL和SDA复用为GPIO,模拟进行I2C通信的。两者都能工作,前者出现的问题如之前所述,中断状态寄存器经常出问题。
利用GPIO模拟通信目前发现个问题,就是运行一段时间后出现 INFO: rcu_sched_state detected stall on CPU 0 xxxxxx sending IPI to all other CPUs: 错误,大概是指进程调度有问题,telnet无法登陆,但串口正常输出,VI、VO等模块也能正常工作。内核和应用程序都是之前的版本,可能是驱动程序的问题。查询了下自旋锁spin_lock的相关内容,说有可能会引起死锁,常用的是spin_lock_irqsave。所以这里想请教下实际工程代码中,是否直接使用SDK包中的驱动?
另外,从理论上讲,进行I2C通讯前应该判定总线状态。考虑到我们是用GPIO模拟I2C通信,是否可通过连续判定SCL、SDA线所对应的GPIO端口为低,来确认总线未被使用?

总之,因为之前没有相关经验,这里向各位大神请教下,工程实际代码中如何利用GPIO来模拟I2C通信?非常感谢

younglhome

0个粉丝

0

问答

0

专栏

0

资料

younglhome 2018-09-06 12:22:35
认可0
看datasheet上说I2C连续读写需要使用DMA,所以理论上是可以实现的。

ebainar

0个粉丝

7

问答

0

专栏

0

资料

ebainar 2018-09-06 13:13:38
认可0
直接参考下面两个测试的代码,想收发多少字节都可以做到,对于限定最大为2的地方也可以自行修改。

#i2c_read
*** Board tools : ver0.0.1_20121120 ***
[debug]: {source/utils/cmdshell.c:168}cmdstr: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.

do errro
[END]

#i2c_write
*** Board tools : ver0.0.1_20121120 ***
[debug]: {source/utils/cmdshell.c:168}cmdstr:i2c_write
usage: i2c_write . sample:
                 0x1 0x56 0x0 0x28 2 2.
                 0x1 0x56 0x0 0x28. default reg_width and data_width is 1.

do errro
[END]

scsi

0个粉丝

26

问答

0

专栏

2

资料

scsi 2019-02-20 17:56:10
认可0
这个例子不是真正的多字节多谢,  只是单字节读写做了一个循环而已。
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区