打印
[STM32]

SPI从模式接收数据不正确,附波形图。

[复制链接]
4016|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
any012|  楼主 | 2016-5-28 09:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
spi, se, TE, AC, ST
用STM32做SPI从设备,接受用的中断,每接收一次数据,将要发送的数据放到发送寄存器里。

第一张是SCL和MOSI的波形图。


第二张是SCL和MISO的波形。

可以看到我的STM32从设备发送到第二和第三个数据是一样的。其实是不一样的,第一个发送的数是正确的,第二个数发送了两遍,然后发送第三、第四个数。想第五个数被吃掉了...

以下为SPI中断函数。
void SPI2_IRQHandler(void)
{
        static u8 spi2Num;
        u16 spi2Temp;
        
        spi2Temp = SPI_I2S_ReceiveData(SPI2);
        if(spi2Num == 0)
        {
                if(spi2Temp == 0x3a05)
                {
                        spi2Num = 1;
                        spi2RecvBuff[0] = spi2Temp;
                        SPI_I2S_SendData(SPI2, spi2SendBuff[1]);
                }
        }
        else
        {
                spi2RecvBuff[spi2Num] = spi2Temp;
                spi2Num++;               
                if(spi2Num > 4)
                {
                        spi2Num = 0;
                        spi2ReciveOk = 1;
                }
                SPI_I2S_SendData(SPI2, spi2SendBuff[spi2Num]);
        }
}



相关帖子

沙发
yklstudent| | 2016-5-28 11:55 | 只看该作者
分享一个自己写的SPI中断发送与中断接收通信程序;1、平台为STM32F072的SPI1与SPI2通信,具体中断处理函数如下所示:
其具体只负责数据的发送与接收工作
void SPI1_IRQHandler(void)
{
        uint16_t l_recv_data;
       
        /*Master*/
        /* SPI in Master Tramitter mode--------------------------------------- */
        if (SPI_I2S_GetITStatus(SPIx1, SPI_I2S_IT_TXE) == SET)
        {
                SPI_I2S_SendData16(SPIx1, lusMSpiStack.fifo.txBuf[lusMSpiStack.fifo.index]);
                lusMSpiStack.fifo.index++;
                if (lusMSpiStack.fifo.index == lusMSpiStack.fifo.length)
                {
                        lusMSpiStack.fifo.index = 0;
                        lusMSpiStack.fifo.status = 0;
                        _BIT_SET(SPIx1_NSS_GPIO_PORT->ODR, 4);
                        /* Disable the Tx buffer empty interrupt */
                        SPI_I2S_ITConfig(SPIx1, SPI_I2S_IT_TXE, DISABLE);
                }
                SPI_I2S_ClearFlag(SPIx1, SPI_I2S_FLAG_TXE);
        }

        /* SPI in Master Receiver mode--------------------------------------- */
        if (SPI_I2S_GetITStatus(SPIx1, SPI_I2S_IT_RXNE) == SET)
        {
                l_recv_data = SPI_I2S_ReceiveData16(SPIx1);
                lusMSpiStack.fifoIn(&lusMSpiStack.fifo, &l_recv_data);
                SPI_I2S_ClearFlag(SPIx1, SPI_I2S_FLAG_RXNE);
        }

        /* SPI Error interrupt--------------------------------------- */
        if (SPI_I2S_GetITStatus(SPIx1, SPI_I2S_IT_OVR) == SET)
        {
                SPI_I2S_ReceiveData16(SPIx1);
                SPI_I2S_ClearFlag(SPIx1, SPI_I2S_IT_OVR);
        }
}

void SPI2_IRQHandler(void)
{
        uint16_t l_recv_data;
       
        /*Slave*/
        /* SPI in Slave Tramitter mode--------------------------------------- */
        if (SPI_I2S_GetITStatus(SPIx2, SPI_I2S_IT_TXE) == SET)
        {
                SPI_I2S_SendData16(SPIx2, lusSSpiStack.fifo.txBuf[lusSSpiStack.fifo.index]);
                lusSSpiStack.fifo.index++;
                if (lusSSpiStack.fifo.index == lusSSpiStack.fifo.length)
                {
                        lusSSpiStack.fifo.index = 0;
                        lusSSpiStack.fifo.status = 0;
                        /* Disable the Tx buffer empty interrupt */
                        SPI_I2S_ITConfig(SPIx2, SPI_I2S_IT_TXE, DISABLE);
                }
                SPI_I2S_ClearFlag(SPIx2, SPI_I2S_FLAG_TXE);
        }

        /* SPI in Slave Receiver mode--------------------------------------- */
        if (SPI_I2S_GetITStatus(SPIx2, SPI_I2S_IT_RXNE) == SET)
        {
                l_recv_data = SPI_I2S_ReceiveData16(SPIx2);
                lusSSpiStack.fifoIn(&lusSSpiStack.fifo, &l_recv_data);
                SPI_I2S_ClearFlag(SPIx2, SPI_I2S_FLAG_RXNE);
        }

        /* SPI Error interrupt--------------------------------------- */
        if (SPI_I2S_GetITStatus(SPIx2, SPI_I2S_IT_OVR) == SET)
        {
                SPI_I2S_ReceiveData16(SPIx2);
                SPI_I2S_GetITStatus(SPIx2, SPI_I2S_IT_OVR);
        }
}
2、Master SPI1和Slave SPI2周期处理函数如下所示:

