打印
[应用相关]

SPI通信所遇到的问题

[复制链接]
969|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Soraka|  楼主 | 2017-3-30 21:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
将两个STM32通过SPI的方式连接起来,用的都是SPI2,一个当主,一个当从
已经实现了单个字节的收发,可是当我想发送数组的时候,产生了一个严重问题,就是从机接收到的数据跟主机发送的数据不匹配
比如我主机发送0x01,0xff,0x01,然后我从机接收到的是0x08,0x0f,0xf8,上电复位之后接收到的数据可能又是另外三个,后来总结了一下规律,发现我发送的数据波形跟接收到的数据波形,收尾相接都是0000 0001 1111 1111 0000 0001,所以现在不知道该怎么解决这个问题
我发送跟接收函数如下:使能是B12
void SPI2_Send(uint8_t data){
            GPIO_ResetBits(GPIOB, GPIO_Pin_12);
        SPI2->DR = data; // write data to be transmitted to the SPI data register
        while( !(SPI2->SR & SPI_I2S_FLAG_TXE) );
GPIO_SetBits(GPIOB, GPIO_Pin_12);        
}

uint8_t SPI2_Receive(void){
        while( !(SPI2->SR & SPI_I2S_FLAG_RXNE) ); // wait until receive complete
        while( SPI2->SR & SPI_I2S_FLAG_BSY ); // wait until SPI is not busy anymore
        return SPI2->DR; // return received data from SPI data register
        
}

主机主函数片段如下:
        while(1)
           {
                for(i = 0;i<3;i++)
                {
                        SPI2_Send(Rereg[i]);
                }
        }

其中Rereg[3] = {0x01,0xff,0x01};
从机主函数片段如下:
        while(1)
           {                        
                for(i=0;i < 3;i++)
                {
                        Rereg[i] = SPI2_Receive();
                        a[i]=        Rereg[i];
                }
           a[0]=        Rereg[0];
                a[1]=        Rereg[1];
                a[2]=        Rereg[2];
        }

请求大神们帮小弟看看
沙发
戈卫东| | 2017-3-30 22:30 | 只看该作者
你没有给出正确的CS信号。
TXE信号给出的时候,数据才刚刚送到移位寄存器,还不是把CS变成无效的正确时机。
RXNE信号给出的时候才差不多。

使用特权

评论回复
板凳
戈卫东| | 2017-3-30 22:33 | 只看该作者
其实RXNE也不是合适的信号。
BUSY才是。
你要等到BUSY变成无效,再把CS变成无效才可以。

使用特权

评论回复
地板
feelhyq| | 2017-3-31 09:18 | 只看该作者
主机和从机都使用SPI3模式,即 时钟和相位都配置成‘1’

使用特权

评论回复
5
时光深巷已无她| | 2017-3-31 10:41 | 只看该作者
你这是寄存器版本??,这种问题应该是没有同步,加个时钟,起始校验位试试,建议你把时序图看看

使用特权

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

本版积分规则

178

主题

865

帖子

5

粉丝