SciFi (03.03.2020 21:35, просмотров: 358) ответил Aleksey_75 на Вы о чем ?? "Почему в коде как бы сначала ждём окончания передачи, потом пытаемся что-то принять?" это почему поздно то ? в DR принятый байт и он будет там лежать пока мы не поместим туда данные для отправки! Короч! я не одинок! похоже глюк
Виноват, не дочитал. Всё-таки CCR_EN надо ждать (про это в доке не написано, это да). У меня так: static void
transfer(int len)
{
static DMA_TypeDef* const dma = DMA1;
static DMA_Channel_TypeDef* const rx_stream = DMA1_Channel2;
static DMA_Channel_TypeDef* const tx_stream = DMA1_Channel3;
rx_stream->CMAR = (int)dmabuf;
tx_stream->CMAR = (int)dmabuf;
rx_stream->CPAR = (int)&SPI1->DR;
tx_stream->CPAR = (int)&SPI1->DR;
rx_stream->CNDTR = len;
tx_stream->CNDTR = len;
rx_stream->CCR = DMA_CCR1_MINC
| DMA_CCR1_EN;
tx_stream->CCR = DMA_CCR1_MINC
| DMA_CCR1_DIR
| DMA_CCR1_EN;
while ((dma->ISR & DMA_ISR_TCIF2) == 0) ; // wait for Rx DMA transfer complete
rx_stream->CCR = 0;
tx_stream->CCR = 0;
while ((rx_stream->CCR & DMA_CCR1_EN) || (tx_stream->CCR & DMA_CCR1_EN)) ; // wait for stream disable
dma->IFCR = DMA_IFCR_CGIF2 | DMA_IFCR_CHTIF2 | DMA_IFCR_CTCIF2
| DMA_IFCR_CGIF3 | DMA_IFCR_CHTIF3 | DMA_IFCR_CTCIF3;
}
ส็็็็็็็็็็็็็็็็็็็็็็็็็༼ ຈل͜ຈ༽ส้้้้้้้้้้้้้้้้้้้้้้้