void app_mspi_task(void)
{
        uint16_t i;
        uint16_t *lpvTxIndex = NULL;
        static uint16_t luwTxCnt = 0;
       
        lpvTxIndex = &lusMSpiStack.fifo.txBuf[0];
        /*通信帧头1*/
        *lpvTxIndex++ = cFRAME_HEAD1;
        /*通信帧头1*/
        *lpvTxIndex++ = cFRAME_HEAD2;
        /*通信命令码1*/
        *lpvTxIndex++ = cFRAME_R;
        /*通信数据长度*/
        *lpvTxIndex++ = 141;
        /*通信数据起始地址*/
        *lpvTxIndex++ = 0;
        /*通信数据内容-数据块1*/
        for(i=0; i<140; i++)
        {
                *lpvTxIndex++ = SpiParam1.mSpiRegister;
        }
        /*通信数据校验CHECKSUM*/
        *lpvTxIndex++ = 0x0000;
        /*通信帧尾*/
        *lpvTxIndex++ = cFRAME_TAIL1;
        *lpvTxIndex++ = cFRAME_TAIL2;
        /*主CPU通信发送*/
        if(luwTxCnt >= cCommTxFrequency)
        {
                luwTxCnt = 0;
                lusMSpiStack.fifo.index = 0;
                lusMSpiStack.fifo.length = (lpvTxIndex-&lusMSpiStack.fifo.txBuf[0]);
                sSPI1_Transmit(&lusMSpiStack);
        }
        else
        {
                luwTxCnt++;
        }
        /*主CPU通信接收解析*/
        sInvMSpiRecvanalysis(&lusMSpiStack);
}

void app_sspi_task(void)
{
        uint16_t i;
        uint16_t *lpvTxIndex = NULL;
        static uint16_t luwTxCnt = 0;
       
        lpvTxIndex = &lusSSpiStack.fifo.txBuf[0];
        /*通信帧头1*/
        *lpvTxIndex++ = cFRAME_HEAD1;
        /*通信帧头1*/
        *lpvTxIndex++ = cFRAME_HEAD2;
        /*通信命令码1*/
        *lpvTxIndex++ = cFRAME_R;
        /*通信数据长度*/
        *lpvTxIndex++ = 141;
        /*通信数据起始地址*/
        *lpvTxIndex++ = 0;
        /*通信数据内容-数据块2*/
        for(i=0; i<140; i++)
        {
                *lpvTxIndex++ = SpiParam2.mSpiRegister;
        }
        /*通信数据校验CHECKSUM*/
        *lpvTxIndex++ = 0x0000;
        /*通信帧尾*/
        *lpvTxIndex++ = cFRAME_TAIL1;
        *lpvTxIndex++ = cFRAME_TAIL2;
        /*副CPU通信发送*/
        if(luwTxCnt >= cCommTxFrequency)
        {
                luwTxCnt = 0;
                lusSSpiStack.fifo.index = 0;
                lusSSpiStack.fifo.length = (lpvTxIndex-&lusSSpiStack.fifo.txBuf[0]);
                sSPI2_Transmit(&lusSSpiStack);
        }
        else
        {
                luwTxCnt++;
        }
        /*副CPU通信接收解析*/
        sInvSSpiRecvanalysis(&lusSSpiStack);
}
3、通信协议格式如下所示:

