本帖最后由 青蓝pisces 于 2017-2-8 00:20 编辑
首先楼主要明白,SPI总线从结构上可以看出不是一个对等的总线,也就是说从设备不能主动给主设备发送数据。
那么为了协调两边的数据传输,所有的工作都需要主设备进行管理。
这里楼主出现的问题是:没有进行流控制,完全靠默契。
在主设备发出读命令后马上又将数据读走,这时可能从设备还没有将数据写入SPI0DAT寄存器,
所以读回去的还是原来的数据。
一般来说有两种方案:
1、全部由主设备负责,通过定义通信协议主设备可以在从设备中读出状态标志位,
当从设备接到数据后将标志位置为有效,主设备读到发送结束标志后进行读回操作。
这个方案需要定义一套通信协议,至少要能区分几个位置,区分命令和读写操作。
给出一个简单例子:从设备端做一个简单的状态机,在等待状态下接到主设备的命令则执行命令,
接到主设备的读写命令时进入读写状态,主设备在下一个字节中说明是读还是写,另给出地址,随后完成动作。
2、使用intel风格的古董级硬件流控制方法,接两根状态线用来握手,通过握手过程完成流控制。
例如定义一条线线为从机已准备好,在从机收到读命令后首先将数据写入SPI0DAT寄存器,
确认主机可以读后,将该线置为有效,进行握手请求。
随后主机发送时钟信号,读走数据,将另一根线置高,代表操作完成(ACK),这时完成一次传送操作。
希望楼主给个好评!
|