在连续测试过程中,我最后确定问题出在linux的spi控制上,在打开spi进行单次通信后,cs片选没有复位,导致后续发送的消息均无法触发STM32的片选中断。
为了解决这个问题,我引入了bcm2835这个库,在发送SPI时进行手动的片选信号控制,使得中断正常运行。

    bcm2835_init();
    bcm2835_gpio_fsel(spi_pin[0], BCM2835_GPIO_FSEL_OUTP);
    bcm2835_gpio_fsel(spi_pin[1], BCM2835_GPIO_FSEL_OUTP);
    bcm2835_gpio_write(spi_pin[0], HIGH);
    bcm2835_gpio_write(spi_pin[1], HIGH);
    ...
    // bcm2835_gpio_write(spi_pin[i], LOW);
    transfer(m_spi_fd[i], tx, rx, sizeof(spine_cmd_t));
    bcm2835_gpio_write(spi_pin[i], HIGH);

不过在测试过程中发现,STM32从机接收的数据均有一个字节的位移,使得从机接收的数据错误。但是主机收到的数据是没有问题的,这个部分还需要进一步分析。

PS:MIT设计的这个硬件架构真的是恶心,我后续还是考虑通过MINI PCIE转CAN的方式进行控制吧。在linux上可以直接使用socketcan来通信和控制,直接化简了SPIne的部分,感觉会省事很多。