我在我的一个项目中使用便宜的2.4"带ILI9340 / 41控制器的320x240 TFT显示屏。考虑到价格,它的效果非常好,当我展示某些东西时,我没有任何问题。但我什么都读不懂。我认为它使用4线SPI
但不幸的是,任何读取尝试都不成功。在第一次虚拟写入时,我在MISO线上看到了一些奇怪的活动,并且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);
}
也许有人知道问题出在哪里。我已经尝试了一切。
答案 0 :(得分:1)
从您的代码中看起来您只发送一个字节然后再次取消断言CS。我怀疑那是你遇到麻烦的地方。
datasheet的第35页说,CS可以在写周期的命令和参数之间取消置位。读周期没有明确允许它。数据表的第38页显示了读取周期而没有将CS置为中断。另请注意,对于8位以外的读取,需要虚拟时钟周期。这可能意味着您需要手动生成虚拟时钟周期,因为stm32系列通常只有8位和16位SPI通信。也许你可以作弊,只读取3/4字节并丢失最后一位并将值移位一位。另一个想法可能是使用USART并在8位和9位同步模式之间切换。但是,您必须调整命令/数据的字节顺序。
答案 1 :(得分:0)
我最终把它整理出来:)。由于某种原因,它需要两个连续的软件重置命令来开始发送数据:),现在它按预期工作