最终,我选择了自己编写的程序,对于数据总是错位的问题,我选择增加一个padding字节来弥补这个问题。

// 132 byte
typedef struct
{
    leg_cmd_t leg[2];
    uint32_t crc;
    uint8_t __padding;
} spine_cmd_t;

STM32在处理的过程中手动位移一下,来解决这个问题。经过初步的连续测试,该通信比较可靠,准备进行下一步的电机控制实验了。

HAL_SPI_TransmitReceive(&hspi1, spi_tx, spi_rx, sizeof(spine_cmd_t) + 1, 100);

memcpy(&g_cmd, spi_rx + 1, sizeof(spine_cmd_t));
uint32_t crc = calculate((uint8_t*)&g_cmd, sizeof(spine_cmd_t) - 4);

上位机的发送代码也进行相应修改,来符合数据长度。