楼主我最近也在研究硬件SPI驱动,这样刷新比较快 哦,大概快个20-30倍左右。。。但还是没有点亮,硬件准备画个板重新测试一下,软件如下希望给你有帮助,,,
// 宏定义
#define SPI_MODE_2 (0x08 | 0x04) // CPOL=1, CPHA=0
#define SPI_SPEED_DIV16 (0x02) // SPR=10, 时钟分频为16
#define SPI_ENABLE (0x40) // SPEN=1
#define SPI_MASTER_MODE (0x10) // MSRT=1
void init_SPI() // 初始化硬SPI
{
CS = 0; // 打开片选信号,使能OLED屏
P_SW1 |= 0x04; // P2.2-P2.5
SPSTAT = 0xC0; // 清空标志位
SPCTL = (SPCTL & ~0x80) | SPI_ENABLE; // 使能SPI
SPCTL = (SPCTL & ~0x10) | SPI_MASTER_MODE; // 设置为主机模式
SPCTL = (SPCTL & ~0x18) | SPI_MODE_2; // 设置时钟极性和相位
SPCTL = (SPCTL & ~0x03) | SPI_SPEED_DIV16; // 设置时钟分频
}
void OLED_WriteByte(unsigned char dat, unsigned char cmd)
{
if (cmd != 0 && cmd != 1)
{
// 参数错误处理
return;
}
DC = cmd; // 写命令或写数据
SPI_WriteByte(dat); // 硬SPI写数据
}
void SPI_WriteByte(unsigned char dat)
{
SPSTAT = 0xC0; // 清空标志位
SPDAT = dat; // 写入数据
unsigned int timeout = 1000; // 设置超时计数
while (!(SPSTAT & 0x80) && timeout--) // 等待传输完成,同时检查超时
{
// 空循环
}
if (timeout == 0)
{
// 处理超时情况,例如设置错误标志或重启SPI模块
}
} |