打印
[STM32F0]

STM32F051 I2S接收数据错位,无解呀!!

[复制链接]
1925|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wingis|  楼主 | 2017-4-23 16:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F051C8T6用了好几年了。它的SPI1一直用来发送数据,没发现什么问题,这几天配置成I2S用来接收数据总是出现收到的数据有字节移位的现象,比如发送的是 0X1111,0X2222,0X3333,收到的是0X1122,0X2233,0X33XX,这情况是开机后随机出现的,有时候开机是正常的,只要开机正常后面一直都是正常的。开机不正常后面就一直这样错位。  好蛋疼啊,搞了一个星期了。什么方法都试过了。无解呀!!  小弟在这里拜大神了,求支招啊!
沙发
wingis|  楼主 | 2017-4-23 16:50 | 只看该作者
I2S配置如下:


void Spi1Init(void){
        uint32_t Temp;

        SPI1->CR1=(uint32_t)
                ((0 << 15)|        //--  0=两线单向  1=单线双向  
                (0 << 14) |        //--  0=单线双向只接收  1=单线双向收发  
                (0 << 13) |        //--  0=CRC计算禁止  1=CRC计算使能  
                (0 << 12) |        //--  0=下一发送值来自发送寄存器  1=下一发送值来自CRC寄存器  
                (0 << 11) |        //--  0=8位CRC长度  1=16位CRC长度  
                (0 << 10) |        //--  0=两线单向全双工  1=两线单向只接收不发送  
                (1 << 9) |        //--SSM  0=禁止NSS脚从设备管理  1=起用SSI软件从设备管理  
                (1 << 8) |        //--SSI  当SSM位为1时,此位值觉得了NSS引脚电平
                (0 << 7) |        //--  0=先发送MSB  1=先发送LSB
                (0 << 6) |        //--  0=禁止SPI设备  1=开启SPI设备
                (5 << 3) |        //--  (0-7)波特率控制,为PCLK的分频倍数(2,4,8,16,32,64,128,256)
                (1 << 2) |        //--  0=配置为从设备  1=主设备
                (0 << 1) |        //--  时钟极性  
                (0 << 0));        //--  时钟相位

        SPI1->CR2=(uint32_t)
                ((0 << 14)|        //--  0=DMA最后发送总数为偶数                      1=奇数  
                (0 << 13) |        //--  0=DMA最后接收总数为偶数                1=奇数
                (0 << 12) |        //--  0=FIFO接收非空门限16位                        1=8位  
                (15 << 8) |        //--  (3-15)数据传输位宽,对应(4位-16位)  
                (0 << 7) |        //--  0=TXE中断屏蔽  1=TXE中断不屏蔽  
                (1 << 6) |        //--  0=RXNE中断屏蔽  1=RXNE中断不屏蔽  
                (0 << 5) |        //--  0=错误中断屏蔽  1=错误中断不屏蔽  
                (0 << 4) |        //--  0=SPI 摩托格式  1=SPI TI模式  
                (1 << 3) |        //--  0=没有NSS脉冲  1=有NSS脉冲
                (0 << 2) |        //--  0=主模式下SS输出禁用  1=起用
                (0 << 1) |        //--  0=TX的DMA缓冲禁止  1=启用   
                (0 << 0));        //--  0=RX的DMA缓冲禁止  1=启用
       
        //SPI1->SR;//----状态寄存器
        //SPI1->DR;//----数据寄存器       
        //SPI1->CRCPR;//----CRC多项式
        //SPI1->RXCRCR;//----接收CRC计算结果
        //SPI1->TXCRCR;//----发射CRC计算结果

        while((SPI1->SR & (3<<9 |1))!=0){Temp=SPI1->DR;}//----clear SPI FIFO

        SPI1->I2SCFGR=(uint32_t)//----I2S配置
                ((1 << 11)|        //--  0=SPI  1=I2S
                (0 << 10) |        //--  0=I2S OFF  1=I2S ON
                (3 << 8) |        //--  0=从机发送       1=从机接收      2=主机发送      3=主机接收      
                (1 << 7) |        //--  0=短帧同步       1=长帧同步
                (0 << 4) |        //--  0=I2S   1=左对齐     2=右对齐     3=PCM
                (0 << 3) |        //--  0=时钟静态低电平        1=时钟静态高天平           时钟极性  
                (0 << 1) |        //--  0=16bit   1=24bit     2=32bit     3=禁止此值          待传输数据宽
                (1 << 0));        //--  0=0=16bit   1=32it      每个声道数据位数
        SPI1->I2SPR=(uint32_t)//----I2S预分频器
                ((0 << 9)|        //--  0=主时钟输出禁止             1=主时钟输出使能
                (0 << 8) |        //--  奇数分频
                (16 << 0));        //--  0-255        时钟分频

        //SPI1->CR1 |=(uint32_t)(1 << 6);//----使能SPI
        SPI1->I2SCFGR |=(uint32_t)(1<<10);//----使能I2S
        while((SPI1->SR & (3<<9 |1))!=0){Temp=SPI1->DR;}//----clear SPI FIFO


        NVIC_SetPriority(SPI1_IRQn,1);//----设置中断优先级为1级(0为最高级)
        NVIC_EnableIRQ(SPI1_IRQn);//----使能SPI1_IRQn中断
}

使用特权

评论回复
板凳
wingis|  楼主 | 2017-4-23 16:59 | 只看该作者
关键现象是有时候开机正常,只要开机正常后面持续工作都是正常的。只要开机有字节移位的情况,那后面一直都是移位的。 感觉就是FIFO里面有数据但是清不掉。
我每次接收后都
while((SPI1->SR & (3<<9 |1))!=0){Temp=SPI1->DR;}//----clear SPI FIFO
清除数据,但是没什么卵用。


前两个月使用SPI2+DMA接收也有这个情况。但是通过清FIFO后就没有出现过了。这回这个真是无解了。求支招啊!

使用特权

评论回复
地板
mark0668| | 2017-4-23 22:14 | 只看该作者
试试复位SPI 看

使用特权

评论回复
5
wingis|  楼主 | 2017-4-24 01:04 | 只看该作者

这个是配置成I2S用的哦,I2S可不能随便停下呀。关键是不知道原因在那里?

使用特权

评论回复
6
mark0668| | 2017-4-24 12:57 | 只看该作者
wingis 发表于 2017-4-24 01:04
这个是配置成I2S用的哦,I2S可不能随便停下呀。关键是不知道原因在那里? ...

是叫你刚开始就复位,不是叫你中途复位

使用特权

评论回复
7
309030| | 2017-4-25 22:06 | 只看该作者
可能是清的位置不对呢

使用特权

评论回复
8
wingis|  楼主 | 2017-4-30 21:49 | 只看该作者
问题解决了,自己软件上有BUG。多谢各位!

使用特权

评论回复
9
yuanbuqi| | 2017-6-17 21:37 | 只看该作者
我也遇到同样的问题,有时上电正确,有时上电不正确,楼主是怎么解决的

使用特权

评论回复
10
Snow7| | 2017-6-20 16:55 | 只看该作者
复位SPI 什么效果

使用特权

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

本版积分规则

17

主题

132

帖子

1

粉丝