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

TMS570LS3137 SPI传输中的数据配置

上图是我写的一段SPI测试程序,目的是用SPI向10片M25P64flash芯片发送读取ID的命令,再通过SPI总线把这些ID接收回来

片选用了gioA和gioB的一共10个接口,发送和接收调用了spi.c中的spiTransmitAndReceiveData()函数

程序最终没能实现预定功能,在单步调试的过程中,发现程序卡在spiTransmitAndReceiveData()函数中的

while((spi->FLG & 0x00000100U) != 0x00000100U)
{
} /* Wait */

我觉得可能的原因是在设置dataconfig_t存在错误,但我对dataconfig1_t的四个值得具体含义不太了解,所以也不知道怎么设置才是正确的,请诸位前辈帮我解答一下吧

多谢!

Yinan Xia:

回复 Ken Wang:

Ken,

非常感谢,我调整了Halcogen中的设置之后spi已经可以正常发送数据了

此外,我关于i2c的问题其实比较简单,是这样的,在i2c.c中,有一个i2cSetSlaveAdd()函数,我了解到这个函数是用于设置从机地址的

我的目的是要像一块具有7位地址0x48的从机发送一组读写命令,

而按照i2c的协议,在i2c发送的数据中,读写标志位是在八位地址之后的一位

我没有在i2c.c中找到具体的设置是读还是写的函数,那么是否可以理解为i2cSetSlaveAdd()所设置的从机地址,实际上是包含了读写位的八位地址呢?

还是说,有另外的办法来设置是读还是写?

谢谢~

Ken Wang:

回复 Yinan Xia:

Yinan,

   一般情况下 I2c的从芯片,都会有自己的advie address设置,通常是前7位是和地址有关系的,然后最后1位,1代表read,0代表write。

你可以仔细查看你的产品手册

谢谢

Yinan Xia:

回复 Ken Wang:

Ken,

你好,

非常感谢你的解答,也就是说,当我想向具有7位地址0x48的从芯片做写入操作时,我应当把它的地址视为0x90,而引用i2cSetSlaveAdd(i2cREG1,0x90)对吗?

我按照上面的思路并仿照Halcogen给的loopback模式例程写了以下的小程序,其中0x03代表寄存器地址,0x01代表写入值

while(1){ i2cInit(); i2cSetOwnAdd(i2cREG1,own_add); i2cSetStart(i2cREG1);

i2cSetSlaveAdd(i2cREG1,0x90); /**/

i2cSendByte(i2cREG1,0x03); /*寄存器寻址*/ i2cSendByte(i2cREG1,0x01); /*对寄存器写入数据*/

wait(0xffff); i2cClearSCD(i2cREG1); }

但是示波器显示在一次循环中的SCL和SDA时序图一共只有八个时钟周期的图像,也就是像下图这样

我的理解是似乎整个程序中只有i2cSetStart()起作用了,后续的设置从机地址以及向从机发送命令的程序都没有发挥作用,

不知道是不是程序本身的问题,希望您能帮我看一下

多谢~

Yinan Xia:

回复 Ken Wang:

Ken,

你好,这个问题我已经自己摸索解决了,

谢谢你!

Ken Wang:

回复 Yinan Xia:

Yinan,

   不好意思,没来得及帮你看下问题。很高兴看见你自己解决了问题。

可以的话,能都告知你是怎么解决的,这样也方便其他的知道。

谢谢

Yinan Xia:

回复 Ken Wang:

ken,

你好,这个问题还是源于我对i2cSetSlavAdd()函数的错误理解

我最终调通的程序是这样的

i2cInit();sciInit(); i2cSetOwnAdd(i2cREG1,own_add); i2cSetStart(i2cREG1); i2cSetSlaveAdd(i2cREG1,0x48); i2cSendByte(i2cREG1,0x90); /* ·¢ËÍдÊý¾ÝÃüÁҪдÈëµÄÊý¾Ý */ i2cSendByte(i2cREG1,0x0B); /* ·¢ËÍдÊý¾ÝÃüÁҪдÈëµÄÊý¾Ý */

i2cSetStart(i2cREG1); i2cSetDirection(i2cREG1, I2C_RECEIVER); a=i2cReceiveByte(i2cREG1);

sciSendByte(scilinREG,a);

相比于之前,改动主要有以下几点

1,i2cSetSlaveAdd中所设置的从机地址是不带第八位(读写标志位)的,即0x48,发布写命令时才需要在七位地址后加上0,变为0x90

2,   在对地址寄存器写入对应的寄存器地址(0x0B)后,要读取这个寄存器的值,只需要调用i2cSetDirection(i2cREG1, I2C_RECEIVER),将主机设置为receiver模式,主机就会自动向从机发送一个读命令(i2cSendByte(i2cREG1,0x91),这时从机就会把反馈发送到DXR,调用i2cReceiveByte()即可取走

现在对于单一字节寄存器读写都没有问题了,不过现在还有一些缺陷,对于多个地址连续的寄存器,如何实现块读取?我阅读过从芯片的datasheet,上面说的是支持块读取的,但是我发现调用i2cSetDirection(i2cREG1, I2C_RECEIVER)之后芯片只能返回一个字节的数据,我不知道该怎么做才能实现寄存器地址的自动递增,能否请您指点一下?

谢谢

user5221174:

回复 Yinan Xia:

您好,我也遇到了同样的问题,请问您设置了Halcogen的哪里解决的那,谢谢了

赞(0)
未经允许不得转载:TI中文支持网 » TMS570LS3137 SPI传输中的数据配置
分享到: 更多 (0)