首页 文章

在PIC32上实现SPI从ISR?

提问于
浏览
1

我有两个PIC32MX微控制器通过1.53MHz SPI bus连接芯片选择 . 我无法让我的从属端中断服务程序正确传输数据 . 作为测试用例,我让主设备每10 ms发送两个字节(0x01,0x00) . 从机应该接收0x01命令ID,并在主机发送第二个字节(虚拟0x00)时以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

1 回答

  • 1

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

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

    1)您可以使用一种协议,其中master执行1或2字节的只写事务,告知从器件它想要读取什么 . 然后主设备等待几毫秒以允许从设备准备响应 . 然后,master执行只读事务以获取从属响应 .

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

相关问题