- 论坛徽章:
- 0
|
原帖由 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
解释,对吗? |
|