最近鸽了比较长时间,因为一直在测试SPIne板子的SPI通信。之前通过USB2CAN转接,调通了电机的can总线控制,但是在UP Board到SPIne的测试一直失败,读取到的数据一直有问题。在这里先记录一下当前进度。

首先是写了一个电机数据转换到电机CAN数据的工具,用于方便的结合USB2CAN使用。

随后是spi测试代码,结合网上的资料进行了部分修改,同时该代码也在树莓派上进行了测试(由于UP Board与树莓派的SPI接口顺序相同,可以直接使用),也没有完成正常测试,我修改了SPIne的代码,输出了部分日志,结果发现说stm32的spi在收到几次的数据后才完成一次数据接收,打出日志,表示是spi中断接收数据的问题。

void spi_isr(void)
{
    led = !led;
    printf("start spi isr");

    GPIOC->ODR |= (1 << 8); // pull high
    GPIOC->ODR &= ~(1 << 8); // pull low
    SPI1->DR = tx_buff[0];

    int bytecount = 0;
    while (cs == 0)
    {
        if (SPI1->SR & 0x1)
        {
            rx_buff[bytecount] = SPI1->DR;
            bytecount++;
            if (bytecount < TX_LEN)
            {
                SPI1->DR = tx_buff[bytecount];
            }
        }
    }

    printf("finish spi isr");

    // after reading, save into spi_command
    // should probably check checksum first!
    uint32_t calc_checksum = xor_checksum((uint32_t*)rx_buff, 32);

    memcpy(&spi_command, &rx_buff, sizeof(spi_command_t));

    // run control, which fills in tx_buff for the next iteration
    if (calc_checksum != spi_command.checksum)
    {
        spi_data.flags[0] = 0xdead;
        spi_data.flags[1] = 0xdead;
    }

    if (is_test)
    {
        test_control();
    }
    else
    {
        control();
        PackAll();
        WriteAll();
    }
}

Screenshot 2023-05-10 221254

现在准备重新写SPIne的底层代码,进行SPI的通信测试。