基于Zynq的OLED驅(qū)動(dòng)設(shè)計(jì)
Zynq的硬件系統(tǒng)是指在PL中配置相關(guān)外設(shè),掛載到PS中,作為PS部分的外設(shè)使用。OLED驅(qū)動(dòng)主要用到6個(gè)IO口,在生成硬件系統(tǒng)時(shí),只需要利用Xilinx的嵌入式工具XPS生成最小硬件系統(tǒng),然后把OLED的相關(guān)引腳添加到最小硬件系統(tǒng)中。主要過程如下:
本文引用地址:http://www.ex-cimer.com/article/273002.htm(1)根據(jù)芯片型號(hào),根據(jù)XPS工具設(shè)計(jì)流程,生成Zynq的最小硬件系統(tǒng)。
(2)在最小硬件系統(tǒng)中,添加外設(shè)IPmy_oled,把OLED的SPI引腳添加到工程中。添加一個(gè)6位寄存器,每位和SPI引腳對(duì)應(yīng)。
(3)my_oledIP核邏輯設(shè)計(jì)主要完成IP核引腳添加、端口映射和用戶邏輯功能。首先要對(duì)設(shè)計(jì)的IP核添加引腳,在系統(tǒng)生成的MPD文件中,添加OLED的相關(guān)引腳端口和方向信息。
在MPD文件中,在PORT下添加OLED的相關(guān)引腳和方向信息,具體代碼如下:
PORTDC=“”,DIR=O
PORTRES=“”,DIR=O
PORTSCLK=“”,DIR=O
PORTSDIN=“”,DIR=O
PORTVBAT=“”,DIR=O
PORTVDD=“”,DIR=O
(4)在系統(tǒng)生成的my_oled.vhd文件中,用VHDL語(yǔ)言進(jìn)行端口設(shè)計(jì),主要進(jìn)行以下兩個(gè)設(shè)計(jì)。
聲明IP和用戶6個(gè)信號(hào)和電源的端口。代碼如下:
DC∶outstd_logic;
RES∶outstd_logic;
SCLK∶outstd_logic;
SDIN∶outstd_logic;
VBAT∶outstd_logic;
VDD∶outstd_logic;
將用戶端口和IP核端口進(jìn)行映射,代碼如下:
DC =>DC,
RES =>RES,
SCLK =>SCLK,
SDIN =>SDIN,
VBAT =>VBAT,
VDD =>VDD,
(5)在系統(tǒng)生成的user_logic.v文件中,用Verilog語(yǔ)言進(jìn)行邏輯設(shè)計(jì),實(shí)現(xiàn)寄存器和SPI對(duì)應(yīng)端口連接并實(shí)時(shí)讀取,主要代碼如下。其中slv_reg0為IP核寄存器,tmp為用戶定義臨時(shí)寄存器,tmp的每一位和IP端口一一對(duì)應(yīng)。實(shí)現(xiàn)把slv_reg0寄存器低6位實(shí)時(shí)傳給tmp寄存器,通過對(duì)寄存器slv_reg0的寫操作達(dá)到控制6個(gè)引腳的時(shí)序。
always@(posedgeBus2IP_Clk)
begin
tmp<=slv_reg0[5:0];
end
4 OLED驅(qū)動(dòng)程序設(shè)計(jì)
由于ZedBoard開發(fā)板上的OLED使用的是SPI協(xié)議,并且只支持寫,不支持讀,因此控制OLED就是在SCLK的時(shí)鐘下,通過SDIN進(jìn)行命令和數(shù)據(jù)的傳輸。OLED的控制需要經(jīng)過初始化、傳數(shù)據(jù)和命令以及對(duì)顯存設(shè)置等操作實(shí)現(xiàn)。
4.1 初始化
驅(qū)動(dòng)IC的初始化代碼,可以參考廠家推薦的設(shè)置,但需要根據(jù)開發(fā)板上OLED實(shí)際參數(shù)進(jìn)行一些修改。
根據(jù)SSD1306數(shù)據(jù)手冊(cè)的初始化說明,具體步驟如圖4所示。初始化的實(shí)現(xiàn)就是對(duì)SSD1306進(jìn)行寫命令。
圖4 SSD1306初始化步驟
評(píng)論