SPI读和写之间需不需要间隔

2019-08-13 22:29发布

如题,SPI的发和收是同步进行的,正点的程序如下,比如在前8个周期写SPI,然后在8个时钟周期后进行读操作,那会不会因为还没有到后8个周期就进行了读操作导致读到错误数据?

u8 SPI1_ReadWriteByte(u8 TxData)
{               
        u8 retry=0;                                        
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)
                {
                retry++;
                if(retry>200)return 0;
                }                          
        SPI_I2S_SendData(SPI1, TxData);
        retry=0;

        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)
                {
                retry++;
                if(retry>200)return 0;
                }                                                              
        return SPI_I2S_ReceiveData(SPI1);                                     
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
爱学习的猫
1楼-- · 2019-08-14 23:51
其余的直接是用正点的代码,我就是把SPI1改成了2
caosix
2楼-- · 2019-08-15 02:32
本帖最后由 caosix 于 2017-9-26 17:13 编辑
爱学习的猫 发表于 2017-9-25 17:03
用的是正点的代码

SPI 是 全双工 的 你发送的 同时,
——是可以 接收 数据的 呀 。。。

关键是:你的代码 要采用 任务驱动模式

不要有任何的 循环死等 或者 死等某个
标志 完成,,这样的延迟 。。。
————————————————————
任务驱动模式:接收 和 发送 都要做成 队列
有数据发送就以最快速度 “扔到” 发送队列里,
然后就运行后面该运行的程序段落。
一只风筝
3楼-- · 2019-08-15 04:15
 精彩回答 2  元偷偷看……
a3748622
4楼-- · 2019-08-15 08:44
我用SPI1,为了提高速度直接传送完接着读取,中间没有任何处理,当然,速度开到了最快(36M)
caosix
5楼-- · 2019-08-15 10:15
一只风筝 发表于 2017-9-27 13:45
看了Linux内核源码,才发现原来也是丢入队列来处理的,
不过不是很清楚,为什么不要有延迟?只要控制好 ...

多任务 、多线程 的 软件系统,

就是切忌:“原地等待某个事件”,
一定要有 动态、全局 观念 哦。。

道理很简单,需要你自己 【悟】。

一周热门 更多>