1

我有两个PIC32MX微控制器,它们通过 1.53MHz SPI 总线与片选连接。我无法让我的从端中断服务程序正确传输数据。作为一个测试用例,我让主机每 10 毫秒发送两个字节(0x01、0x00)。当主机发送第二个字节(虚拟 0x00)时,从机应该接收 0x01 命令 id 并以 0x02 响应。

理想情况下,每次传输都应该是这样的。
主从
0x01 0x00
0x00 0x02

不过,我真的不确定从哪里开始从属中断。我正在使用一个名为 airsysTx 的 fifo 缓冲区来保存下次主机发出请求时需要移出的数据。从机接收到来自主机的 0x01 就好了,并在收到时将 0x02 写入 fifo 缓冲区。我不确定如何对中断进行编码,以便确保正确传输。我下面的代码是一个好的开始,但它是错误的。建议?

/*******************************************************************************
 * Interrupt service routine for SPI3 interrupts from Air MCU.
 * The user's code at this vector should perform any application specific
 * operations and MUST clear the SPI3 interrupt flags before exiting.
 ******************************************************************************/
void    __ISR(_SPI_3_VECTOR, ipl7) _SPI3Interrupt()
{
    BYTE MasterCMD;

    SET_D1();//Set debug LED


    // RX INTERRUPT
    if(IFS0bits.SPI3RXIF) // receive data available in SPI3BUF Rx buffer
    {
        MasterCMD = SPI3BUF;
        if(AirCMD == 0x01)
        {
            airsysTxFlush();
            airsysTxWrite(0x02);
        }
    }

    //Transmit data if needed.
    if(SPI3STATbits.SPITBE)
    {
        if(!airsysTxIsEmpty())
        {
            SPI3BUF = airsysTxRead();
        }
        else
        {
            //Else write 0 to the tx buffer to clear the spi shift reg
            SPI3BUF = 0x00;
        }
    }


    IFS0bits.SPI3RXIF = 0;
    IFS0bits.SPI3TXIF = 0;
    IFS0bits.SPI3EIF = 0;
    SPI3STATbits.SPIROV = 0;// clear the Overflow
    CLEAR_D1();//CLEAR Debug LED

} // end ISR

这段代码实际传输的是这样的:

理想情况下,每次传输都应该是这样的。
主从
0x01 0x02
0x00 0x01

4

1 回答 1

1

通常,您无法编写从属 SPI 驱动程序以您描述的方式进行交互,因为您无法作为从属设备精确控制时序。是什么生成了您的 ISR,它是来自主机的第一个字节的 Rx 还是芯片选择的断言?

作为从机,您需要在主机开始事务之前设置好要传输的数据字节。您通常没有时间对第一个字节做出反应。有几种方法可以做到这一点:

1)您可以使用协议,其中主机执行 1 或 2 字节的只写事务,告诉从机它想要读取什么。然后master等待几毫秒,让slave准备响应。然后master做一个只读事务来获取slave的响应。

2) 如果使用 DMA 或 FIFO,从机在主机开始事务之前将第一个填充字节预加载到 fifo。然后,当您获得 ISR 时,您将剩余的响应数据放入 fifo(没有刷新)。在形成响应时,您需要有足够的填充字节来适应从 ISR 延迟。例如,您可以定义您的协议,其中 master 知道响应的前 N ​​个字节是填充字节,然后是响应数据。填充要求取决于您的主时钟速度和从 CPU 速度/中断延迟。

于 2012-04-24T17:01:26.057 回答