历史上的今天
返回首页

历史上的今天

今天是: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 );这条语句中,原因不知。


推荐阅读

史海拾趣

Cooper Industries公司的发展小趣事

在电工产品领域,Cooper Industries同样取得了显著的成就。2000年,公司收购了Eagle电气,并将其与已有的接线装置产品系列合并,组建成了一个名为“库柏电工”的新事业部。这一举措不仅丰富了公司的产品线,也使其在电工产品领域的技术实力得到了进一步提升。库柏电工提供了超过10000个高质量装置的产品组合,广泛应用于工业、商业和住宅领域,满足了不同客户的需求。同时,公司还不断投入研发,推出更加先进、高效的电工产品,为行业的发展做出了积极贡献。

台湾兆欣(EMTEK)公司的发展小趣事

兆欣科技股份有限公司成立于2003年,由一群怀揣梦想的电子工程师创立。在创立之初,公司就明确了自己的目标:开发和量产全自动、小型化的SMD绕线电感。这一决定在当时的市场上并不常见,但兆欣团队坚信这是未来的趋势。他们投入大量时间和精力进行研发,成功推出了共模滤波器、高频芯片电感以及薄型功率电感等主力产品。

AntennaHome公司的发展小趣事

随着5G技术的快速发展,电子行业迎来了新的变革。AntennaHome公司面临着来自行业内外的巨大挑战。为了应对这一变革,公司加大了对5G天线技术的研发力度,同时积极调整产品结构和市场策略。经过一段时间的努力,公司成功推出了多款适应5G时代需求的新型天线产品,为公司的持续发展奠定了坚实的基础。

Firadec公司的发展小趣事

背景:假设Firadec公司(此处为虚构名称)成立于20世纪90年代初,正值半导体技术快速发展的时期。公司创始人是一位在半导体领域有深厚造诣的科学家,他带领团队研发出了一种新型低功耗、高性能的集成电路技术。

发展:这项技术迅速获得了市场的认可,Firadec公司凭借这一创新产品迅速在电子行业崭露头角。公司不断加大研发投入,持续优化产品性能,逐渐在智能手机、平板电脑等消费电子领域占据了一席之地。

影响:随着技术的不断成熟和应用领域的拓展,Firadec公司的市场份额逐年提升,成为了电子行业中的佼佼者。其技术创新不仅推动了公司自身的发展,也为整个电子行业的进步做出了重要贡献。

CT Micro公司的发展小趣事
  1. 创业初期与技术创新

CT Micro公司最初由几位电子工程领域的专家创立,他们看到了微型计算机断层扫描(Micro-CT)技术在电子行业中的巨大潜力。初期,公司面临着资金短缺和技术难题,但他们通过不断研发和创新,成功开发出了一款具有高性价比的Micro-CT设备,迅速获得了市场的认可。

  1. 市场拓展与合作伙伴关系

随着产品的成熟,CT Micro开始积极寻求市场拓展。他们与多家电子制造企业建立了合作关系,为这些企业提供Micro-CT设备的定制服务。通过与这些企业的合作,CT Micro不仅扩大了市场份额,还进一步提升了产品的技术水平和应用范围。

  1. 研发升级与产品迭代

面对日益激烈的市场竞争,CT Micro不断投入研发力量,对Micro-CT设备进行升级和迭代。他们成功推出了多款新型设备,具有更高的分辨率、更快的扫描速度和更低的辐射剂量。这些新产品的推出,进一步巩固了CT Micro在电子行业中的领先地位。

  1. 国际化战略与市场拓展

随着国内市场的饱和,CT Micro开始实施国际化战略。他们积极参与国际展览和研讨会,展示自己的产品和技术实力。同时,他们还在海外设立了销售和服务中心,为国际客户提供更加便捷的服务。通过这些努力,CT Micro成功打开了国际市场的大门。

  1. 社会责任与可持续发展

在快速发展的同时,CT Micro也积极履行社会责任。他们注重环保和可持续发展,采用环保材料和节能技术生产产品。此外,他们还积极参与公益事业,为贫困地区的教育和医疗事业贡献力量。这些举措不仅提升了公司的社会形象,也为其可持续发展奠定了坚实基础。

请注意,这些故事框架是虚构的,并不代表CT Micro公司的实际发展情况。如果您需要了解CT Micro公司或类似公司的真实故事,建议您查阅相关公司的官方网站、新闻报道或行业分析报告。

EMBEST公司的发展小趣事

随着公司业务的不断拓展和市场规模的逐步扩大,EMBEST在XXXX年成立了Timll和Giayee两个子公司。其中,Timll主要负责ARM工控业务,而Giayee则专门负责PDA/Smart Phone等业务。这两个子公司的成立不仅进一步拓展了EMBEST的业务领域,也为其未来的发展注入了新的活力。通过多元化的业务布局和精细化的管理,EMBEST在电子行业中的影响力日益增强。

问答坊 | AI 解惑

Protel dxp2004注册不了

分别装了proteldxp2004四个程序,到最后注册不了,请教是什么问题,…

查看全部问答>

嵌入式学习,嵌入式学习有哪些要素呢

学习,老师是非常关键的环节。对于嵌入式的学习当然也不例外。所以,在嵌入式的学习中,老师是很重要的要素之一。 嵌入式学习,挑选什么样的老师? 双师型老师。具体的来说,一方面,具备嵌入式的研发经验,有独立开发的项目和作品,在嵌入式行 ...…

查看全部问答>

有人改写过uip使用双缓存么?

tcp ip 轻量级开源协议uip使用单缓存收发数据,有前辈改写过,让它使用双缓存么,分离收发的缓存?改写后的效果如何,有没有带来实际的好处?…

查看全部问答>

今天实在很生气

以前买了一块S3C44B0开发板,附带了一块JTAG板和一根连接线。 之前我一直没有用使用JTAG板 ,这几天想下载程序到板子里面,就用了它,可是总是不能成功。用H-JTAG检测芯片的型号,都没成功,于是我就找原因。一连被折腾了好几天,浪费我这么多时间 ...…

查看全部问答>

没分了,请精通视频芯片开发的帮帮忙?

有如下英文: The SAA7130HL is a single chip solution to digitize and decode video, and capture it through the PCI-bus。 说的是SAA7130HL可以用来数字化和解码视频。 请问 1.数字化是不是把模拟的原始采集来的图像模拟信号数字化啊? 2 ...…

查看全部问答>

弱弱问一下 给U盘重命名的问题?

我用的arm开发板,将U盘插进去后,显示的名称为 \"硬盘\",我想用重命名改名字但是不行,请问,大虾们,这个名字就不能改吗?想改成英文的。 谢谢!…

查看全部问答>

哪位知道PB工程里FILEVIEW->C:\WINCE500->PLATFORM文件夹是空的,是什么原因啊?

哪位知道PB工程里FILEVIEW->C:\\WINCE500->PLATFORM文件夹是空的,是什么原因啊? 编译是正确的,但是这里就是不显示,没法单独编译某个驱动了!请各位高人帮帮忙啊! 如下图:C:\\PB.BMP …

查看全部问答>

求助:linux2.6在ixp425平台上移植时time_init函数错误

UBOOT跑的很顺利,一次成功,但是LINUX移植死在了初始化时钟中断上,想破了头,查了很多资料都没效果.硬件平台是我们自己搭建的,没有用成熟的开发板.请教大虾们的帮助.…

查看全部问答>