ILI9340/41 便宜的 2.4" LCD 显示器 SPI - 无法从控制器读取

ILI9340/41 cheap 2.4" LCD display SPI - can't read from the controller

在我的一个项目中,我使用便宜的 2.4" 320x240 TFT 显示器和 ILI9340/41 控制器。它工作得很好,考虑到价格,我在显示东西时没有任何问题.但是我什么也看不到。我认为它使用4线SPI

但不幸的是,任何读取尝试都不成功。在第一次虚拟写入时,我在 MISO 线上看到一些奇怪的 activity,并且 MISO 被驱动为高电平。

void LCD_SendCommand(SPI_TypeDef * volatile SPIx, int command)
{
    ReSetBit(CS_PORT,CS);
    ReSetBit(DC_PORT,DC);
    while(!(SPIx -> SR & SPI_SR_TXE));
        *(volatile uint8_t *)&SPIx -> DR = (uint8_t)command;
    while(!(SPIx -> SR & SPI_SR_TXE));
    while(SPIx -> SR & SPI_SR_BSY);
    SetBit(CS_PORT,CS);

}

void LCD_SendPar(SPI_TypeDef * volatile SPIx, int par)
{
    ReSetBit(CS_PORT,CS);
    SetBit(DC_PORT,DC);
    *(volatile uint8_t *)&(SPIx -> DR) = (uint8_t)(par);
    while(!(SPIx -> SR & SPI_SR_TXE));
    while(SPIx -> SR & SPI_SR_BSY);
    SetBit(CS_PORT,CS);
}

也许有人知道问题出在哪里。我几乎什么都试过了。

从你的代码来看,你似乎只发送了一个字节,然后再次取消断言 CS。我怀疑这就是你 运行 遇到麻烦的地方。

datasheet 的第 35 页说 CS 可以在写周期的命令和参数之间取消断言。读取周期没有明确允许。数据表的第 38 页显示了读取周期,中间没有解除断言 CS。

另请注意,对于 8 位以外的读取,需要虚拟时钟周期。这可能意味着您需要手动生成虚拟时钟周期,因为 stm32 系列通常只有 8 位和 16 位 SPI 通信。也许你可以作弊,只读取 3/4 个字节并丢失最后一位并将值移动一位。另一个想法可能是使用 USART 并在 8 位和 9 位同步模式之间切换。不过,您必须调整 commands/data 的 Endianness。

我终于解决了:)。出于某种原因,它需要两个连续的软件重置命令才能开始发送回数据 :),现在它按预期工作。