你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

spi中断处理函数不被执行...

[复制链接]
any012 提问时间:2016-6-15 15:46 /
悬赏9ST金币未解决
本帖最后由 any012 于 2016-6-15 15:48 编辑

stm32作为从设备,要通过spi2和主设备通讯。
现在是用中断接收数据的,接收完一帧信息后置个标志位。
主程序里有个函数,函数中判断spi接收标志位,如果是1的话,通过串口将接收到的数据发送出来。

以上这部分,磕磕碰碰的算是调通了(画了很久)。主函数里不能只做spi通讯部分吧,然后加上其他程序部分。结果spi通讯这里就不工作了...

  1.         while(1)
  2.         {
  3.                 SPI2_SalveProcess();
  4.                 printf("\r\n\r\nhahaha);
  5.         }
复制代码

主函数里的第一个语句,是spi2通讯部分的函数,如果只保留这个,通讯没问题。然后在其后随便加了个printf语句,结果spi通讯就不工作了...
具体现象是,不再通过串口将接收到的数据发送过来,并且作为spi从设备,接收数据的同时,应该也发送数据,结果,没有数据发出去。

以下为SPI2_SalveProcess()函数:
  1. void SPI2_SalveProcess()
  2. {
  3.         u8 i;
  4.         if(COMP_OK())
  5.         {
  6.                 LVDS_EN(0);               
  7.         }
  8.         else
  9.         {
  10.                 if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7) == 0)
  11.                 {
  12.                         LVDS_EN(1);
  13.                         SPI_I2S_SendData(SPI2, spi2RecvBuff[0]);        
  14.                 }
  15.         }
  16.         if(spi2RecvOk == 1)
  17.         {
  18.                 printf("\r\nSPI2 recive sucess");
  19.                 for(i = 0; i < 5; i++)
  20.                         printf("\r\nspi2RecvBuff[%d]: %04x", i, spi2RecvBuff[i]);
  21.                 spi2RecvOk = 0;
  22.                 spi2RecvNum = 0;
  23.         }
  24. }
复制代码

以下为spi2中断处理函数:
  1. void SPI2_IRQHandler(void)
  2. {
  3.         u16 spi2Temp;
  4.         spi2Temp = SPI_I2S_ReceiveData(SPI2);
  5.         
  6.         if(spi2RecvOk == 0)
  7.         {
  8.                 if(spi2RecvNum == 0)
  9.                 {
  10.                         if((spi2Temp & 0xff00) == 0x3a00)
  11.                         {
  12.                                 SPI_I2S_SendData(SPI2, spi2SendBuff[1]);
  13.                                 spi2RecvBuff[0] = spi2Temp;
  14.                                 spi2RecvNum = 1;
  15.                                 spi2SendNum = 2;
  16.                         }
  17.                         else
  18.                                 SPI_I2S_SendData(SPI2, spi2SendBuff[0]);
  19.                 }
  20.                 else
  21.                 {
  22.                         SPI_I2S_SendData(SPI2, spi2SendBuff[spi2SendNum]);
  23.                         spi2RecvBuff[spi2RecvNum] = spi2Temp;
  24.                         spi2RecvNum++;
  25.                         if(spi2RecvNum > 4)
  26.                                 spi2RecvOk = 1;
  27.                         spi2SendNum += 1;
  28.                         spi2SendNum %= 5;
  29.                 }
  30.         }
  31. }
复制代码

串口只开了接收中断,并且,现在的操作,并没有通过串口向单片机发送数据。
spi2也只是开了接收中断。
以下为中断优先级配置:
  1. void NVIC_Configuration(void)
  2. {
  3.         NVIC_InitTypeDef NVIC_InitStructure;
  4.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  5.        
  6.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  7.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  8.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  9.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  10.         NVIC_Init(&NVIC_InitStructure);
  11.        
  12.         NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
  13.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  14.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  15.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  16.         NVIC_Init(&NVIC_InitStructure);
  17.        
  18.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  19.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  20.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  21.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  22.         NVIC_Init(&NVIC_InitStructure);
  23.        
  24.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  25.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  26.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  27.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  28.         NVIC_Init(&NVIC_InitStructure);
  29. }
复制代码





收藏 评论1 发布时间:2016-6-15 15:46

举报

1个回答
any012 回答时间:2016-6-15 17:25:49
SPI2_SalveProcess()函数里包含这部分,这部分是检测COMP_OK管脚,使LVDS_EN管脚和它反向。
函数里再加上其他部分,整个扫描周期变长,是的LVDS_EN不能及时反转,所以SPI信号过不来。
现在想,应该是这个问题。
如果是这样的话,只能把COMP_OK改成外部中断了。
  1. if(COMP_OK() != 0)
  2.         {
  3.                 LVDS_EN(0);               
  4.         }
  5.         else
  6.         {
  7.                 if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7) == 0)
  8.                 {
  9.                         LVDS_EN(1);
  10.                         SPI_I2S_SendData(SPI2, spi2RecvBuff[0]);       
  11.                 }
  12.         }
复制代码

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版