最近鸽了比较长时间,因为一直在测试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();
}
}
现在准备重新写SPIne的底层代码,进行SPI的通信测试。