|
用HAL_SPI_Receive_DMA(&hspi1, pBuffer, NumByteToRead); HAL_UART_Receive_DMA(&hspi1, pBuffer, NumByteToRead); 0 i$ n4 V9 m; K' o 带DMA的接的,不能在此函数下面紧接着使用 这pBuffer中的数据,因为这些函数设置好传输参数,传输刚开始,pBuffer中还没有接收完数据。在这个时候如果是和芯片传数据,更不能关闭,芯片的使能。, X3 H+ B3 S& x+ I/ p. Q 1,可以在此类函数下面设置延时等待,然后操作pBuffer. ?" i# Z5 Z4 \1 D4 ? 2,可以在DMA中断回调函数中操作数据。使用DMA传输,STM32Cube默认使能DMA传输完成中断,最终会调用HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi);! f4 w1 C' L- H; D1 L$ v( t8 l 3,可先判断while(hspi1.State!=HAL_SPI_STATE_READY);STM32Cube生成的代码中,时时指示着各模的状态,传输时状态为忙。: V2 |/ y; v! K( t State在 SPI_HandleTypeDef结构中定义;9 N; D0 {; @8 k/ b6 | , L$ x: W3 V ]7 n7 l# k0 C 7 g( A+ V% E! e 用DMA传输的函数调用顺序: 1,HAL_SPI_Receive_DMA(&hspi1, pBuffer, NumByteToRead); 功能:调用HAL_SPI_TransmitReceive_DMA(hspi, pData, pData, Size);因为在主机模时要利用发数据的时钟来接收,然后就是开启DMA各中断,链接回调函数 hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt;,确保开启SPI,设置DMA触发位。( ?$ |9 i$ N. j8 W1 g" @5 U) m 2,中断流程:* k2 F. [$ j/ d1 Y void DMA1_Channel2_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma_spi1_rx);}# |; q" c# `: K * F8 m8 A3 h- P4 Z* b HAL_DMA_IRQHandler(&hdma_spi1_rx);中 hdma->XferCpltCallback(hdma); 因为 hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; 等于调用了SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma);其中又调' F4 u9 R( v- G* V 用了HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi);该函数是用编写应用代码人地方。9 G" T J2 ^% K# J+ A ) \, F. Z1 u7 x' J/ @$ Q- W5 c9 T/ q " M( i2 U& U, T! K3 W5 J8 @ % X* s' X9 f" O* V9 \$ ` / t# C, l+ d2 }( R* ? e0 o , O9 n8 E8 c2 x; M- r6 X . U, r+ ]4 ~: |$ W7 ~/ e 6 z& Q% G" a( K/ c H+ x. S, }$ ~9 _ ) W6 B8 K6 K; e " J) @+ m& |; [: m/ D' F7 F |
微信公众号
手机版