帧头1 帧头2 命令码 数据长度 数据内容 CRC校验 帧尾1 帧尾2
4、Master SPI1和Slave SPI2必须接收与发送同样长度的数据,两边发送与接收数据内容完全一致;
这时为了解决“Master SPI1从Slave SPI2发送数据”和“Master SPI1从Slave SPI2接收数据”的问题,
可以规定数据内容中那些是读取的数据,那些是发送的数据,这样Master和Slave分别处理,即可实现Master从Slave读取数据,又能向Slave写数据的目的。



使用特权

评论回复
板凳
any012|  楼主 | 2016-5-28 15:58 | 只看该作者
yklstudent 发表于 2016-5-28 11:55
分享一个自己写的SPI中断发送与中断接收通信程序;1、平台为STM32F072的SPI1与SPI2通信,具体中断处理函数 ...

十分感谢。

使用特权

评论回复
地板
meancom| | 2016-5-29 23:23 | 只看该作者
spi2RecvBuff 没有转发到 spi2SendBuff

使用特权

评论回复
5
any012|  楼主 | 2016-5-30 09:01 | 只看该作者
meancom 发表于 2016-5-29 23:23
spi2RecvBuff 没有转发到 spi2SendBuff

spi2接受和发送的数不同,不需要将spi2RecvBuff转发到spi2SendBuff吧。

使用特权

评论回复
6
meancom| | 2016-5-30 16:52 | 只看该作者
那你最好查清楚发送的数据是什么,有没有其他地方影响数据,毕竟数量是正确的,只是你所说的接收不正确这个问题就没法通过你提供的片段代码来判断了。
另外需要注意:
在从机模式下,由于时钟是主机提供的。
这意味着从机发送的数据需要等到主机的时钟信号才会被发送出去。
于是当从机接到数据后,发送的数据是在主机发送下一帧数据的同时送出的。

使用特权

评论回复
7
any012|  楼主 | 2016-5-30 17:10 | 只看该作者
本帖最后由 any012 于 2016-5-30 17:12 编辑
meancom 发表于 2016-5-30 16:52
那你最好查清楚发送的数据是什么,有没有其他地方影响数据,毕竟数量是正确的,只是你所说的接收不正确这个 ...

知道主设备发送来的数据,和示波器测量的波形也是一致的。
但是从设备接收然后通过串口发送上来的数据。有时候却是错误的,数据帧的第二个有效数据被读取了两次。
这个问题没搞明白是怎么产生的,不过我通过校验位,将接收的错误帧去掉了。

发送数据同样出现了这类问题,发送帧的第二个数据,有时候被发送了两次,这是通过示波器观察到的。
我是在接收完一帧信息后,立刻把发送帧的第一个数据写到SPI发送寄存器了。接收的数据如果是帧首,那么将发送帧的第二个数据发送到SPI发送寄存器等待下次接收数据时发送出去。

使用特权

评论回复
8
meancom| | 2016-5-30 22:01 | 只看该作者
你可以尝试一下主机发送数据间隔delay一下,因为使用官方提供的固件库,处理经常会出现不及时的情况~

使用特权

评论回复
9
any012|  楼主 | 2016-5-31 17:32 | 只看该作者
meancom 发表于 2016-5-30 22:01
你可以尝试一下主机发送数据间隔delay一下,因为使用官方提供的固件库,处理经常会出现不及时的情况~ ...

主机程序不是我编写的,改不了...
现在觉得问题还是出在中断处理函数里.
以下为串口打印出来的数据.上电后,前两秒数据是正确的.然后就出错了.好像接受了第一帧的数据后,判断为帧首,然后可能由于某种原因该帧的余下部分没有接收,然后接收到下一帧信息,由于接收数组的第一个位置已被放置数据,那么就从第二个位置开始放置接收到的数据.这样帧首就重复接收了两次,帧尾没被放到接收数组里.
不过按说接收超过5个数据后,会将spi2Num清零的,重新从接收数组的第一个数据开始存放数据.但问题是,以后每次出现的都是重复两个帧首...
这就不理解了.

1s定时到。
spi2recvBuff[0]: 3a05
spi2recvBuff[1]: 10a
spi2recvBuff[2]: 100
spi2recvBuff[3]: 0
spi2recvBuff[4]: 9d76
spi2Recive[4]: 9d76
crc: 9d76
CRC校验Ok.

spi2SendBuff[0]: 3a05
spi2SendBuff[1]: 10a
spi2SendBuff[2]: 100
spi2SendBuff[3]: 5556
spi2SendBuff[4]: 289
发送结束

******************************************************

1s定时到。
spi2recvBuff[0]: 3a05
spi2recvBuff[1]: 10a
spi2recvBuff[2]: 100
spi2recvBuff[3]: 0
spi2recvBuff[4]: 9d76
spi2Recive[4]: 9d76
crc: 9d76
CRC校验Ok.

