|
|
樓主我最近也在研究硬件SPI驅(qū)動(dòng),這樣刷新比較快 哦,大概快個(gè)20-30倍左右。。。但還是沒(méi)有點(diǎn)亮,硬件準(zhǔn)備畫(huà)個(gè)板重新測(cè)試一下,軟件如下希望給你有幫助,,,
// 宏定義
#define SPI_MODE_2 (0x08 | 0x04) // CPOL=1, CPHA=0
#define SPI_SPEED_DIV16 (0x02) // SPR=10, 時(shí)鐘分頻為16
#define SPI_ENABLE (0x40) // SPEN=1
#define SPI_MASTER_MODE (0x10) // MSRT=1
void init_SPI() // 初始化硬SPI
{
CS = 0; // 打開(kāi)片選信號(hào),使能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è)置為主機(jī)模式
SPCTL = (SPCTL & ~0x18) | SPI_MODE_2; // 設(shè)置時(shí)鐘極性和相位
SPCTL = (SPCTL & ~0x03) | SPI_SPEED_DIV16; // 設(shè)置時(shí)鐘分頻
}
void OLED_WriteByte(unsigned char dat, unsigned char cmd)
{
if (cmd != 0 && cmd != 1)
{
// 參數(shù)錯(cuò)誤處理
return;
}
DC = cmd; // 寫(xiě)命令或?qū)憯?shù)據(jù)
SPI_WriteByte(dat); // 硬SPI寫(xiě)數(shù)據(jù)
}
void SPI_WriteByte(unsigned char dat)
{
SPSTAT = 0xC0; // 清空標(biāo)志位
SPDAT = dat; // 寫(xiě)入數(shù)據(jù)
unsigned int timeout = 1000; // 設(shè)置超時(shí)計(jì)數(shù)
while (!(SPSTAT & 0x80) && timeout--) // 等待傳輸完成,同時(shí)檢查超時(shí)
{
// 空循環(huán)
}
if (timeout == 0)
{
// 處理超時(shí)情況,例如設(shè)置錯(cuò)誤標(biāo)志或重啟SPI模塊
}
} |
|