feiyu 发表于 2025-4-24 22:26:10

DebugLab 发表于 2025-4-24 22:13
使用SPI_DMA也要先正确配置SPI相关寄存器
SS不需要逐字节控制,忽略SS使用GPIO控制SS即可,数据包之前置0 ...

我没用SS,我直接IO口控制的,写的时候方便就这么写了,肯定是可以正常通信的,用软件和SPI硬件都是正常的,现在是不知道为啥用DMA就会导致CS错位

DebugLab 发表于 2025-4-24 22:29:14

feiyu 发表于 2025-4-24 22:26
我没用SS,我直接IO口控制的,写的时候方便就这么写了,肯定是可以正常通信的,用软件和SPI硬件都是正常 ...
SS和其他信号不同步
不能硬件操作SCLK和MOSI同时软件逐字节操作SS

feiyu 发表于 2025-4-24 22:32:37

DebugLab 发表于 2025-4-24 22:29
SS和其他信号不同步
不能硬件操作SCLK和MOSI同时软件逐字节操作SS


P_SW1 = (P_SW1 & ~(3<<2)) | (1<<2);   //IO口切换. 0: P1.2/P5.4 P1.3 P1.4 P1.5, 1: P2.2 P2.3 P2.4 P2.5, 2: P5.4 P4.0 P4.1 P4.3, 3: P3.5 P3.4 P3.3 P3.2
    SSIG = 1; //忽略 SS 引脚功能,使用 MSTR 确定器件是主机还是从机
    SPEN = 1; //使能 SPI 功能
    DORD = 0; //先发送/接收数据的高位( MSB)
    MSTR = 1; //设置主机模式
    CPOL = 0; //SCLK 空闲时为低电平,SCLK 的前时钟沿为上升沿,后时钟沿为下降沿
    CPHA = 0; //数据 SS 管脚为低电平驱动第一位数据并在 SCLK 的后时钟沿改变数据
    SPCTL = (SPCTL & ~3) | 3;   //SPI 时钟频率选择, 0: 4T, 1: 8T,2: 16T,3: 2T

我没有用SS,CS脚一直是手动控制的,P26

DebugLab 发表于 2025-4-24 22:40:50

feiyu 发表于 2025-4-24 22:32
P_SW1 = (P_SW1 & ~(3

数据包前置0,数据包后置1,不要逐字节操作

feiyu 发表于 2025-4-24 22:50:56

DebugLab 发表于 2025-4-24 22:40
数据包前置0,数据包后置1,不要逐字节操作

我纯软件和纯硬件都是每个字节都控制了CS,可以正常运行,只有加了DMA之后CS错位。

feiyu 发表于 2025-4-24 23:02:06

feiyu 发表于 2025-4-24 19:22
两种我都试过了,一样的

是全屏刷纯色,因为CS时序错位了,导致通信出错,所以只有局部。

DebugLab 发表于 2025-4-25 08:04:00

feiyu 发表于 2025-4-24 23:02
是全屏刷纯色,因为CS时序错位了,导致通信出错,所以只有局部。

DMA是批量数据传输,不要每个字节都操作CS
除非每次只发送一个字节,但每次只发送一个字节就没有必要用DMA

feiyu 发表于 2025-4-25 08:15:45

DebugLab 发表于 2025-4-25 08:04
DMA是批量数据传输,不要每个字节都操作CS
除非每次只发送一个字节,但每次只发送一个字节就没有必要用DM ...

是设置地址命令字节操作CS,DMA发送屏幕颜色数据时是一直接拉低的,你看第一个时序,后面有一堆数据那里才是DMA在发送

feiyu 发表于 2025-4-25 08:58:56

代码已上传

DebugLab 发表于 2025-4-25 09:12:03

feiyu 发表于 2025-4-25 08:15
是设置地址命令字节操作CS,DMA发送屏幕颜色数据时是一直接拉低的,你看第一个时序,后面有一堆数据那里 ...

一般设置地址阶段是不使用DMA的,因为数据量很小
设置好地址后,开启DMA批量发送像素数据
页: 1 [2] 3
查看完整版本: STC32G DMA+SPI驱动LCD彩屏有问题|已解决