|
樓主我最近也在研究硬件SPI驅(qū)動,這樣刷新比較快 哦,大概快個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; // 清空標(biāo)志位
SPCTL = (SPCTL & ~0x80) | SPI_ENABLE; // 使能SPI
SPCTL = (SPCTL & ~0x10) | SPI_MASTER_MODE; // 設(shè)置為主機模式
SPCTL = (SPCTL & ~0x18) | SPI_MODE_2; // 設(shè)置時鐘極性和相位
SPCTL = (SPCTL & ~0x03) | SPI_SPEED_DIV16; // 設(shè)置時鐘分頻
}
void OLED_WriteByte(unsigned char dat, unsigned char cmd)
{
if (cmd != 0 && cmd != 1)
{
// 參數(shù)錯誤處理
return;
}
DC = cmd; // 寫命令或?qū)憯?shù)據(jù)
SPI_WriteByte(dat); // 硬SPI寫數(shù)據(jù)
}
void SPI_WriteByte(unsigned char dat)
{
SPSTAT = 0xC0; // 清空標(biāo)志位
SPDAT = dat; // 寫入數(shù)據(jù)
unsigned int timeout = 1000; // 設(shè)置超時計數(shù)
while (!(SPSTAT & 0x80) && timeout--) // 等待傳輸完成,同時檢查超時
{
// 空循環(huán)
}
if (timeout == 0)
{
// 處理超時情況,例如設(shè)置錯誤標(biāo)志或重啟SPI模塊
}
} |
|