完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我使用SPI(Slave端)一次性接收138Bytes数据,但是FIFO最大也只能是16Bytes(应该是这样吧?),所以为了保证Master端和Slave端都能接收到完整的138Bytes数据,我在中断里对Tx和Rx的FIFO进行实时操作,不断填充和取出数据,但是出现了SPI数据接收不全的问题,比如138Bytes只能接收到120个左右,然后我怀疑中断处理的时间可能过长,但是实在也没法再缩减了,处理内容不是很多,所以我把时钟HFClk和SysClk从24MHz改成了32MHz,问题是解决了,但是我改成更高的时钟48MHz,发现又不好用了,这是为什么呢?有什么好的办法来处理一次性接收138Bytes数据的问题吗?
|
|
相关推荐
2个回答
|
|
你看polling的那个code example:
从机回给主机的数据准备:(按照你的需求,这里可能要准备138个字节的数据) static void SPIS_UpdateStatus(uint32 status) { /* Put data into the slave TX buffer to be transferred while following master access. */ static uint8 sTxBuffer[PACKET_SIZE] = {PACKET_SOP, STS_CMD_FAIL, PACKET_EOP}; sTxBuffer[PACKET_CMD_POS] = (uint8) status; SPIS_SpiUartPutArray(sTxBuffer, PACKET_SIZE); } 主机读取的时候会发送138个字节,然后才能获得138个字节数据,你可以不发dummy数据,而是发有用的138个字节的数据,这样你主机也同时可以收到138个字节的数据。按照spi的通信原理,主机发送138个字节的数据,同时一定会收到138个字节的数据,你这里要做的事是如何获得你想要的数据。 static uint32 SPIM_ReadStatusPacket(void) { uint8 tmpBuffer[PACKET_SIZE]; uint8 status; uint8 i = 0; /* Start transfer */ SPIM_SpiUartPutArray(dummyBuffer, PACKET_SIZE); /* Wait for the end of the transfer. The number of transmitted data * elements has to be equal to the number of received data elements. */ while (PACKET_SIZE != SPIM_SpiUartGetRxBufferSize()); /* Clear dummy bytes from TX buffer */ SPIM_SpiUartClearTxBuffer(); /* Read data from the RX buffer */ while(0u != SPIM_SpiUartGetRxBufferSize()) { tmpBuffer = (uint8) SPIM_SpiUartReadRxData(); i++; } /* Clears the Rx buffer after reading it */ SPIM_SpiUartClearRxBuffer(); /* Check packet format */ if ((tmpBuffer[PACKET_SOP_POS] == PACKET_SOP) (tmpBuffer[PACKET_EOP_POS] == PACKET_EOP)) { /* Return status */ status = tmpBuffer[PACKET_STS_POS]; } else { /* Invalid packet format, return fail status */ status = STS_CMD_FAIL; } return ((uint32)status); } |
|
|
|
当使用SPI进行高速传输时,数据接收不全的问题可能涉及到以下几个方面:
1. 中断处理时间过长:如果中断处理时间过长,可能会导致SPI数据接收不完整。你可以通过优化中断处理逻辑来减少中断处理时间。可以考虑使用DMA传输来减少CPU的负载,从而提高中断处理的效率。 2. FIFO容量不足:如果SPI的FIFO容量不足以接收全部数据,你可以将数据存储在一个缓冲区中,然后在中断服务函数中,从FIFO中获取数据并填充到缓冲区中,直到接收完全部数据。这样可以保证完整地接收到138Bytes数据,而不会丢失任何数据。 3. 时钟速度问题:SPI传输速度与时钟频率有关。较高的时钟频率可以提高SPI传输速度,但是如果时钟频率太高,可能会导致传输错误。你可以尝试逐步增加时钟频率,找到一个合适的值,既能满足需求又不会导致传输错误。 4. 数据传输问题:SPI的数据传输是全双工的。在Slave端接收数据时,也需要发送数据给Master端,以保持传输的同步。因此,你需要确保Slave端在接收数据的同时,也能够及时发送响应数据给Master端。 总的来说,为了解决SPI数据接收不全的问题,你可以通过优化中断处理逻辑、利用缓冲区存储数据、适当调整时钟频率等方法来提高数据传输的效率和完整性。此外,你还可以考虑使用其他高速数据传输接口,如DMA或者使用串行存储器接口(SPI)进行数据传输。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-spi编程示例之spi编写程序
421 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第三十七章 image图像对比实验
406 浏览 0 评论
398 浏览 1 评论
465 浏览 0 评论
关于RT-Thread studio添加freemodbus控件失败的问题
739 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11636 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-8 08:14 , Processed in 0.823947 second(s), Total 75, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号