STC32G DMA+SPI驱动LCD彩屏有问题|已解决
ST7735,像素128*160,单独使用软件驱动、硬件SPI驱动都没问题,把DMA加上刷新就乱了。目前查出来问题是CS时序错位了,片选没有用SS,CS是P26手动控制的,操作DMA导致CS时序错位。
找到问题了,代码清除标志放到了后面,DMA完成后SPIF为1,导致还没有发送完成就退出while拉高CS了,
接着硬件发送完成又将SPIF置1,导致下一个数据也出现同样的情况,发送数据前先清除标志就是对的。
代码已修改,可以正常运行:
lcd.h定义
显示测试函数,直接将SPI_DMA_Run()注释掉CS时序就是正常的。
片选没有用SS,CS是P26手动控制的,操作DMA导致CS时序错位。
下面是时序图,上面一组是有DMA发送数据的(CS时序错位),下面一组是屏蔽了DMA发送的(CS时序正常)。
时序对应代码LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
针对您提到的STC32G芯片在使用DMA+SPI驱动ST7735 LCD彩屏时出现刷新混乱的问题,以下是一些可能的原因及解决方案,供您参考:
1. DMA配置问题
DMA传输模式:确保DMA配置为正确的传输模式(如内存到外设模式),并且传输宽度与SPI数据宽度匹配。
DMA缓冲区对齐:检查DMA缓冲区的地址是否对齐,未对齐的地址可能导致数据传输错误。
DMA传输长度:确认DMA传输长度设置正确,避免传输过多或过少的数据。
2. SPI配置问题
SPI时钟频率:确保SPI时钟频率与LCD屏的时序要求匹配,过高的频率可能导致数据传输不稳定。
SPI数据格式:检查SPI数据格式(如数据位宽、极性、相位)是否与LCD屏的通信协议一致。
SPI DMA使能:确认SPI的DMA使能位已正确设置,以确保DMA能够正常触发SPI传输。
3. 时序问题
DMA与SPI的同步:DMA传输与SPI传输之间可能存在时序不同步的问题,建议在DMA传输完成后加入适当的延时或等待SPI传输完成的标志。
LCD屏的初始化时序:确保LCD屏的初始化时序正确,特别是在使用DMA传输时,初始化命令和数据可能需要额外的延时。
4. 内存管理问题
DMA缓冲区溢出:检查DMA缓冲区是否足够大,避免缓冲区溢出导致数据传输错误。
内存访问冲突:确保DMA缓冲区在传输过程中不会被其他任务或中断修改,导致数据不一致。
5. 中断处理
DMA传输完成中断:如果使用了DMA传输完成中断,确保中断处理函数中正确清除中断标志,并处理可能的错误情况。
SPI传输完成中断:如果SPI传输完成中断与DMA传输同时使用,确保中断处理函数不会干扰DMA传输。
6. 调试建议
逐步调试:建议逐步调试,先使用软件SPI驱动确认LCD屏的基本功能正常,再逐步引入硬件SPI和DMA,观察每一步的变化。
逻辑分析仪:使用逻辑分析仪捕获SPI信号,分析数据传输的时序和内容,找出可能的错误点。
调试信息输出:在关键步骤输出调试信息,如DMA传输开始和结束的标志,SPI传输的状态等,帮助定位问题。
7. 代码优化
DMA传输优化:优化DMA传输的代码,减少不必要的操作,确保DMA传输的效率和稳定性。
SPI传输优化:优化SPI传输的代码,确保SPI传输的时序和数据格式正确。
8. 参考文档
芯片手册:仔细阅读STC32G芯片手册中关于DMA和SPI的章节,确保配置符合芯片的要求。
LCD屏手册:参考ST7735 LCD屏的手册,确保通信协议和时序配置正确。
通过以上步骤的排查和优化,您应该能够解决DMA+SPI驱动ST7735 LCD彩屏时出现的刷新混乱问题。如果问题仍然存在,建议进一步分析具体的硬件和软件环境,或寻求更专业的技术支持。
[本文内容由国芯人工智能辅助生成,仅供参考] 首先解决内存对齐问题
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=16306
ercircle 发表于 2025-4-24 19:01
首先解决内存对齐问题
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=16306
两种我都试过了,一样的 feiyu 发表于 2025-4-24 19:22
两种我都试过了,一样的
上传完整工程看看
我找到问题了,CS片选错位了,不知道什么原因引起的,把LCD_DMA_Fill里面的DMA发送(SPI_DMA_Run)注释了CS就是正常。
从时序上看是DMA发送影响到片选了,图片中上面有DMA的CS片选时序错了,下面没有DMA是对的。 ercircle 发表于 2025-4-24 20:20
上传完整工程看看
可以看看我发的时序图,我明天空了把这部分代码拆出来上传。 ercircle 发表于 2025-4-24 20:20
上传完整工程看看
可以看看我发的时序图,我明天空了把这部分代码拆出来上传。 这是写数据命令的代码 feiyu 发表于 2025-4-24 21:29
我找到问题了,CS片选错位了,不知道什么原因引起的,把LCD_DMA_Fill里面的DMA发送(SPI_DMA_Run)注释了C ...
使用SPI_DMA也要先正确配置SPI相关寄存器
SS不需要逐字节控制,忽略SS使用GPIO控制SS即可,数据包之前置0,数据包之后置1