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

  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
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的部分,感觉会省事很多。