大门牙原创,欢迎随意转载,修改,吐槽
1. 准备工作
Zenq 7000系列SPI外设支持master和slave工作模式。其中,master模式应用比较好理解。但是作为slave模式工作时,如何与master进行双工通信,是一个问题。
Zenq 7000使用了两块FIFO进行时钟域的同步(CPU时钟和SPI时钟)。当作为slave模式工作时,当master的SCLK信号产生时,SPI控制器会自动将接收数据存入RxFIFO,同时将TxFIFO中的数据在MISO线上发送出去。
在这个逻辑流程中,RxFIFO和TxFIFO可以分别设置一个water flow值(水位值)。当数据满足某种条件时,会触发驱动提醒用户程序FIFO的状态变化。具体如下图所示:
其中,RxFIFO可以设置一个Threshold寄存器,当RxFIFO中的数据数大于这个值时,产生“RxFIFO非空”中断,通知程序处理接收数据。当接收到的数据数小于这个值时,认为Rx为空。
TxFIFO类似也有一个Threshold寄存器,当TxFIFO中的数据小于这个值时,产生一个“TxFIFO水位过低”中断,通知程序TxFIFO中剩余的数据不多,需要尽快添加数据到TxFIFO中。
2. 双工通信方案
对于从机而言,无法在当前byte返回指定的信息,故设计通讯协议如下图所示:
主机通过spi对从机进行两种类型的通信:Set类和Get类命令。顾名思义,Set类是将某种数据设置到从机,Get类命令是向从机索取某种数据。
每一个通信