我用的主机是TMS570LS3137,目的是读取一片adt7410温度芯片的温度数据,
其中芯片地址0x48,芯片中的温度值寄存器MSB的地址为0x00,LSB的地址为0x01
i2cInit();
sciInit();
i2cSetOwnAdd(i2cREG1,own_add);
i2cSetStart(i2cREG1);
i2cSetSlaveAdd(i2cREG1,0x48);
i2cSendByte(i2cREG1,0x90);
i2cSendByte(i2cREG1,0x00);
i2cSetStart(i2cREG1);
i2cSetDirection(i2cREG1, I2C_RECEIVER);
a=i2cReceiveByte(i2cREG1);
sciSendByte(scilinREG,a);
现在对于单一字节寄存器读写都没有问题了,不过还有一些缺陷,对于多个地址连续的寄存器,如何实现块读取?我阅读过从芯片的datasheet,上面说的是支持块读取的,但是我发现调用i2cSetDirection(i2cREG1, I2C_RECEIVER)改变i2c的方向之后,芯片只能返回一个字节的数据(示波器显示只有八个时钟),我不知道该怎么做才能实现寄存器地址的自动递增。
我百度了一些资料,貌似是因为主机在接收到从芯片发回的第一个字节的温度数据之后,没有发送正确的ACK位,所以导致从机的发送立即停止,不知道这种情况如何通过更改设置来解决?
谢谢
Jay:
没有很明白你的问题。
不过你可以参考一下我附上的一个例程,有读和写的过程。
Yinan Xia:
回复 Jay:
Jay,
你好,非常感谢你的例程。
非常抱歉我没有表达清楚自己的问题,我简单地解释一下吧
我的目的是读取这个芯片中两个寄存器的数据,其中一个寄存器的子地址为0x00,另一个为0x01,各自存储了8位数据
我已经实现了分别发送这两个子地址,然后分别用receivebyte()函数读取的方式
现在我想实现的目标是,只发送0x00这个子地址,让芯片自己做地址自增,并返回这两个寄存器的共16位数据,这样我只要连续调用两次receivebyte()函数就可以把所有的数据取出来了
我注意到您给的例程里也是只调用了一次receivebyte(),所以我还是没弄明白这个问题
希望您能指导一下
谢谢
Jay:
回复 Yinan Xia:
子地址对于I2C来讲,实际是应该算是发送的数据部分了。
我不是很清楚芯片如何去做子地址的自增,除非你的软件里有所处理。
你是哪里看到芯片有这个功能的?
rookiecalf:
回复 Jay:
Jay
子地址对于I2C来讲,实际是应该算是发送的数据部分了。
我不是很清楚芯片如何去做子地址的自增,除非你的软件里有所处理。
你是哪里看到芯片有这个功能的?
Yinan Xia:
回复 Jay:
这是我在ADT7410芯片的datasheet里找到的一段话,就是因为看了这一段,所以一直想知道怎么才能一次读取两个寄存器@_@
附件中是这个芯片的datasheet。。。上面这一段在第13页
rookiecalf:
回复 Yinan Xia:
不能块读取,看P19的描述:
kai zong:
回复 Jay:
你好!我看了你付的例程了,我用的主机是TMS570LS1227,从机是24XX64型号的E2PROM,把你提供的例程放上去运行,发现TMS570LS1227可以实现对E2PROM的写操作,但是对E2PROM进行读操作的时候,发现对刚刚写数据的那个地址读出的数据全都是0XFF。对同一个地址写,然后立刻读出,应该是刚刚写的内容啊,求指教