您好!
在一个项目中、cc2538是 SPI 总线上的从器件、它必须从 SPI 主芯片接收命令。
我设计了一个基于两个操作的协议:写入操作用于通信主设备到从设备、而读取操作用于从设备到主设备的操作(意味着从设备作为主设备的某些输出)。
该协议的工作方式如下:
- 主器件启动通信、清除 CS 线路、发送2字节操作代码和1字节长度
- 从器件反应:
- 如果是写入操作、将从从从器件接收第四个到最后一个字节的字节并执行必须执行的操作。
- if 是一个读取操作第4 个到第 len 字节是从器件到主器件的
- 主机结束通信、使 CS 线路上升
我使用另一个 cc2538对协议和实现进行仿真、但这只是为了开发目的。 我选择使用 GPIO 中断捕获 CS 线路、以便能够执行一些操作来准备和终止操作。 我用摩托罗拉帧格式配置 SSI、SPO = 0 SPH = 1、8位字。 波特率为1MHz。
我的写操作执行正常、我的读取操作有一些问题。
我无法从从器件正确应答到主器件、在 cc2538上、我执行以下操作:
- GPIO 中断捕捉 CS 线路下降沿并启用 SPI
- 在 SSI ISR 接收和详细描述标头上:
- 如果缓冲 区中有3个字节、则将字节从 RxFifo 移动到本地缓冲区:
- 如果是读取操作且 TxFIFO 未满:从 TxFifo 中 RAM n 字节中的某个位置复制
- 如果是写入操作、则等待所有字节进行传输
- 如果缓冲 区中有3个字节、则将字节从 RxFifo 移动到本地缓冲区:
- n 个字节的主时钟:
- 如果是读取操作、主器件发送 n 个空字节(0x00)、从器件应传输我在 TxFifo 中放置的内容
- IF 是一个写入操作主机发送 n 字节的有效载荷
- GPIO 中断捕获 CS 线路上升沿、禁用 SPI 并准备执行新操作
问题出在第3a 点:从站不发送我放入 FIFO 中的字节。
当芯片选择未激活时、Txfifo 才被写入。 我得到的结果是:第一次发送所有0x00、第二次应答第一次操作、第三次应答第二次。
我以为 我要慢喂 Txfio、我在我的更成熟的模拟器中的每一个字节之间插入一个500 us 的延迟。 它不会解决问题。
有人可以帮助我了解 TxFifo 的工作原理吗? UDMA 是否能提供帮助?
另一个我必须马上回答的问题:是否可以清空 TxFifo (删除内容)?
Davide