any012 发表于 2016-5-18 11:53:37

spi做从设备时,接受处理程序,只能处理第一个字节...

本帖最后由 any012 于 2016-5-18 11:57 编辑

主设备连续发送4个16位的数据,第一个是0x3a05,于是想用这个数据来作为帧首判断,结果想在SPI中断里将串口接收到的数组发送出来,总是不成功。
于是精简了下函数,只发送spi2Num这个数,结果总是1...

void SPI2_IRQHandler(void)
{
    u8 spi2Num, i;
    u16 spi2Temp;
    spi2Temp = SPI_I2S_ReceiveData(SPI2);
    if(spi2Num == 0)
    {
      if(spi2Temp == 0x3a05)
      {
            spi2Num = 1;
      }
    }
    else
    {
      spi2Num++;
      if(spi2Num > 5)
            spi2Num = 0;
    }
    printf("\r\nspi2Num: %d", spi2Num);
}


sting 发表于 2016-5-18 11:53:38

spi2num又没定义成static,所以每次进入SPI2_IRQHandler,spi2num就从0开始

power568 发表于 2016-5-18 13:41:09

支持楼上的,能出来一已经算幸运了...

any012 发表于 2016-5-18 14:12:20

感谢楼上两位,我真该挨敲。

any012 发表于 2016-5-18 14:26:22

本帖最后由 any012 于 2016-5-18 14:31 编辑

再请教下,将spi2Num改成全局变量后,可以打印出spi2Recive[]数组了,但结果全是0x3a05.我用示波器观察了波形,主设备发送过来的数据只有第一个是0x3a05.

修改后的程序:
void SPI2_IRQHandler(void)
{
      static u16 spi2Recive;
      static u8 spi2Num;
      u8 i;
      u16 spi2Temp;
      spi2Temp = SPI_I2S_ReceiveData(SPI2);
      if(spi2Num == 0)
      {
                if(spi2Temp == 0x3a05)
                {
                        spi2Num = 1;
                        spi2Recive = spi2Temp;
//                        SPI_I2S_SendData(SPI2, spi2Temp);
//                        printf("\r\nthe first data is: %x", spi2Temp);
                }
      }
      else
      {
                spi2Recive = spi2Temp;
                spi2Num++;
                if(spi2Num > 5)
                {
                        spi2Num = 0;
                        for(i = 0; i < 5; i++)
                              printf("\r\nspi2recive[%d]: %x", i, spi2Recive);
//                        SPI_I2S_SendData(SPI2, 0x3a05);
                }
      }
//      printf("\r\nspirecive: %x", spi2Temp);
      printf("\r\nspi2Num: %d", spi2Num);
}

串口输出结果:
spi2recive: 3a05
spi2recive: 3a05
spi2recive: 3a05
spi2recive: 3a05
spi2recive: 3a05
spi2Num: 0

any012 发表于 2016-5-18 14:33:51

感觉SPI中断函数只能处理第一个16位数据。

any012 发表于 2016-5-18 14:46:58

是不是中断函数做的事太多了,除了帧首,其他的数据SPI中断没有响应过来?



sting 发表于 2016-5-19 11:21:50

可能发生OVR

any012 发表于 2016-5-19 11:41:55

将SPI中断处理函数精简后正常了。

any012 发表于 2016-5-19 14:03:18

本帖最后由 any012 于 2016-5-19 14:04 编辑

编辑,回复错帖子了。
页: [1]
查看完整版本: spi做从设备时,接受处理程序,只能处理第一个字节...