我的M3用SPI2作为从机,有1个IO下降沿去告知主机我要发数据了,这时主机会给予从机时钟,然后我在SPI2发送中断里面就不断写进SPI2要发的数据。
过程是这样的:
- 事先将要发送的数据填进发送缓冲区SPI_Send_Buf [ ];
- 先发送一个字节等主机时钟到:SPI_I2S_SendData(SPI2,SPI_Send_Buf[SPI_Send_Count]); SPI_Send_Count+=1;
- M3的IO做一个下降沿告知主机,我要发送数据了。
- 在SPI发送中断里面
- if( SPI_I2S_GetITStatus( SPI2, SPI_I2S_IT_TXE ) == SET )//????
- {
- // dat=SPI_I2S_ReceiveData(SPI2);
- SPI_I2S_ClearFlag(SPI2, SPI_I2S_FLAG_TXE);//清除断标志
- SPI_I2S_SendData(SPI2,SPI_Send_Buf[SPI_Send_Count++]);//继续把下个字节写进MOSI
- SPI_Send_Count%=350;
- if(SPI_Send_Count>300 )// 300个字节发送完毕
- {
- SPI2_SendTime=0;
- SPI_Send_Flag=0;
- SPI_Send_Count=0; SPI2_Send_len=0;
- cnt[0]=0x45;
- }
- }
现在有个严重现象是在我发300字节里面(其实有用的数据是前面的20字节左右,后面的补0),在前20个字节里面会出现某个字节重发1遍,比如我发:86 85 9B 4b 00 00 0C 00 FC FE FF FF 80 02 03 0E 02 00 01 01但是他会把0E连续发两遍,有时候又可能是80连续发两遍。
发送过程中可能会发送1毫秒的定时器中断与,SPI1接收中断,开始怀疑是定时器中断打断SPI2发送中断,导致SPI2某个字节发两遍,但是现在已经把SPI2发送中断改为最高,抢占、响应优先级都是0.(分组是2)
还有一个不明白的是我将在SPI2中断不停将数据写进MOSI,300字节,SPI2发送中断什么时候才会停止呢?主机没有时钟SPI2发送中断就会停止?
一周热门 更多>