求大神指点STM32 SPI1作为SLAVE模式接收另一个STM32 通过SPI发送过来的数据
时间:10-02
整理:3721RD
点击:
最近在做一个用一个STM32的SPI作为主机,另一个STM32的spi作为从机,接收主机发送的数据,主机每次发送的数据大小是固定的,310位。
中断接收数据没有问题,但是发现当主机的速率提升到8M的时候,从机就接收不到数据了,于是想用SPI的DMA方式来接收数据。
最近调试的时候发现,用DMA方式一直接收不到数据(SPI->DR是有数据的)附配置代码,求大神指点!
void DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_HandleTypeDef hdma1;
__HAL_RCC_DMA1_CLK_ENABLE();
HAL_DMA_DeInit(&hdma1);
hdma1.Instance = DMA1_Channel2;
hdma1.Instance->CPAR = SPI1_DR_Addr;//íaéèμ??·(uint32_t) 0x4001300C
hdma1.Instance->CMAR = (uint32_t)&SPI1_RX_buf; //memμ??·
hdma1.Instance->CNDTR = RX_TEMBUFFER_SIZE; //310′?ê?3¤?è
hdma1.Instance->CCR &= ~(1<<14);//ê§?üM-M′?ê?
hdma1.Init.Request = DMA_REQUEST_2;
hdma1.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma1.Init.MemDataAlignment = DMA_PDATAALIGN_WORD;
hdma1.Init.MemInc = DMA_MINC_ENABLE;
hdma1.Init.Mode = DMA_CIRCULAR;
hdma1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma1.Init.Priority = DMA_PRIORITY_VERY_HIGH;
HAL_DMA_Init(&hdma1);
SET_BIT(SPI1->CR2, SPI_CR2_RXDMAEN);
//SPI1->DR;
HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn,0,0);
HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
__HAL_DMA_ENABLE_IT(&hdma1,DMA_IT_TC);
__HAL_DMA_ENABLE_IT(&hdma1,DMA_IT_TE);
__HAL_DMA_ENABLE_IT(&hdma1,DMA_IT_HT);
__HAL_DMA_ENABLE(&hdma1);
中断接收数据没有问题,但是发现当主机的速率提升到8M的时候,从机就接收不到数据了,于是想用SPI的DMA方式来接收数据。
最近调试的时候发现,用DMA方式一直接收不到数据(SPI->DR是有数据的)附配置代码,求大神指点!
void DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_HandleTypeDef hdma1;
__HAL_RCC_DMA1_CLK_ENABLE();
HAL_DMA_DeInit(&hdma1);
hdma1.Instance = DMA1_Channel2;
hdma1.Instance->CPAR = SPI1_DR_Addr;//íaéèμ??·(uint32_t) 0x4001300C
hdma1.Instance->CMAR = (uint32_t)&SPI1_RX_buf; //memμ??·
hdma1.Instance->CNDTR = RX_TEMBUFFER_SIZE; //310′?ê?3¤?è
hdma1.Instance->CCR &= ~(1<<14);//ê§?üM-M′?ê?
hdma1.Init.Request = DMA_REQUEST_2;
hdma1.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma1.Init.MemDataAlignment = DMA_PDATAALIGN_WORD;
hdma1.Init.MemInc = DMA_MINC_ENABLE;
hdma1.Init.Mode = DMA_CIRCULAR;
hdma1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma1.Init.Priority = DMA_PRIORITY_VERY_HIGH;
HAL_DMA_Init(&hdma1);
SET_BIT(SPI1->CR2, SPI_CR2_RXDMAEN);
//SPI1->DR;
HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn,0,0);
HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
__HAL_DMA_ENABLE_IT(&hdma1,DMA_IT_TC);
__HAL_DMA_ENABLE_IT(&hdma1,DMA_IT_TE);
__HAL_DMA_ENABLE_IT(&hdma1,DMA_IT_HT);
__HAL_DMA_ENABLE(&hdma1);
自己顶一下
自己给自己顶一下,已解决