历史上的今天
今天是:2025年08月15日(星期五)
2019年08月15日 | 初探STM32 SPI2中断接收多组数据的处理方式
2019-08-15 来源:eefocus
一、描述
两块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 );这条语句中,原因不知。
史海拾趣
|
学习,老师是非常关键的环节。对于嵌入式的学习当然也不例外。所以,在嵌入式的学习中,老师是很重要的要素之一。 嵌入式学习,挑选什么样的老师? 双师型老师。具体的来说,一方面,具备嵌入式的研发经验,有独立开发的项目和作品,在嵌入式行 ...… 查看全部问答> |
|
有如下英文: The SAA7130HL is a single chip solution to digitize and decode video, and capture it through the PCI-bus。 说的是SAA7130HL可以用来数字化和解码视频。 请问 1.数字化是不是把模拟的原始采集来的图像模拟信号数字化啊? 2 ...… 查看全部问答> |
|
我用的arm开发板,将U盘插进去后,显示的名称为 \"硬盘\",我想用重命名改名字但是不行,请问,大虾们,这个名字就不能改吗?想改成英文的。 谢谢!… 查看全部问答> |
|
哪位知道PB工程里FILEVIEW->C:\WINCE500->PLATFORM文件夹是空的,是什么原因啊? 哪位知道PB工程里FILEVIEW->C:\\WINCE500->PLATFORM文件夹是空的,是什么原因啊? 编译是正确的,但是这里就是不显示,没法单独编译某个驱动了!请各位高人帮帮忙啊! 如下图:C:\\PB.BMP … 查看全部问答> |
|
求助:linux2.6在ixp425平台上移植时time_init函数错误 UBOOT跑的很顺利,一次成功,但是LINUX移植死在了初始化时钟中断上,想破了头,查了很多资料都没效果.硬件平台是我们自己搭建的,没有用成熟的开发板.请教大虾们的帮助.… 查看全部问答> |