spi2SendBuff[0]: 3a05
spi2SendBuff[1]: 10a
spi2SendBuff[2]: 100
spi2SendBuff[3]: 5557
spi2SendBuff[4]: 9288
发送结束

******************************************************

1s定时到。
spi2recvBuff[0]: 3a05
spi2recvBuff[1]: 3a05
spi2recvBuff[2]: 10a
spi2recvBuff[3]: 100
spi2recvBuff[4]: 0
spi2Recive[4]: 0
crc: bf51

CRC校验失败.

******************************************************

1s定时到。
spi2recvBuff[0]: 3a05
spi2recvBuff[1]: 3a05
spi2recvBuff[2]: 10a
spi2recvBuff[3]: 100
spi2recvBuff[4]: 0
spi2Recive[4]: 0
crc: bf51

CRC校验失败.

使用特权

评论回复
10
meancom| | 2016-5-31 21:27 | 只看该作者
这样,我提供一个思路,不用串口。
接收中断里面使用IO口翻转输出,
使用示波器同时跟踪IO口与接收到的数据情况。
观察下在什么情况下发生多收了一个0X3A05的数据。

使用特权

评论回复
11
any012|  楼主 | 2016-6-7 16:13 | 只看该作者
更新下程序,结果还是不对。
附流程图。





SPI从模式测试V1_0.zip (2.88 MB)


使用特权

评论回复
12
any012|  楼主 | 2016-6-7 16:28 | 只看该作者
附图为该设备连续发送两数数据的波形图。
根据图形可看出,发送第一帧是: 0x3a05,0x010a,0x010a,0x0100,0x0000,第二帧全是0x3a05。然后依次循环...









使用特权

评论回复
13
any012|  楼主 | 2016-6-8 10:16 | 只看该作者
本帖最后由 any012 于 2016-6-8 11:27 编辑

更改了程序,删掉大部分功能。spi2中断接受数据后放到一个30个数据的数组里,接受够30个数据,置个标志位。
主程序里检测到这个标志位后,将30个数据用串口打印出来,如果是3a开头的,前边多加个空行。打印完后,清标志位,继续接受。

spi2RecvTemp[14]:0100
spi2RecvTemp[15]:0000
spi2RecvTemp[16]:9d76

spi2RecvTemp[17]:3a05

spi2RecvTemp[18]:3a05

spi2RecvTemp[19]:010a
spi2RecvTemp[20]:0100
spi2RecvTemp[21]:0000
spi2RecvTemp[22]:9d76

spi2RecvTemp[23]:3a05
spi2RecvTemp[24]:010a
spi2RecvTemp[25]:0100
spi2RecvTemp[26]:0000
spi2RecvTemp[27]:9d76

spi2RecvTemp[28]:3a05
spi2RecvTemp[29]:010a


spi2RecvTemp[0]:3a05

spi2RecvTemp[1]:3a05

spi2RecvTemp[2]:010a

spi2RecvTemp[3]:3a05
spi2RecvTemp[4]:010a

spi2RecvTemp[5]:3a05
spi2RecvTemp[6]:010a


spi2RecvTemp[7]:3a05
spi2RecvTemp[8]:010a
spi2RecvTemp[9]:0100
spi2RecvTemp[10]:0000
spi2RecvTemp[11]:9d76

spi2RecvTemp[12]:3a05
spi2RecvTemp[13]:010a
spi2RecvTemp[14]:0100
spi2RecvTemp[15]:0000
spi2RecvTemp[16]:9d76

spi2RecvTemp[17]:3a05

spi2RecvTemp[18]:3a05

spi2RecvTemp[19]:010a
spi2RecvTemp[20]:0100
spi2RecvTemp[21]:0000
spi2RecvTemp[22]:9d76

spi2RecvTemp[23]:3a05
spi2RecvTemp[24]:010a

spi2RecvTemp[25]:3a05

spi2RecvTemp[26]:010a
spi2RecvTemp[27]:0100
spi2RecvTemp[28]:0000
spi2RecvTemp[29]:9d76


spi2RecvTemp[0]:3a05

spi2RecvTemp[1]:3a05

spi2RecvTemp[2]:010a
spi2RecvTemp[3]:0100
spi2RecvTemp[4]:0000
spi2RecvTemp[5]:9d76

