免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: studyboy_3w
打印 上一主题 下一主题

I2C RepStart Mode 的编写 [复制链接]

论坛徽章:
5
1 [报告]
发表于 2009-03-05 11:09 |显示全部楼层
原帖由 studyboy_3w 于 2009/3/5 11:54 发表
1.如果才一个msgs 那么offset command放在哪个变量呢?
2.单独write是没有问题的。 操作了read(re-start模式)后在写就有问题了。 why? investigating...



1.如果才一个msgs 那么offset command放在哪个变量呢?
都往msg[0].buff里放。

目前你的代码只放了address, 而且buff是个指针,指向了slave_address.
你需要申请一个buffer, 用来暂存slave_address & offset, 然后把这个buffer的地址赋给msg[0].buff

2.单独write是没有问题的。 操作了read(re-start模式)后在写就有问题了。 why? investigating..
如果单独write没问题, 你试试write + read呢,是否正常?
或者说,你的单独的read正常吗?

评分

参与人数 1可用积分 +15 收起 理由
dreamice + 15 我很赞同,感谢解决问题

查看全部评分

论坛徽章:
5
2 [报告]
发表于 2009-03-05 11:23 |显示全部楼层
原帖由 studyboy_3w 于 2009/3/5 11:09 发表

1. 请问 为什么要用2个msg? 不是一个吗?
2. 请问如何写操作是使用i2cdev_write()(即是直接fd=open /dev/i2c.  然后write(fd...))会有问题吗?




1. 请问 为什么要用2个msg? 不是一个吗?
读操作, 是从哪个设备地址,哪个偏移,用什么读命令,来进行操作。对于读操作,其实包含两个过程:
a. master把设备相关的一些信息发过去,即往总线上发slave address, slave offset, command(command为可选项)
b. 再从slave读取数据。

2. 请问如何写操作是使用i2cdev_write()(即是直接fd=open /dev/i2c.  然后write(fd...))会有问题吗?
不是太肯定。可以试一下。你要保证:
a. 参数传递正确。
b. i2cdev_write能最终调用i2c的write命令。
加点调试信息,确保上面两步无误。

论坛徽章:
5
3 [报告]
发表于 2009-03-05 11:25 |显示全部楼层
补充一下,

从下面的代码来看,
        (work_queue.msgs[0]).len = 1;
        (work_queue.msgs[0]).addr = slave>>1;
        (work_queue.msgs[0]).flags=0;
        (work_queue.msgs[0]).buf = &addr;

你的I2C设备,读命令时,只传递了slave address而已,不需要传递offset, command等。

论坛徽章:
5
4 [报告]
发表于 2009-03-05 11:32 |显示全部楼层
问一下LZ,
I2C RepStart Mode, 这里的RepStart是I2C的Re-start吗?

论坛徽章:
5
5 [报告]
发表于 2009-03-05 13:39 |显示全部楼层
撞头ing

论坛徽章:
5
6 [报告]
发表于 2009-03-05 14:51 |显示全部楼层
94. 你找个例子多好。 比我一步一步解释强多了。

还有问题时, 你三方面下手:
1. slave datasheet. 理解slave的时序,
2. kernel中i2c的框架, i2c module本身会帮你做哪些,
3. i2c master driver, 这是你要准备或处理的数据。
i2c module会把你准备好的数据,按固有的时序发出去,这个master时序严格匹配slave时序就能工作了。

论坛徽章:
5
7 [报告]
发表于 2009-03-06 09:14 |显示全部楼层
原帖由 studyboy_3w 于 2009/3/5 16:31 发表
那么就是说写操作的时候需要2个msgs。 一个发送地址 一个读数据。
        (work_queue.msgs[0]).len = 1;
        (work_queue.msgs[0]).addr = 0x50 + offset/256;  //Slave address 为什么没有移位. 为什么要加上offset/256, 它的地址可以0x50-0x54.(猜的)
        (work_queue.msgs[0]).flags=0;
    tmp[0]=offset%256;
        (work_queue.msgs[0]).buf = tmp; //Slave 的偏移地址

      (work_queue.msgs[1]).len = len; //接受长度。
        (work_queue.msgs[1]).addr = 0x50 + offset/256;
        (work_queue.msgs[1]).flags=1;
        (work_queue.msgs[1]).buf = buf; //接受的buffer。
那么Host发的时序是
    Start | Slave | 0 | Ack | Register_Address_MSB | Ack | Register_Address_LSB | Ack |
  Restart | Slave_Address | 1 | Ack | XXXX_MSB | Ack | XXXX_LSB | NAck or Stop


你这里是指读操作吗? 读操作需要两个msgs, 一个发地址,一个读数据。

I2C协议规定的时序是:
Start | Slave | 0 | Ack | xxx | Ack |  .....(byte+ack) | xxx | Ack |
  Restart | Slave_Address | 1 | Ack | ...(byte+ack) | ACK or NAK| Stop

具体要填什么数据,你要查Slave设备的手册。如
Start | Slave之后,要发Register。
Stop之前是NAK, 还是ACK。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP