wangjunzy 发表于 2018-3-1 18:06:03

STM32F031 SPI Master Send CRC can not work

下面的程序是在主程序里面发送10个数据,并追加一个CRC;
在下面红色一行增加延时,时间过长,CRC就会发不出去;为什么要延时,我是为了给Slave提供足够的响应处理时间。
For循环10000,1000,CRC发不出去;循环缩短到100,就可以。
这是什么原因?

主程序里发数据;
for(i=1;i<11;i++)
{
for(j=0;j<10000;j++);
while(LL_SPI_GetTxFIFOLevel(SPI1)==LL_SPI_TX_FIFO_FULL);
LL_SPI_TransmitData16(SPI1,i);
if(i==10)
{
for(j=0;j<100;j++);
   LL_SPI_SetCRCNext(SPI1);
}
}


nyszx 发表于 2018-3-1 21:45:11

本帖最后由 nyszx 于 2018-3-1 21:50 编辑

楼主标题,标题,标题,可不可以把问题描述清楚,或者使用中文描述。 LL库没用过,给你贴出了具体函数,我理解是要紧跟最后一数据,延时长了就会出问题,感觉没必要延时,一定要加,也应该在后面加,请高手解读:
/**
* @briefSet CRCNext to transfer CRC on the line
* @note   This bit has to be written as soon as the last data is written in the SPIx_DR register.
* @rmtoll CR1          CRCNEXT       LL_SPI_SetCRCNext
* @paramSPIx SPI Instance
* @retval None
*/
__STATIC_INLINE void LL_SPI_SetCRCNext(SPI_TypeDef *SPIx)
{
SET_BIT(SPIx->CR1, SPI_CR1_CRCNEXT);
}

wangjunzy 发表于 2018-3-2 09:52:15

SPI Master发送数据后,延迟设置CRCNext,CRC发不出来

修改title;

为什么延时一些去设置CRCNEXT,CRC就发布出去呐??

bargagebaobei 发表于 2018-3-2 10:01:49

我理解的可能有几点原因:第一就是如果没有延时发送不出去是不是因为spi的txe标志位还没有置7,也就是说发送数组还没有清空。第二个就是为什么延时时间过长也发送不出去,我没闹明白你说的是发送端没有发送出去还是说发送端发出去了但是接受端没有接收到啊,如果是发送端没有发送出去是不是因为你设置的延时等待时间和你延时不相符

wangjunzy 发表于 2018-3-2 10:38:42

没有延时或者延时很短,CRC可以发出去; 延时长了,CRC就根本不会在MOSI上出现,就是没有把CRC发出来。
手册上,写在发送最后一个数据时,Set CRCNext,就可以发送CRC; 疑问就是,为什么发送完最后一个数据,延时一段时间,去设置CRCNext。CRC就发布出去。
页: [1]
查看完整版本: STM32F031 SPI Master Send CRC can not work