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