By Adam Taylor
在上期的博客中,我們同時研究了如何通過Zynq SoC的PS(處理器系統)MIO和PL(可編程邏輯)EMIO來使用SPI通信。本期博客中為了給OLED模塊進行上電,我們將通過EMIO同時使用SPI和GPIO。
為了控制OLED模塊,我們需要使用下表中定義的和在第81部分中簡要提到的一些GPIO:
信號 | FPGA IO | PS GPIO標識號 | 描述 | 方向 |
復位 | U9 | 54 | 低電平復位 | 輸出 |
VDD | U12 | 55 | 低電平數字電源使能 | 輸出 |
VBatt | U11 | 56 | 低電平Dc/Dc電源使能 | 輸出 |
數據/命令 | U10 | 57 | 數據/命令。命令 = 0 | 輸出 |
在EMIO模式下我們使用這些GPIO的方式和在MIO模式下的方式完全一致。我們需要驅動這些信號來滿足下圖中定義的時序:
OLED上電
OLED掉電
為了實現上述目的,我們可以使用Zynq SoC的CPU中的私有定時器。一旦通過使用GPIO信號實現這些時序后(t1 = 3us,t2 = 3us,toff = 100ms),接著我們就可以進行初始化,然后通過SPI總線把命令發送到OLED模塊了。
想要使用EMIO中的GPIO需遵循以下步驟:
? 包含頭文件xgpiops.h
? 使用XGpioPs類型聲明GPIO
? 使用XGpioPs_Config類型來聲明一個GPIO配置指針
? 使用XGpioPs_LookupConfig()函數來查詢GPIO配置
? 使用XGpioPs_CfgInitialize()函數來初始化GPIO
一旦我們已經初始化好GPIO并準備好傳送信號之后,我們需要聲明信號的方向,并且假如需要,我們還要使能它。所有這些信號都是輸出,因此我們把它們聲明為輸出,并且在定義信號初始狀態之前,將這些輸出使能。下面是一個演示以上步驟的例程:
#define vdd 55
XGpioPs_SetDirectionPin(&Gpio, vdd, 1);
XGpioPs_SetOutputEnablePin(&Gpio, vdd, 1);
XGpioPs_WritePin(&Gpio, vdd, 1);
OLED模塊正確上電之后,我們現就可以給OLED模塊發送命令了。
但發什么命令呢?
為了初始化OLED模塊,我們需要配置它的構建控制器,這就需要發送一個23字節的配置字符串來把OLED控制器置為顯示信息的狀態。在下一期的博客中,接著我們會開始把顯示的信息發送到OLED面板中,但是現在,我們需要通過OLED面板數字手冊中提供的SPI鏈路來發送以下命令:
1. 關掉顯示
2. 設置好時鐘、頻率、分頻器和倍頻器設置
3. 設置顯示偏移和開始線
4. 配置好電源供應來驅動OLED面板
5. 配置好映射、掃描方向和引腳硬件配置
6. 設置預供電時段
7. 開啟顯示
如上面所說,這7個命令需要23個字節。為了簡化該過程,我聲明了一個包含了所有這些配置字的u8數組,我們寫SPI總線的時候可以把它們循環發送出去。在配置文件的最后,我們可以看到OLED已經啟動了,雖然上面還沒有任何顯示的內容。下面是配置代碼的片段:
u8 init_vector[23] = {0xae, 0xd5, 0x80, 0xa8, 0x1f, 0xd3, 0x00, 0x40, 0x8d, 0x14, 0xa1, 0xc8, 0xda, 0x02, 0x81, 0x8f, 0xd9, 0xf1, 0xdb, 0x40, 0xa4, 0xa6, 0xaf};
for(i =0; i<23; i++){
wr_buff[0] = (u8) init_vector[i];
XGpioPs_WritePin(&Gpio, dc, 0); // 設置DC為命令
XSpiPs_SetSlaveSelect(&SpiInstance_EMIO, 0x01); //選擇從機
XSpiPs_PolledTransfer(&SpiInstance_EMIO, wr_buff, NULL, 1); //寫控制字
XGpioPs_WritePin(&Gpio, dc, 1); // 設置DC為數據
}
下期博客中,我們會研究如何讓OLED顯示一幅圖像。