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顯示一幅圖像。
點擊這里獲取OLED數據手冊。
現在,你可以方便地獲取第一年的亞當·泰勒玩轉MicroZed系列Kindle電子書版本了,很實惠僅需7.5美元。點擊這里。
原文鏈接:
http://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-ish-...