|
用HAL_SPI_Receive_DMA(&hspi1, pBuffer, NumByteToRead); HAL_UART_Receive_DMA(&hspi1, pBuffer, NumByteToRead); 带DMA的接的,不能在此函数下面紧接着使用 这pBuffer中的数据,因为这些函数设置好传输参数,传输刚开始,pBuffer中还没有接收完数据。在这个时候如果是和芯片传数据,更不能关闭,芯片的使能。 1,可以在此类函数下面设置延时等待,然后操作pBuffer. 2,可以在DMA中断回调函数中操作数据。使用DMA传输,STM32Cube默认使能DMA传输完成中断,最终会调用HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi); 3,可先判断while(hspi1.State!=HAL_SPI_STATE_READY);STM32Cube生成的代码中,时时指示着各模的状态,传输时状态为忙。 State在 SPI_HandleTypeDef结构中定义; 用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触发位。 2,中断流程: void DMA1_Channel2_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma_spi1_rx);} HAL_DMA_IRQHandler(&hdma_spi1_rx);中 hdma->XferCpltCallback(hdma); 因为 hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; 等于调用了SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma);其中又调 用了HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi);该函数是用编写应用代码人地方。 |
微信公众号
手机版