樓主我最近也在研究硬件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模塊
}
} |