初探STM32 SPI2中断接受多组数据的处理方式

初探STM32 SPI2中断接受多组数据的处理方式

一、描述

        两块STM32板子之间进行SPI通讯,都使用的是SPI2。主机连续发送多组数据(数据的格式为半字,即16位),从机采用SPI2中断方式接受主机发过来的多组数据。

针对从机中断接受方法我尝试了两种方案:

方案一:从机每接收主机发来的一组数据就进入中断一次,即主机发来几组数据从机就进入几次中断。

方案二:仅当主机发来第一组数据时,从机才触发一次中断,然后关闭中断,以循环接受的方式接受主机发过来的剩下几组数据,当所有数据接受完后,再打开从机的接受中断。

二、程序

        因为两种方案的主机程序是一样的,如下:

uint16_t  ADC_ConvertedValueLocal[SPI2_TxDataLength];
uint8_t   i;
for(i = 0;i < SPI2_TxDataLength;i++)
{
SPI_I2S_SendData(SPI2 , ADC_ConvertedValueLocal[i]); 
delay_us(10);//自己写的延时函数	
}


从机程序:

方案一的如下:

uint16_t  SPI2_RxBuf[SPI2_RxDataLength];
uint8_t   i;
void SPI2_IRQHandler(void)
{
 if (SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE) == SET)
 {  
  SPI_I2S_ClearITPendingBit( SPI2 , SPI_I2S_IT_RXNE );
  for(i = 0;i < SPI2_RxDataLength;i++)
  {
  while(SPI_I2S_GetFlagStatus(SPI2 , SPI_I2S_FLAG_RXNE)==RESET );
  SPI2_RxBuf[i] = SPI_I2S_ReceiveData(SPI2);
  }
 }
}

方案二的如下:

uint16_t  SPI2_RxBuf[SPI2_RxDataLength];
uint8_t   i;
void SPI2_IRQHandler(void)
{
 if (SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE) == SET)
 {  
  SPI_I2S_ClearITPendingBit( SPI2 , SPI_I2S_IT_RXNE );
  SPI_I2S_ITConfig( SPI2, SPI_I2S_IT_RXNE, DISABLE  );//关闭中断
  for(i = 0;i < SPI2_RxDataLength;i++)
  {
  while(SPI_I2S_GetFlagStatus(SPI2 , SPI_I2S_FLAG_RXNE)==RESET );//等待接受缓冲器空
  SPI2_RxBuf[i] = SPI_I2S_ReceiveData(SPI2);
  }
  SPI_I2S_ITConfig( SPI2, SPI_I2S_IT_RXNE, ENABLE );//开启中断
 }
}

三、分析

         从两个从机的程序来看,差别就在于是否关闭开启中断。但是实际工作起来差别就大了,若用方案一会出现这样的问题,主机连续的发数时,从机会不断的进入中断,此时从机会因为进入中断频繁而导致数据出错,实际证明也是如此。

而方案二,采用的是主机的第一组数据触发中断,当进入中断后将中断暂时关闭,将主机发过来的数依次存好后,再打开中断,等待主机传来下一批数据。方案二另外还有两点需要注意:

1、必须主从之间商量好,你发几组数据,我接几组数据。就是说数据的个数不能随机变。

2、注意到主机发送程序中那句延时语句,主机发送两个数据之间要有一定的延时,不然从机就会死在while(SPI_I2S_GetFlagStatus(SPI2 , SPI_I2S_FLAG_RXNE)==RESET );这条语句中,原因不知。

四、分享交流

       欢迎各位能不吝赐教,多多指点,互相交流,共同进步。总之,如果你对文有什么意见或建议,还望写下评论,不胜感激!

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值