我想问一下,在以下情况下,STM32 中的 DMA SPI rx 会如何表现?
我有一个指定的(例如)96 字节数组,名为 A,用于存储从 SPI 接收到的数据。我打开循环 SPI DMA,它对每个字节进行操作,配置为 96 字节。
是否有可能,当 DMA 填充我的 96 字节数组时,传输完成中断将关闭,以快速将 96 字节数组复制到另一个 - B,然后循环 DMA 开始写入 A(并销毁 B 中保存的数据) ?
我想通过 USB 快速将 B 中的数据传输到 PC(每次我从 A 获取新数据到 B 时)。
我只是在想如何通过 USB 将连续的数据流 SPI 从 STM32 传输到 PC,因为我认为每一定时间通过 USB 传输一次 96 字节的数据块比通过 STM32 将实时 SPI 流传输到 USB 更容易?我不知道这是否可能
为此,您必须能够保证在接收下一个 SPI 字节并将其传输到缓冲区开头之前复制所有数据。这是否可行取决于处理器的时钟速度和 SPI 的速度,并且能够保证不会发生可能延迟传输的更高优先级中断。为了安全起见,它需要非常慢的 SPI 速度,在这种情况下可能根本不需要使用 DMA。
总而言之,这是一个坏主意,而且完全没有必要。 DMA 控制器有一个“半传输”中断正是用于此目的。当传输前 48 个字节时,您将收到 HT 中断,并且在复制时 DMA 将继续传输剩余的 48 个字节下半部分缓冲。当您完成转移后,您将转移上半部分。这将传输数据的时间从单个字节的接收时间延长到 48 个字节的接收时间。
如果每次传输实际上需要 96 个字节,那么只需将缓冲区设置为 192 个字节长 (2 x 96)。
在伪代码中:
#define BUFFER_LENGTH 96
char DMA_Buffer[2][BUFFER_LENGTH] ;
void DMA_IRQHandler()
{
if( DMA_IT_Flag(DMA_HT) == SET )
{
memcpy( B, DMA_Buffer[0], BUFFER_LENGTH ) ;
Clear_IT_Flag(DMA_HT) ;
}
else if( DMA_IT_Flag(DMA_TC) == SET )
{
memcpy( B, DMA_Buffer[1], BUFFER_LENGTH ) ;
Clear_IT_Flag(DMA_TC) ;
}
}
关于通过 USB 将数据传输到 PC,首先您需要确保 USB 传输速率至少与 SPI 传输速率一样快或更快。 USB 传输可能不太确定(因为它是由 PC 主机控制的 - 也就是说,只有当主机明确要求时,您才能在 USB 上输出数据),因此即使average如果传输速率足够,则可能存在需要进一步缓冲的延迟,因此您可能需要一个循环缓冲区或 FIFO 队列来为 USB 提供数据,而不是简单地从 DMA 缓冲区 A 复制到 USB 缓冲区 B。另一方面,如果你已经有了缓冲区DMA_Buffer[0]
, DMA_Buffer[1]
and B
您已经有效地拥有了三个 96 字节块的 FIFO,这可能就足够了
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)