TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS570LS3137的i2c总线如何实现从芯片寄存器块读取?

我用的主机是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。对同一个地址写,然后立刻读出,应该是刚刚写的内容啊,求指教

赞(0)
未经允许不得转载:TI中文支持网 » TMS570LS3137的i2c总线如何实现从芯片寄存器块读取?
分享到: 更多 (0)