打印
[STM32]

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

[复制链接]
1561|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
any012|  楼主 | 2016-5-18 11:52 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
spi, TE, DSP, ce, se
本帖最后由 any012 于 2016-5-18 11:56 编辑

主设备连续发送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);
}



相关帖子

沙发
aozima| | 2016-5-18 14:20 | 只看该作者
SPI从机通讯建议以CS为帧,而不要靠数据内容。

使用特权

评论回复
板凳
any012|  楼主 | 2016-5-18 14:27 | 只看该作者
aozima 发表于 2016-5-18 14:20
SPI从机通讯建议以CS为帧,而不要靠数据内容。

谢谢。
目前已经知道这一步问题的原因了。
是没有把spi2Num设为全局变量。

使用特权

评论回复
地板
any012|  楼主 | 2016-5-18 14:30 | 只看该作者
然后又有新问题了,主机发送过来的5个16位数据,帧首是0x3a05,我修改程序后,串口把接受的数组发送过来,结果全是0x3a05。

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


串口法伤过来的数据:
spi2recive[0]: 3a05
spi2recive[1]: 3a05
spi2recive[2]: 3a05
spi2recive[3]: 3a05
spi2recive[4]: 3a05
spi2Num: 0

使用特权

评论回复
5
any012|  楼主 | 2016-5-18 14:33 | 只看该作者
感觉SPI中断函数只能处理第一个16位数据。

使用特权

评论回复
6
any012|  楼主 | 2016-5-18 14:47 | 只看该作者
是不是中断函数做的事太多了,除了帧首,其他的数据SPI中断没有响应过来?



使用特权

评论回复
7
aozima| | 2016-5-18 14:55 | 只看该作者
SPI从机端建议使用DMA,以CS释放作为通信结束检查。

使用特权

评论回复
8
any012|  楼主 | 2016-5-18 15:12 | 只看该作者
aozima 发表于 2016-5-18 14:55
SPI从机端建议使用DMA,以CS释放作为通信结束检查。

谢谢您的建议。
还没用过DMA呢,抽空试试。

使用特权

评论回复
9
any012|  楼主 | 2016-5-19 11:43 | 只看该作者
精简中断处理函数后正常了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

232

帖子

6

粉丝