免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2009-03-05 16:31 |只看该作者
原帖由 yidou 于 2009-3-5 14:51 发表
94. 你找个例子多好。 比我一步一步解释强多了。

还有问题时, 你三方面下手:
1. slave datasheet. 理解slave的时序,
2. kernel中i2c的框架, i2c module本身会帮你做哪些,
3. i2c master driver, 这是 ...



94. 你找个例子多好。 比我一步一步解释强多了。
>>非也,非也。 第一,work_queue.msgs申请内存没有释放(虽然不影响I2C读写)
2.  看不懂。有些迷惑。如写操作
    bytes=len;
    work_queue.nmsgs = 2;
    work_queue.msgs = (struct i2c_msg*)malloc(work_queue.nmsgs * sizeof(struct i2c_msg));
        (work_queue.msgs[0]).len = 1;
        (work_queue.msgs[0]).addr = 0x50 + offset/256;
        (work_queue.msgs[0]).flags=0;
    tmp[0]=offset%256;
        (work_queue.msgs[0]).buf = tmp;

        (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;
    ret = ioctl(fd, I2C_RDWR, (unsigned long)&work_queue);
那么就是说写操作的时候需要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

解释,对吗?

论坛徽章:
5
12 [报告]
发表于 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