This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS570LS3137 SPI传输中的数据配置

Other Parts Discussed in Thread: HALCOGEN

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

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

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

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

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

多谢!

  • 简单一点,直接可以设成如下:

    dataconfig.CSNR = 0;
    dataconfig.CS_HOLD = 0;
    dataconfig.DFSEL = 0;
    dataconfig.WDEL = 1;

    另外需要注意SPI的管脚复用是否注意,另外关于SPI的配置是否正确。

    谢谢

  • Ken,

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

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

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

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

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

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

    谢谢~

  • Yinan,

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

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

    谢谢

  • 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()起作用了,后续的设置从机地址以及向从机发送命令的程序都没有发挥作用,

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

    多谢~

  • Ken,

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

    谢谢你!

  • Yinan,

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

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

    谢谢

  • 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)之后芯片只能返回一个字节的数据,我不知道该怎么做才能实现寄存器地址的自动递增,能否请您指点一下?

    谢谢

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