spi2RecvTemp[6]:3a05
spi2RecvTemp[7]:010a
spi2RecvTemp[8]:0100
spi2RecvTemp[9]:0000
spi2RecvTemp[10]:9d76

spi2RecvTemp[11]:3a05
spi2RecvTemp[12]:010a
spi2RecvTemp[13]:0100
spi2RecvTemp[14]:0000
spi2RecvTemp[15]:9d76

spi2RecvTemp[16]:3a05
spi2RecvTemp[17]:010a
spi2RecvTemp[18]:0100
spi2RecvTemp[19]:0000
spi2RecvTemp[20]:9d76

spi2RecvTemp[21]:3a05
spi2RecvTemp[22]:010a
spi2RecvTemp[23]:0100
spi2RecvTemp[24]:0000
spi2RecvTemp[25]:9d76

spi2RecvTemp[26]:3a05
spi2RecvTemp[27]:010a
spi2RecvTemp[28]:0100
spi2RecvTemp[29]:0000


spi2RecvTemp[0]:3a05

spi2RecvTemp[1]:3a05

spi2RecvTemp[2]:010a
spi2RecvTemp[3]:0100
spi2RecvTemp[4]:0000
spi2RecvTemp[5]:9d76

spi2RecvTemp[6]:3a05
spi2RecvTemp[7]:010a
spi2RecvTemp[8]:0100
spi2RecvTemp[9]:0000
spi2RecvTemp[10]:9d76

spi2RecvTemp[11]:3a05
spi2RecvTemp[12]:010a
spi2RecvTemp[13]:0100
spi2RecvTemp[14]:0000
spi2RecvTemp[15]:9d76

spi2RecvTemp[16]:3a05
spi2RecvTemp[17]:010a
spi2RecvTemp[18]:0100
spi2RecvTemp[19]:0000
spi2RecvTemp[20]:9d76

spi2RecvTemp[21]:3a05
spi2RecvTemp[22]:010a
spi2RecvTemp[23]:0100
spi2RecvTemp[24]:0000

spi2RecvTemp[25]:3a05
spi2RecvTemp[26]:010a
spi2RecvTemp[27]:0100
spi2RecvTemp[28]:0000
spi2RecvTemp[29]:9d76


spi2RecvTemp[0]:3a05

spi2RecvTemp[1]:3a05

spi2RecvTemp[2]:010a
spi2RecvTemp[3]:0100
spi2RecvTemp[4]:0000
spi2RecvTemp[5]:9d76

spi2RecvTemp[6]:3a05
spi2RecvTemp[7]:010a
spi2RecvTemp[8]:0100
spi2RecvTemp[9]:0000
spi2RecvTemp[10]:9d76

spi2RecvTemp[11]:3a05
spi2RecvTemp[12]:010a
spi2RecvTemp[13]:0100
spi2RecvTemp[14]:0000
spi2RecvTemp[15]:9d76

spi2RecvTemp[16]:3a05
spi2RecvTemp[17]:010a
spi2RecvTemp[18]:0100
spi2RecvTemp[19]:0000
spi2RecvTemp[20]:9d76

spi2RecvTemp[21]:3a05
spi2RecvTemp[22]:010a
spi2RecvTemp[23]:0100

spi2RecvTemp[24]:3a05
spi2RecvTemp[25]:010a
spi2RecvTemp[26]:0100
spi2RecvTemp[27]:0000
spi2RecvTemp[28]:9d76

spi2RecvTemp[29]:3a05


spi2RecvTemp[0]:3a05

spi2RecvTemp[1]:3a05

spi2RecvTemp[2]:010a
spi2RecvTemp[3]:0100
spi2RecvTemp[4]:0000
spi2RecvTemp[5]:9d76

spi2RecvTemp[6]:3a05
spi2RecvTemp[7]:010a
spi2RecvTemp[8]:0100
spi2RecvTemp[9]:0000
spi2RecvTemp[10]:9d76

spi2RecvTemp[11]:3a05
spi2RecvTemp[12]:010a
spi2RecvTemp[13]:0100
spi2RecvTemp[14]:0000
spi2RecvTemp[15]:9d76

spi2RecvTemp[16]:3a05
spi2RecvTemp[17]:010a
spi2RecvTemp[18]:0100
spi2RecvTemp[19]:0000
spi2RecvTemp[20]:9d76

spi2RecvTemp[21]:3a05
spi2RecvTemp[22]:010a
spi2RecvTemp[23]:0100

spi2RecvTemp[24]:3a05
spi2RecvTemp[25]:010a
spi2RecvTemp[26]:0100
spi2RecvTemp[27]:0000
spi2RecvTemp[28]:9d76

