使用AT32移植U8G2时, 不出图像,经排查是SPI发送最后一个数据时,没有发送完成,CS就被拉高了。
uint8_t u8x8_byte_4wire_hw_spi(u8x8_t *u8x8, uint8_t msg, uint8_t arg_init, void *arg_ptr)
{
switch (msg)
{
case U8X8_MSG_BYTE_SEND:
uint8_t *p = arg_ptr;
while(arg_init)
{
while(spi_i2s_flag_get(SPI2, SPI_I2S_TDBE_FLAG) == RESET);
spi_i2s_data_transmit(SPI2, *p);
arg_init--;
p++;
}
while(spi_i2s_flag_get(SPI2, SPI_I2S_BF_FLAG) == SET);
break;
case U8X8_MSG_BYTE_INIT:
break;
case U8X8_MSG_BYTE_SET_DC:
gpio_bits_write(GPIOB, GPIO_PINS_14, (confirm_state)arg_init);
break;
case U8X8_MSG_BYTE_START_TRANSFER:
u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_enable_level);
u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->post_chip_enable_wait_ns, NULL);
break;
case U8X8_MSG_BYTE_END_TRANSFER:
u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->pre_chip_disable_wait_ns, NULL);
u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_disable_level);
break;
default:
return 0;
break;
}
}
在写发送回调时,最后务必添加while(spi_i2s_flag_get(SPI2, SPI_I2S_BF_FLAG) == SET);
,否则有可能最后一个数据没有发送完成。