你好
想问下:
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,此处又没有用到该变量的地方。真的搞不懂这个函数?
希望能解释下该函数
谢谢
Ken Wang:
weibin,
SPI的发送和接收和SCI是不同的工作性质的。SPI的通信机制是一个移位寄存器的形式,你在发送的同时也在接收数据。
因为这个原因,所以你在SPI发送数据的函数里面会出现判断类似于接收函数中应该有的语句。在我们程序里面有单独的发送或是接收的函数,也有发送和接收在一起的函数,你可以仔细看一下。
谢谢
arther zhang:
回复 Ken Wang:
你好,
在TMS5701S3137这款产品上看到有两个SPI口,目前我通过在两个SPI口之间进行通信,一个座位主设备一个作为从设备,我用的是发送和接受结合的函数,通过输出接收数据的值来判断主从发送和接受的正确与否。
目前在运行之后主设备的接收显示为全f,而从设备接收显示全0。和主从设备发送的数据完全不一样。这是不是代表着主从设备完全没有正常的通信?这其中有那些需要注意的地方吗?可以提醒一下!谢谢
ziyu zhao1:
回复 Ken Wang:
您好:
以下是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);}