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-...