/*
* SPI硬件初始化,内存地址初始化
*/
static void Init(void)
{
uint8_t i;
/*失能SPI1*/
HAL_SPI_DeInit(&hspi1);
/*清空FpgaRevData内存*/
for(i=0;i { memset(FpgaRevData[i],0,FPGA_DATA_PAKET_LENGTH); } /*初始化内存指针*/ gWritePtr=0; gReadPtr=0; /*使能SPI1*/ HAL_SPI_Init(&hspi1); /*SPI DMA初始化,并开启一次数据接收*/ HAL_SPI_Receive_DMA_INIT(&hspi1,FpgaRevData[gWritePtr],FPGA_DATA_PAKET_LENGTH); } /* * SPI DMA初始化,并开启一次数据接收, * 关键是返回函数的初始化,DMA 源地址和目的地址的初始化,各标志位的清空与开启 * 该程序修改与HAL库的HAL_SPI_Receive_DMA函数 */ void HAL_SPI_Receive_DMA_INIT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) { hspi->State = HAL_SPI_STATE_BUSY_RX; hspi->RxXferSize = Size; /*Init field not used in handle to zero */ hspi->RxISR = NULL; /* Set the SPI Rx DMA transfer complete callback */ hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; /* Enable the Rx DMA Stream */ HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)(uint8_t *)pData, Size); /* Check if the SPI is already enabled */ if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE) { /* Enable SPI peripheral */ __HAL_SPI_ENABLE(hspi); } /* Enable the SPI Error Interrupt Bit */ SET_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE); /* Enable Rx DMA Request */ SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); } /* * FPGA SPI1数据接收函数,一次接收6个字节数据包 * 该程序修改与HAL库的HAL_DMA_Start_IT函数和HAL_SPI_Receive_DMA函数 */ __INLINE void FPGA_ReadBuffer(SPI_HandleTypeDef *hspi, uint8_t *DstAddress) { // HAL_StatusTypeDef status = HAL_OK; /* calculate DMA base and stream number */ // DMA_Base_Registers *regs = (DMA_Base_Registers *)(hspi->hdmarx)->StreamBaseAddress; /* Process locked */ // __HAL_LOCK(hspi->hdmarx); // // if(HAL_DMA_STATE_READY == hspi->hdmarx->State) // { /* Change DMA peripheral state */ // hspi->hdmarx->State = HAL_DMA_STATE_BUSY; /* Clear DBM bit */ hspi->hdmarx->Instance->CR &= (uint32_t)(~DMA_SxCR_DBM); /* Configure DMA Stream destination address */ hspi->hdmarx->Instance->M0AR = (uint32_t)(uint8_t *)DstAddress; /* Clear all interrupt flags at correct offset within the register */ // regs->IFCR = 0x3FU << hspi->hdmarx->StreamIndex; /* Enable Common interrupts*/ hspi->hdmarx->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; hspi->hdmarx->Instance->FCR |= DMA_IT_FE; /* Enable the Peripheral */ __HAL_DMA_ENABLE(hspi->hdmarx); // } // else // { // /* Process unlocked */ // __HAL_UNLOCK(hspi->hdmarx); // // /* Return error status */ // status = HAL_BUSY; // } /* Check if the SPI is already enabled */ // if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE) // { // /* Enable SPI peripheral */ // __HAL_SPI_ENABLE(hspi); // } /* Enable the SPI Error Interrupt Bit */ SET_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE|SPI_CR2_RXDMAEN); // /* Enable Rx DMA Request */ // SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); // return HAL_OK; } /* *SPI 返回函数,打开SPI DMA开关,一次接收6个字节数据包 */ void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) { if(hspi==&hspi1) { //HAL_SPI_DMAStop(hspi);//先关掉DMA /* Disable the SPI DMA Tx & Rx requests */ CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);//关掉DMA其实就是执行了这个操作 if((gWritePtr + 1 == gReadPtr) || (gWritePtr == REV_MAX_NUM && gReadPtr == 0))//我的数据存储在一个二维数组中,这里判断满了 return ; gWritePtr++; if (gWritePtr==REV_MAX_NUM) gWritePtr=0; FPGA_ReadBuffer(hspi,FpgaRevData[gWritePtr]); } } 当SPI DMA硬件初始化(SPI DMA mode为DMA_NORMAL)后,就可以开始一次初始
化HAL_SPI_Receive_DMA_INIT,之后,当有数据到来,SPI接收完成返回函数会被调用,在返回函数中,首先关掉DMA,接收到数据后,提供下一次接收数据的地址,重新打开DMA。
上一篇:STM32:Flash擦除与读写操作(HAL库)
下一篇:STM32 Flash 擦除 读写 成功
推荐阅读最新更新时间:2024-03-16 16:11
设计资源 培训 开发板 精华推荐
- 等你报名做客黑科技直播间:基于 TI DLP®技术的工业创新应用介绍
- 【EEWORLD第四十二届】2012年09月社区明星人物揭晓!
- 看视频抽好礼:Type-C承载的高速串行标准,功能多样,挑战也不小
- 有奖报名 | 安富利邀您云逛展2023中国国际工业博览会
- 英飞凌MERUS™ D类音频解决方案|【阅读赢好礼,下单送开发板】
- 智能云锁哪家强?TI市场和技术大咖邀你1月16日10:00直播间畅聊
- Silicon Labs EFM32PG22开发套件 传你所思 创你所想!申请进行时!
- 【预约有礼】全球测量圈大咖直播:验证5G核心网,确保最佳性能
- 12月6日上午10:00有奖直播:如何使用Microchip安全方案为IoT设备保驾护航