spi2RecvTemp[29]:3a05


spi2RecvTemp[0]:3a05

spi2RecvTemp[1]:3a05

spi2RecvTemp[2]:010a
spi2RecvTemp[3]:0100
spi2RecvTemp[4]:0000
spi2RecvTemp[5]:9d76

spi2RecvTemp[6]:3a05
spi2RecvTemp[7]:010a


spi2RecvTemp[8]:3a05
spi2RecvTemp[9]:010a
spi2RecvTemp[10]:0100
spi2RecvTemp[11]:0000
spi2RecvTemp[12]:9d76

spi2RecvTemp[13]:3a05
spi2RecvTemp[14]:010a
spi2RecvTemp[15]:0100
spi2RecvTemp[16]:0000
spi2RecvTemp[17]:9d76

spi2RecvTemp[18]:3a05
spi2RecvTemp[19]:010a
spi2RecvTemp[20]:0100
spi2RecvTemp[21]:0000
spi2RecvTemp[22]:9d76

spi2RecvTemp[23]:3a05
spi2RecvTemp[24]:010a
spi2RecvTemp[25]:0100
spi2RecvTemp[26]:0000
spi2RecvTemp[27]:9d76

spi2RecvTemp[28]:3a05
spi2RecvTemp[29]:010a


spi2RecvTemp[0]:3a05

spi2RecvTemp[1]:3a05

spi2RecvTemp[2]:010a
spi2RecvTemp[3]:0100
spi2RecvTemp[4]:0000
spi2RecvTemp[5]:9d76

spi2RecvTemp[6]:3a05
spi2RecvTemp[7]:010a


spi2RecvTemp[8]:3a05
spi2RecvTemp[9]:010a
spi2RecvTemp[10]:0100
spi2RecvTemp[11]:0000
spi2RecvTemp[12]:9d76

spi2RecvTemp[13]:3a05
spi2RecvTemp[14]:010a
spi2RecvTemp[15]:0100
spi2RecvTemp[16]:0000
spi2RecvTemp[17]:9d76

spi2RecvTemp[18]:3a05
spi2RecvTemp[19]:010a
spi2RecvTemp[20]:0100
spi2RecvTemp[21]:0000
spi2RecvTemp[22]:9d76

spi2RecvTemp[23]:3a05
spi2RecvTemp[24]:010a
spi2RecvTemp[25]:0100
spi2RecvTemp[26]:0000
spi2RecvTemp[27]:9d76

spi2RecvTemp[28]:3a05
spi2RecvTemp[29]:010a


spi2RecvTemp[0]:3a05

spi2RecvTemp[1]:3a05

spi2RecvTemp[2]:010a
spi2RecvTemp[3]:0100
spi2RecvTemp[4]:0000
spi2RecvTemp[5]:9d76

spi2RecvTemp[6]:3a05
spi2RecvTemp[7]:010a

spi2RecvTemp[8]:3a05
spi2RecvTemp[9]:010a
spi2RecvTemp[10]:0100
spi2RecvTemp[11]:0000

spi2RecvTemp[12]:3a05
spi2RecvTemp[13]:010a
spi2RecvTemp[14]:0100
spi2RecvTemp[15]:0000
spi2RecvTemp[16]:9d76

spi2RecvTemp[17]:3a05
spi2RecvTemp[18]:010a
spi2RecvTemp[19]:0100
spi2RecvTemp[20]:0000
spi2RecvTemp[21]:9d76

spi2RecvTemp[22]:3a05
spi2RecvTemp[23]:010a
spi2RecvTemp[24]:0100
spi2RecvTemp[25]:0000
spi2RecvTemp[26]:9d76

spi2RecvTemp[27]:3a05
spi2RecvTemp[28]:010a
spi2RecvTemp[29]:0100


spi2RecvTemp[0]:3a05

spi2RecvTemp[1]:3a05

spi2RecvTemp[2]:010a
spi2RecvTemp[3]:0100
spi2RecvTemp[4]:0000
spi2RecvTemp[5]:9d76

spi2RecvTemp[6]:3a05
spi2RecvTemp[7]:010a


spi2RecvTemp[8]:3a05
spi2RecvTemp[9]:010a
spi2RecvTemp[10]:0100
spi2RecvTemp[11]:0000

spi2RecvTemp[12]:3a05
spi2RecvTemp[13]:010a
spi2RecvTemp[14]:0100
spi2RecvTemp[15]:0000
spi2RecvTemp[16]:9d76

