Чтобы это работало, вы должны быть в состоянии гарантировать, что вы можете скопировать все данные до того, как следующий байт SPI будет получен и передан в начало буфера. Будет ли это возможно, будет зависеть от тактовой частоты процессора и скорости SPI, и сможет гарантировать отсутствие прерываний с более высоким приоритетом, которые могут задержать передачу. Чтобы быть в безопасности, ему понадобится исключительно медленная скорость SPI, и в этом случае, вероятно, вообще не потребуется использовать DMA.
В целом это плохая идея и совершенно ненужная. Контроллер DMA имеет прерывание «полупередачи» именно для этой цели. Вы получите прерывание HT, когда первые 48 байтов будут переданы, а DMA продолжит передавать оставшиеся 48 байтов, пока вы копируете нижнюю половину буфер. Когда вы завершите перевод, вы переведете верхнюю половину 1006 *. Это увеличивает время, необходимое для передачи данных, от времени получения одного байта до времени получения 48 байтов.
Если вам действительно нужно 96 байтов на каждую передачу, то вы просто делаете свой буфер 192 байта long (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) ;
}
}
Что касается передачи данных на P C по USB, прежде всего необходимо убедиться, что что ваша скорость передачи USB, по крайней мере, так же быстро или быстрее, чем скорость передачи SPI. Вполне вероятно, что передача USB менее определена c (поскольку она контролируется хостом P C - то есть вы можете выводить данные на USB только тогда, когда хост явно запрашивает это), так что даже если средняя скорость передачи достаточна, возможны задержки, которые требуют дальнейшей буферизации, поэтому вместо простого копирования из буфера DMA A в буфер B USB вам может понадобиться кольцевой буфер или очередь FIFO для подачи на USB , С другой стороны, если у вас уже есть буфер DMA_Buffer[0]
, DMA_Buffer[1]
и B
, у вас уже есть FIFO из трех блоков по 96 байт, которых может быть достаточно