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批量发送像素数据