spi2RecvTemp[17]:3a05
spi2RecvTemp[18]:010a
spi2RecvTemp[19]:0100
spi2RecvTemp[20]:0000
spi2RecvTemp[21]:9d76

spi2RecvTemp[22]:3a05
spi2RecvTemp[23]:010a
spi2RecvTemp[24]:0100
spi2RecvTemp[25]:0000
spi2RecvTemp[26]:9d76

spi2RecvTemp[27]:3a05
spi2RecvTemp[28]:010a
spi2RecvTemp[29]:0100


spi2RecvTemp[0]:3a05

spi2RecvTemp[1]:3a05

spi2RecvTemp[2]:010a
spi2RecvTemp[3]:0100
spi2RecvTemp[4]:0000
spi2RecvTemp[5]:9d76

spi2RecvTemp[6]:3a05
spi2RecvTemp[7]:010a


spi2RecvTemp[8]:3a05
spi2RecvTemp[9]:010a
spi2RecvTemp[10]:0100
spi2RecvTemp[11]:0000

spi2RecvTemp[12]:3a05
spi2RecvTemp[13]:010a
spi2RecvTemp[14]:0100
spi2RecvTemp[15]:0000

spi2RecvTemp[16]:3a05
spi2RecvTemp[17]:010a
spi2RecvTemp[18]:0100
spi2RecvTemp[19]:0000
spi2RecvTemp[20]:9d76

spi2RecvTemp[21]:3a05
spi2RecvTemp[22]:010a
spi2RecvTemp[23]:0100
spi2RecvTemp[24]:0000
spi2RecvTemp[25]:9d76

spi2RecvTemp[26]:3a05
spi2RecvTemp[27]:010a
spi2RecvTemp[28]:0100
spi2RecvTemp[29]:0000


spi2RecvTemp[0]:3a05

spi2RecvTemp[1]:3a05

spi2RecvTemp[2]:010a
spi2RecvTemp[3]:0100
spi2RecvTemp[4]:0000
spi2RecvTemp[5]:9d76

spi2RecvTemp[6]:3a05
spi2RecvTemp[7]:010a


spi2RecvTemp[8]:3a05
spi2RecvTemp[9]:010a
spi2RecvTemp[10]:0100
spi2RecvTemp[11]:0000

spi2RecvTemp[12]:3a05
spi2RecvTemp[13]:010a
spi2RecvTemp[14]:0100
spi2RecvTemp[15]:0000

spi2RecvTemp[16]:3a05
spi2RecvTemp[17]:010a
spi2RecvTemp[18]:0100
spi2RecvTemp[19]:0000
spi2RecvTemp[20]:9d76

spi2RecvTemp[21]:3a05
spi2RecvTemp[22]:010a
spi2RecvTemp[23]:0100
spi2RecvTemp[24]:0000
spi2RecvTemp[25]:9d76

spi2RecvTemp[26]:3a05
spi2RecvTemp[27]:010a
spi2RecvTemp[28]:0100
spi2RecvTemp[29]:0000


spi2RecvTemp[0]:3a05
spi2RecvTemp[1]:010a
spi2RecvTemp[2]:0100
spi2RecvTemp[3]:0000
spi2RecvTemp[4]:9d76

spi2RecvTemp[5]:3a05
spi2RecvTemp[6]:010a
spi2RecvTemp[7]:0100
spi2RecvTemp[8]:0000
spi2RecvTemp[9]:9d76

spi2RecvTemp[10]:3a05
spi2RecvTemp[11]:010a
spi2RecvTemp[12]:0100
spi2RecvTemp[13]:0000
spi2RecvTemp[14]:9d76

spi2RecvTemp[15]:3a05
spi2RecvTemp[16]:010a
spi2RecvTemp[17]:0100
spi2RecvTemp[18]:0000
spi2RecvTemp[19]:9d76

spi2RecvTemp[20]:3a05
spi2RecvTemp[21]:010a
spi2RecvTemp[22]:0100
spi2RecvTemp[23]:0000
spi2RecvTemp[24]:9d76

spi2RecvTemp[25]:3a05
spi2RecvTemp[26]:010a
spi2RecvTemp[27]:0100
spi2RecvTemp[28]:0000
spi2RecvTemp[29]:9d76


spi2RecvTemp[0]:3a05
spi2RecvTemp[1]:010a
spi2RecvTemp[2]:0100
spi2RecvTemp[3]:0000
spi2RecvTemp[4]:9d76

