历史上的今天
返回首页

历史上的今天

今天是:2024年12月26日(星期四)

正在发生

2018年12月26日 | 初探STM32 SPI2中断接受多组数据的处理方式

2018-12-26 来源: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 );这条语句中,原因不知。

推荐阅读

史海拾趣

Eaton公司的发展小趣事

伊顿公司起源于1911年,由Viggo Torbensen和年轻商人Joseph Eaton共同创建的Torbensen齿轮轴承公司,这是伊顿的前身。Joseph Eaton坚信战略收购是拓展业务的最佳方法,因此在公司的发展过程中,他积极推动了一系列重要的收购活动。随着时间的推移,公司的产品逐渐多元化,从最初的齿轮轴承扩展到更广泛的能源管理领域。到1932年,公司更名为伊顿制造公司,进一步彰显了其向多元化发展的决心。

中环(Central)公司的发展小趣事

随着公司业务的不断拓展,中环在保持主业优势的同时,也积极开展多元化发展。2014年,公司开始开展光伏电站开发业务,进一步延伸了产业链。同时,公司还成立了东方环晟,开拓了组件业务。这些举措不仅为公司带来了新的增长点,也增强了其综合竞争力。

Datapro International Inc公司的发展小趣事

面对不断变化的市场环境和客户需求,Datapro International Inc公司始终保持着对创新的追求。他们不断投入研发资源,推动新技术和新产品的不断涌现。同时,他们还积极关注行业趋势和客户需求的变化,以便及时调整自己的发展战略和业务模式。

在未来的发展中,Datapro International Inc公司将继续秉承“创新、质量、服务”的理念,致力于为客户提供更加卓越的产品和服务。同时,他们也将积极探索新的市场机会和商业模式,以实现更加持续、稳健的发展。

请注意,以上故事均为虚构内容,旨在展示一个电子行业公司可能的发展历程和故事。如需了解Datapro International Inc公司的真实历史和发展故事,请查阅相关官方资料或行业报告。

Hongfa公司的发展小趣事

Hongfa宏发公司,全称厦门宏发电声股份有限公司,由郭满金先生于1984年创立。公司初创时,仅有简陋的厂房和设备,投资不过360万元,员工仅数十人。但宏发从一开始就明确了产品定位与市场定位,专注于继电器研发及制造领域。1987年,宏发成功以中国厂家商标及型号取得UL认证,进一步奠定了其在国际市场上的基础。通过不断的技术积累和市场开拓,宏发逐渐在国内继电器行业中崭露头角。

登丰微(GSTEK)公司的发展小趣事

随着电子行业的快速发展和市场需求的不断变化,歌普电子也在积极调整战略布局,以应对未来的挑战和机遇。公司不仅在现有产品领域持续深耕细作,还积极探索新的业务领域和增长点。通过多元化布局和不断创新,歌普电子致力于成为电子行业的领军企业之一。未来,歌普将继续秉承“创新、高效、尊重、负责”的文化理念,为客户提供更加优质的产品和服务,共同推动电子行业的繁荣发展。

百蓉(ECE)公司的发展小趣事

百蓉公司不满足于仅在国内市场发展,开始积极拓展国际市场。他们参加了多个国际电子展览,与多家国际知名企业建立了合作关系。通过深入了解不同国家和地区的市场需求,百蓉针对性地推出了符合当地消费者需求的产品,逐渐在国际市场上占据了一席之地。

问答坊 | AI 解惑

单电源供电下模拟电源和数字电源的分离?

现在有个IC需要模拟5V和数字5V同时供电,我采用一个锂电升压5V给它供电,想询问下只有一个锂电的情况下怎么做到模拟电源和数字电源分离。…

查看全部问答>

高频开关电源设计中的电磁兼容性问题研究

高频开关电源设计中的电磁兼容性问题研究…

查看全部问答>

AD转换程序,急了。。。请大家帮忙看一下。

我是想这样写的,定时器定时2MS,中断标志一个变量之后,启动ADC转换,把转换到的数据发用串口发送出去。。 这样算的话,采样大约是:400HZ。 采用外部基准电压。。。AVCC=5V /***************************** 2010 05 30 ; 功能:ADC转换,然 ...…

查看全部问答>

QQ2440录音放音问题

找不到合适的版块发这贴...就在这里向大家请教了,请不吝赐教 小弟想在QQ2440板上做一个语音采集与压缩程序,现在用一段测试代码在我的主机上可以正常录音放音,但重新编译后转到板上就不行了,测试代码如下: /** record.c **/ #include #inclu ...…

查看全部问答>

C8051F组的焊接问题

请问R16下面的那个没有标的是不是R15?…

查看全部问答>

ulink2下载程序出问题

                                 刚开始做STM32F101系列,写一个小程序一下载就说flash download failed  CORTEX-M3,也按照网上说配置FL ...…

查看全部问答>

Jlink V8可以支持LM4F吗?

不知道现在市面上流行的那些山寨Jlink V8是否支持新出的LM4F MCU?…

查看全部问答>

模拟电子视频教程

哪位有 模拟电子技术 功率放大电路好的视频教程 分享一下 谢谢…

查看全部问答>

关于web远程控制嵌入式设备

查了很久资料,发觉都是把服务器安装在嵌入式设备身上的。。 但是有几点不懂: 1.PC机怎么访问嵌入式设备?   嵌入式设备只是单单插了网线的喔,没有串口连接PC机的。  如果说直接用浏览器打开相关的IP地址的话,那是不是就 ...…

查看全部问答>

msp430单片机与SIM900模块的连接

各位高手,请问sim900与msp430通信是不是只需要将它们的串口连接起来就行了,还需要连其他管脚吗?…

查看全部问答>