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的函数问题

你好

      想问下:

1、   在spi.c中函数spiTransmitData(),其中语句while((spi->FLG & 0x00000100) != 0x00000100){},让我很费解。发送函数管接受的buffer,这导致我在自发自收的测试中(使能接受中断)调用spiTransmitData(spiREG2, &dataconfig, size, TX_Data);   spiGetData(spiREG2, &dataconfig, size, RX_Data);时,程序一直停在while((spi->FLG & 0x00000100) != 0x00000100){},该句。

2、spiTransmitData(),的另一句SpiBuf = spi->BUF;这个是什么意思,感觉没什么用,变量spiBuf是该函数定义的局部变量,把spi->BUF的值赋给spiBuf,此处又没有用到该变量的地方。真的搞不懂这个函数?

   希望能解释下该函数

 

谢谢

  • weibin,

      SPI的发送和接收和SCI是不同的工作性质的。SPI的通信机制是一个移位寄存器的形式,你在发送的同时也在接收数据。

    因为这个原因,所以你在SPI发送数据的函数里面会出现判断类似于接收函数中应该有的语句。在我们程序里面有单独的发送或是接收的函数,也有发送和接收在一起的函数,你可以仔细看一下。

    谢谢

  • 你好,

            在TMS5701S3137这款产品上看到有两个SPI口,目前我通过在两个SPI口之间进行通信,一个座位主设备一个作为从设备,我用的是发送和接受结合的函数,通过输出接收数据的值来判断主从发送和接受的正确与否。

            目前在运行之后主设备的接收显示为全f,而从设备接收显示全0。和主从设备发送的数据完全不一样。这是不是代表着主从设备完全没有正常的通信?这其中有那些需要注意的地方吗?可以提醒一下!谢谢

  •    您好:
            以下是SPI可以发送和接收的函数,但这个函数是不是只能发送和接收相同字节的数据?如果需要发送和接收都随意字节,需要自己修改是吗?

    uint32 spiTransmitAndReceiveData(spiBASE_t *spi, spiDAT1_t *dataconfig_t, uint32 blocksize, uint16 * srcbuff, uint16 * destbuff)
    {
    uint16 Tx_Data;
    uint32 Chip_Select_Hold = (dataconfig_t->CS_HOLD) ? 0x10000000U : 0U;
    uint32 WDelay = (dataconfig_t->WDEL) ? 0x04000000U : 0U;
    SPIDATAFMT_t DataFormat = dataconfig_t->DFSEL;
    uint8 ChipSelect = dataconfig_t->CSNR;

    /* USER CODE BEGIN (14) */
    /* USER CODE END */
    while(blocksize != 0U)
    {
    if((spi->FLG & 0x000000FFU) != 0U)
    {
    break;
    }

    if(blocksize == 1U)
    {
    Chip_Select_Hold = 0U;
    }
    /*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are only allowed in this driver" */
    Tx_Data = *srcbuff;

    spi->DAT1 =((uint32)DataFormat << 24U) |
    ((uint32)ChipSelect << 16U) |
    (WDelay) |
    (Chip_Select_Hold) |
    (uint32)Tx_Data;
    /*SAFETYMCUSW 567 S MR:17.1,17.4 <APPROVED> "Pointer increment needed" */
    srcbuff++;
    /*SAFETYMCUSW 28 D MR:NA <APPROVED> "Hardware status bit read check" */
    while((spi->FLG & 0x00000100U) != 0x00000100U)
    {
    } /* Wait */
    /*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are only allowed in this driver" */
    *destbuff = (uint16)spi->BUF;
    /*SAFETYMCUSW 567 S MR:17.1,17.4 <APPROVED> "Pointer increment needed" */
    destbuff++;

    blocksize--;
    }

    /* USER CODE BEGIN (15) */
    /* USER CODE END */

    return (spi->FLG & 0xFFU);
    }