用的是STM32F429IGT6,用 SPI2外设作为slave和其他设备通讯,通过中断方式接收外来的SPI数据,SPI通讯功能正常。
但是经常会发生在接收数据中途SPI_SR_BSY状态位一直被置1不变,导致SPI slave无法接收数据,并且重启SPI外设也没用,必须MCU复位才可以。看了手册PI_SR_BSY状态位是系统自动置1的,是硬件自动置位的,正常在数据完成接收之后就会置0。
这个问题一直找不到原因,是不是硬件哪里的配置问题。现在把SPI slave通讯相关的的代码贴上,还请大家帮忙找找可能是哪里的原因 谢谢了!
由于注释拷贝出来是乱码,就把注释删掉了。
以下是 SPI SLAVE配置代码
void SPI_COM_Init(void)
{
uint8_t temp;
SPI_COM_Handler.Instance=SPI_COM; //SPI2
SPI_COM_Handler.Init.Mode=SPI_MODE_SLAVE;
SPI_COM_Handler.Init.Direction=SPI_DIRECTION_2LINES;
SPI_COM_Handler.Init.DataSize=SPI_DATASIZE_8BIT;
SPI_COM_Handler.Init.CLKPolarity=SPI_POLARITY_LOW;
SPI_COM_Handler.Init.CLKPhase=SPI_PHASE_1EDGE;
SPI_COM_Handler.Init.NSS=SPI_NSS_HARD_INPUT;
SPI_COM_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2;
SPI_COM_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB;
SPI_COM_Handler.Init.TIMode=SPI_TIMODE_DISABLE;
SPI_COM_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;
SPI_COM_Handler.Init.CRCPolynomial=7;
HAL_SPI_Init(&SPI_COM_Handler);
__HAL_SPI_ENABLE_IT(&SPI_COM_Handler, SPI_IT_RXNE | SPI_IT_ERR );
HAL_NVIC_SetPriority(SPI_COM_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(SPI_COM_IRQn);
__HAL_SPI_ENABLE(&SPI_COM_Handler);
}
SPI 硬件管脚配置
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
GPIO_InitTypeDef GPIO_Initure;
SPI_COM_GPIO_CLK_ENABLE();
SPI_COM_CLK_ENABLE();
GPIO_Initure.Pin=SPI_COM_MISO_PIN | SPI_COM_NSS_PIN | SPI_COM_SCK_PIN | SPI_COM_MOSI_PIN;
GPIO_Initure.Mode=GPIO_MODE_AF_PP;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
GPIO_Initure.Alternate=SPI_COM_AF;
HAL_GPIO_Init(SPI_COM_GPIO_PORT,&GPIO_Initure);
}
SPI中断处理程序
void SPI_COM_IRQHandler(void)
{
//HAL_SPI_IRQHandler(&SPI_COM_Handler);
uint32_t tmp1 = 0,tmp2 = 0;
uint8_t TMP_RxData;
tmp1 = SPI_COM_Handler.Instance->SR;
tmp2 = SPI_COM_Handler.Instance->CR2;
if(tmp1 & SPI_SR_RXNE)
{
TMP_RxData = SPI_COM_Handler.Instance->DR;
SPI_COM_RxBuff[SPI_COM_Cmd.RxCounter] = TMP_RxData;
SPI_COM_Cmd.RxCounter++;
}
if(tmp1& SPI_SR_OVR )
{
TMP_RxData = SPI_COM_Handler.Instance->DR;
tmp1 = SPI_COM_Handler.Instance->SR;
SPI_COM_Handler.Instance->SR = tmp1 |(~SPI_SR_OVR);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>