spi2RecvTemp[5]:3a05
spi2RecvTemp[6]:010a
spi2RecvTemp[7]:0100
spi2RecvTemp[8]:0000
spi2RecvTemp[9]:9d76

spi2RecvTemp[10]:3a05
spi2RecvTemp[11]:010a
spi2RecvTemp[12]:0100
spi2RecvTemp[13]:0000
spi2RecvTemp[14]:9d76

spi2RecvTemp[15]:3a05
spi2RecvTemp[16]:010a
spi2RecvTemp[17]:0100
spi2RecvTemp[18]:0000
spi2RecvTemp[19]:9d76

spi2RecvTemp[20]:3a05
spi2RecvTemp[21]:010a
spi2RecvTemp[22]:0100


spi2RecvTemp[23]:3a05
spi2RecvTemp[24]:010a
spi2RecvTemp[25]:0100
spi2RecvTemp[26]:0000
spi2RecvTemp[27]:9d76

spi2RecvTemp[28]:3a05
spi2RecvTemp[29]:010a



spi2RecvTemp[0]:3a05
spi2RecvTemp[1]:010a
spi2RecvTemp[2]:0100
spi2RecvTemp[3]:0000
spi2RecvTemp[4]:9d76
spi2RecvTemp[5]:9d76

spi2RecvTemp[6]:3a05
spi2RecvTemp[7]:010a
spi2RecvTemp[8]:0100
spi2RecvTemp[9]:0000
spi2RecvTemp[10]:9d76

spi2RecvTemp[11]:3a05
spi2RecvTemp[12]:010a
spi2RecvTemp[13]:0100
spi2RecvTemp[14]:0000
spi2RecvTemp[15]:9d76

spi2RecvTemp[16]:3a05
spi2RecvTemp[17]:010a
spi2RecvTemp[18]:0100
spi2RecvTemp[19]:0000
spi2RecvTemp[20]:9d76

spi2RecvTemp[21]:3a05
spi2RecvTemp[22]:010a
spi2RecvTemp[23]:0100
spi2RecvTemp[24]:0000
spi2RecvTemp[25]:9d76

spi2RecvTemp[26]:3a05
spi2RecvTemp[27]:010a
spi2RecvTemp[28]:0100

看前半部分,好象是有规律的,接受的前两个数据,都是0x3a05。
前两帧有错误,后边开始接受正确了。
我就猜想,可能真的是主设备发送的数据有时候出了问题,联系发送了两个帧首?
看到后半段,貌似大部分又正确了,结果中间有部分丢失后边的数据。
现在只保留了串口中断,SPI中断,定时器中断。
串口只在接受满30个数据并置了标志位后才发送数据,此时虽然有SPI中断,但并不保存数据到数组里。
SPI接受数据时可能影响的只有定时器中断了,不过已经把SPI中断的优先级设最高了。
一会试试关掉定时器。

使用特权

评论回复
14
any012|  楼主 | 2016-6-15 09:24 | 只看该作者
改成下面这样就没事了。主要是进入SPI中断后,SPI发送数据尽量靠前一点。也不知道为什么会这样。
在接收完帧首以后的中断处理里,就是else语句,需要将SPI发送语句放在紧靠else语句的位置。
这样的话,原来想只用spi2RecvNum这个变量控制接收和发送的数据位,现在不那么好实现了,于是又加了个变量spi2SendNum。

[mw_shl_code=c,true]void SPI2_IRQHandler(void)
{
        static u8 n;
        static u16 spi2Temp;
        spi2Temp = SPI_I2S_ReceiveData(SPI2);
       
        if(spi2RecvOk == 0)
        {
                if(spi2RecvNum == 0)
                {
                        if((spi2Temp & 0xff00)== 0x3a00)
                        {
                                SPI_I2S_SendData(SPI2, spi2SendBuff[1]);
                                spi2RecvBuff[0] = spi2Temp;
                                spi2RecvNum = 1;
                                spi2SendNum = 2;                               
                        }
                }
                else
                {
                        SPI_I2S_SendData(SPI2, spi2SendBuff[spi2SendNum]);
                        spi2RecvBuff[spi2RecvNum] = spi2Temp;
                        spi2RecvNum++;
                        if(spi2RecvNum > 4)
                                spi2RecvOk = 1;
                        spi2SendNum += 1;
                        spi2SendNum %= 5;
                }
        }       
}[/mw_shl_code]

使用特权

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

本版积分规则

35

主题

232

帖子

6

粉丝