通常,SPI 主机用于控制 SPI 通信,SPI 从机不能触发从机到主机的通信。在本设计中,使用的是另一个 IO。从机的 IO 下拉会通知主机存在需要发送的信息。用户可以根据需要,修改引脚或删除 IO 功能。
对于 SPI 接收,在 bridge_spi.c 中定义了两个全局变量。
uint8_t gSpiReceiveGroup[SPI_RX_SIZE];
Custom_Element gSPI_RX_Element;
下面是 SPI 主机接收的过程。IO 中断用于检测 IO 下拉。
- 在 IO 中断中,调用 readSpiRxMsg() 来发送字节,以接收来自 SPI 从机的消息(SPI 发送和接收一起进行)。
- 调用 getSpiRxMsg() 来检测标头并将完整的消息存储到 gSpiReceiveGroup 中。
- 调用 processSpiRxMsg() 从 gSpiReceiveGroup 中提取信息并将数据存储在 gSPI_RX_Element 中。
- 将 gSPI_RX_Element 放入 gSpi2Can_FIFO 中。
下面是 SPI 从机接收的过程。
- 调用 getSpiRxMsg() 将消息存储到 gSpiReceiveGroup 中。发生超时即表示消息接收完成。
- 调用 processSpiRxMsg() 从 gSpiReceiveGroup 中提取数据并将数据存储在 gSPI_RX_Element 中。
- 将 gSPI_RX_Element 放入 gSpi2Can_FIFO。
对于 SPI 传输,在 bridge_spi.c 中定义了两个全局变量。
uint8_t gSpiTransmitGroup[SPI_TX_SIZE];
Custom_Element gSPI_TX_Element;
下面是 SPI 主机和从机传输的过程
- 从 gCan2Spi_FIFO 获取 gSPI_TX_Element。
- 调用 processSpiTxMsg() 从 gSPI_TX_Element 获取信息并将数据存储在 gSpiTransmitGroup 中。
- 调用 sendSpiTxMsg() 以通过 SPI 传输 gSpiTransmitGroup。
- (仅限 SPI 从机)使用 IO 触发主机,向从机读取数据。