野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6964|回复: 1

M0+MAC+TCP/IP 以太网单芯片方案 W7500EVB用户手册连载(13)--实战篇

[复制链接]
发表于 2018-3-12 17:28:24 | 显示全部楼层 |阅读模式
W7500(W7500P)芯片简介:
W7500 芯片为工业级以太网单芯片解决方案, 集成 ARM Cortex-M0,128KB Flash 及全硬件TCP/IP 核(和W5500、W5100内核一致),特别适用于物联网领域。 使用 W7500EVB, 让您轻松完成原型开发。

全硬件TCP/IP核的最大优点是他在执行联网操作时不需要占用MCU的运行资源,大大增加了MCU的工作效率。

本次试验目的是通过W7500EVBSPI总线实现与OLED屏通信。将会利用W7500EVB PB0PB1PB2PB3管脚和SPI总线的通信管脚来点亮OLED屏,实现字符显示。

想了解更多关于WIZnet W7500更多信息,或者有技术问题请联系我们:gustin@wisioe.com
深圳炜世科技—WIZnet官方代理商,全程技术支持,价格绝对优势!
电话:0755-86568556
邮箱:support@wisioe.com
回复

使用道具 举报

 楼主| 发表于 2018-3-12 17:30:27 | 显示全部楼层
第十四章 OLED试验
本次试验目的是通过W7500EVB的SPI总线实现与OLED屏通信。将会利用W7500EVB的 PB0,PB1,PB2,PB3管脚和SPI总线的通信管脚来点亮OLED屏,实现字符显示。
本章分为如下几个部分:
14.1 OLED 简介
14.2 硬件设计
14.3 软件设计
14.4 下载验证


14.1 OLED 简介
OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(OrganicElectroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。LCD 都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术, OLED 的尺寸还难以大型化,但是分辨率确可以做到很高,如图14.1.1所示:
在本章中,我们使用的是 OLED 显示模块,该模块有以下特点:
1) 模块有单色和双色两种可选,单色为纯蓝色,而双色则为黄蓝双色。
2) 尺寸小,显示尺寸为 0.96 寸,而模块的尺寸仅为 27mm*26mm 大小。
3) 高分辨率,该模块的分辨率为 128*64。
4) 多种接口方式,该模块提供了总共 5 种接口包括:6800、8080 两种并行接口方式、3线或 4 线的串行 SPI 接口方式、IIC 接口方式(只需要 2 根线就可以控制 OLED 了!)。
5) 不需要高压,直接接 3.3V 就可以工作了。
1.JPG
图14.1.1 0.96寸OLED正反面图
OLED 模块的接口方式需要如下一些信号线:
CS: OLED 片选信号。
SCK:时钟线。
SDA:数据线。
RST(RES):硬复位 OLED。
DC:命令/数据标志(0,读写命令; 1,读写数据)。
在 4 线 SPI 模式下,每个数据长度均为 8 位,在 SCK 的上升沿,数据从 SDA 移入到SSD1306,并且是高位在前的。 DC 线是用作命令/数据的标志线。写操作的时序如图14.1.2所示:
2.JPG
图14.1.2 SPI通信时序图
接下来,介绍一下模块的显存, SSD1306 的显存总共为 128*64bit 大小, SSD1306 将这些显存分为了 8 页,如图14.1.3所示:
3.JPG
图14.1.3 OLED模块的显存
可以看出, SSD1306 的每页包含了128个字节,总共 8 页,这样刚好是 128*64 的点阵大小。因为每次写入都是按字节写入的,这就存在一个问题,如果使用只写方式操作模块,那么,每次要写8个点,这样,在画点的时候,就必须把要设置的点所在的字节的每个位都搞清楚当前的状态(0/1),否则写入的数据就会覆盖掉之前的状态,结果就是有些不需要显示的点,显示出来了,或者该显示的没有显示了。这个问题在能读的模式下,可以先读出来要写入的那个字节,得到当前状况,在修改了要改写的位之后再写进 GRAM,这样就不会影响到之前的状况了。但是这样需要能读 GRAM,对于 3 线或 4 线 SPI 模式,模块是不支持读的,而且读->改->写的方式速度也比较慢。所以采用的办法是在 W7500 的内部建立一个 OLED 的 GRAM(共128*8个字节),在每次修改的时候,只是修改 W7500 上的 GRAM(实际上就是 SRAM),在修改完了之后,一次性把 W7500 上的 GRAM 写入到 OLED 的 GRAM。这里仅介绍几个比较常用的命令,如图14.1.4所示:
4.JPG
图14.1.4 OLED常用的命令
第一个命令为 0X81,用于设置对比度的,这个命令包含了两个字节,第一个 0x81 为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。
第二个命令为 0XAE/0XAF。 0XAE 为关闭显示命令; 0XAF 为开启显示命令。
第三个命令为 0X8D,该指令也包含2个字节,第一个为命令字,第二个为设置值,第二个字节的 BIT2 表示电荷泵的开关状态,该位为 1,则开启电荷泵,为 0 则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。
第四个命令为 0XB0~B7,该命令用于设置页地址,其低三位的值对应着 GRAM 的页地址。
第五个指令为 0X00~0X0F,该指令用于设置显示时的起始列地址低四位。
第六个指令为 0X10~0X1F,该指令用于设置显示时的起始列地址高四位。
最后,再来介绍一下 OLED 模块的初始化过程,SSD1306 的典型初始化框图,如图14.1.5所示:
5.JPG
图14.1.5 OLED初始化流程图
驱动 IC 的初始化代码,直接使用厂家推荐的设置就可以了,只要对细节部分进行一些修改,使其满足自己的要求即可,其他不需要变动。OLED 的介绍就到此为止,我们重点向大家介绍了 OLED 模块的相关知识,接下来将使用这个模块来显示字符和数字。通过以上介绍,可以得出 OLED 显示需要的相关设置步骤如下:
1 设置 W7500 与 OLED 模块相连接的 IO。
这一步,先将与 OLED 模块相连的 IO 口设置为输出,具体使用哪些 IO 口,这里需要根据连接电路以及 OLED 模块所设置的通讯模式来确定。这些将在硬件设计部分向大家介绍。
2 初始化 OLED 模块。
其实这里就是上面的初始化框图的内容,通过对 OLED 相关寄存器的初始化,来启动 OLED的显示。为后续显示字符和数字做准备。
3 通过函数将字符和数字显示到 OLED 模块上。
这里就是通过设计的程序,将要显示的字符送到 OLED 模块就可以了,这些函数将在软件设计部分向大家介绍。
通过以上三步,就可以使用 OLED 模块来显示字符和数字了。
14.2 硬件设计
本实验用到的硬件资源有:
1)      OLED模块
OLED 模块的电路在前面已有详细说明了,这里介绍一下 OLED 模块与W7500EVB的连接。开发板的 OLED 接口(U3接口) 和 OLED 模块直接可以对插,如图14.2.1所示:
6.JPG
14.2.1 W7500EVB OLED排针原理图
0.96"OLED屏接W7500的SPI1硬件接线定义
OLED_SCK     ---> W7500_PB1         OLED屏的时钟管脚
OLED_SDA    ---> W7500_PB3         OLED屏的数据传输管脚
OLED_RES     ---> W7500_PB2         OLED屏的复位管脚
低电平时对模块进行复位操作,运行中应一直处于高电平
OLED_DC      ---> W7500_PB0         OLED屏的数据/命令管脚
低电平时传输的是数据,高电平时传输的是指令
OLED_CS       ---> GND                         OLED屏的片选管脚
低电平时对模块操作有效,高电平时对模块操作无效
14.3 软件设计
在W7500EVB OLED试验中可以发现 user文件下面有一个 oled.c 文件,同时包含了头文件 oled.h。
oled.c 的代码,由于比较长,这里我们就不贴出来了,仅介绍几个比较重要的函数。首先是 OLED_Init 函数,该函数的结构比较简单,开始是对 IO 口的初始化,其他就是一些初始化序列了,按照厂家提供的资料来做就可以。最后要说明一点的是,因为 OLED 是无背光的,在初始化之后,把显存都清空了,所以在屏幕上是看不到任何内容的,跟没通电一个样,不要以为这就是初始化失败,要写入数据模块才会显示的。 OLED_Init 函数代码如下:
  1. void OLED_Init(void)
  2. {
  3.   OLED_GPIO_init();
  4.   OLED_RES();
  5.   delay_ms(100);
  6.   OLED_SPI_DATA(0xAE,0);
  7.   OLED_SPI_DATA(0x20,0);
  8.   OLED_SPI_DATA(0x10,0);
  9.   OLED_SPI_DATA(0xb0,0);
  10.   OLED_SPI_DATA(0xc8,0);
  11.   OLED_SPI_DATA(0x00,0);
  12.   OLED_SPI_DATA(0x10,0);
  13.   OLED_SPI_DATA(0x40,0);
  14.   OLED_SPI_DATA(0x81,0);
  15.   OLED_SPI_DATA(0xff,0);
  16.   OLED_SPI_DATA(0xa1,0);
  17.   OLED_SPI_DATA(0xa6,0);
  18.   OLED_SPI_DATA(0xa8,0);
  19.   OLED_SPI_DATA(0x3F,0);
  20.   OLED_SPI_DATA(0xa4,0);
  21.   OLED_SPI_DATA(0xd3,0);
  22.   OLED_SPI_DATA(0x00,0);
  23.   OLED_SPI_DATA(0xd5,0);
  24.   OLED_SPI_DATA(0xf0,0);
  25.   OLED_SPI_DATA(0xd9,0);
  26.   OLED_SPI_DATA(0x22,0);
  27.   OLED_SPI_DATA(0xda,0);
  28.   OLED_SPI_DATA(0x12,0);
  29.   OLED_SPI_DATA(0xdb,0);
  30.   OLED_SPI_DATA(0x20,0);
  31.   OLED_SPI_DATA(0x8d,0);
  32.   OLED_SPI_DATA(0x14,0);
  33.   OLED_SPI_DATA(0xaf,0);
  34.   OLED_CLS();
  35. }
复制代码
在OLED初始化里有用到OLED_SPI_DATA,OLED_SPI_DATA函数是用来发送数据的,可以选择发送的是命令还是数据。
  1. void OLED_SPI_DATA(uint8 data,uint8 cod);
复制代码
OLED_SPI_DATA函数的第一个传参是需要发送的数据,第二个传参是选择发送的数据为命令还是数据。
如果要将坐标改成左上脚的第一个点上,可以调用OLED_SPI_DATA函数来发送以下命令:
  1. OLED_SPI_DATA((0xB0 + x),0);  //x = 0
  2. OLED_SPI_DATA((0x0F & y),0);  //y = 0
  3. OLED_SPI_DATA(0x10 | (0xF0 & y),0);
复制代码
其中 x 的范围为: 0~127; y 的范围为: 0~63。
画点函数OLED_DrawPoint函数代码如下:
  1. void OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t data)
  2. {
  3.   OLED_SPI_DATA(0xB0 + x,0);
  4.   OLED_SPI_DATA(0x0F & y,0);
  5.   OLED_SPI_DATA(0x10 | (0xF0 & y),0);
  6.   OLED_SPI_DATA(data,1);
  7. }
复制代码
OLED_DrawPoint函数有3个参数,前两个是坐标,第三个 data 为要写入 1 还是 0。该函数实现了在 OLED模块上任意位置画点的功能。
在介绍完画点函数之后,再介绍一下显示字符函数,在介绍之前,先来看一下字符(ASCII 字符集)是怎么显示在 OLED 模块上去的。要显示字符,先要有字符的点阵数据, ASCII 常用的字符集总共有95个,从空格符开始,分别为: ! " # $ % & ' ( ) * + , - 0 1 2 3 4 5 6 7 8 9 :   ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h I j k l m n o p q r s t u v w x y z { | } ~ . 先要得到这个字符集的点阵数据,这里使用的字符提取软件为:PCtoLCD2002 完美版,如图14.3.1所示:
7.JPG
图14.3.1 取摸软件
然后选择设置,在设置里面设置取模方式,如图14.3.2所示:
8.JPG
图14.3.2 取摸软件设置图
在知道了取模方式之后,就可以根据取模的方式来编写显示字符的代码了,这里针对以上取模方式的显示字符代码如下:
  1. void OLED_ASCII(uint8 x,uint8 y,uint16 site)
  2. {
  3.   uint8 i;
  4.   for(i = 0;i < 16;i++)
  5.   {
  6.     if((i % 8) == 0)
  7.    {
  8.     if(i != 0)
  9.       x++;
  10.     OLED_SPI_DATA(0xB0 + x,0);
  11.     OLED_SPI_DATA(0x10 | ((0xF0 & y) >> 4),0);
  12.     OLED_SPI_DATA((0x0F & y) | 0x01,0);
  13.     }
  14.     OLED_SPI_DATA(ASCII_8x16[i + site],1);
  15.   }
  16. }
复制代码
该函数为字符以及字符串显示的核心部分,函数中 chr=chr-' ';这句是要得到在字符点阵数据里面的实际地址,因为我们的取模是从空格键开始的,例如 oled_asc2_1206[0][0],代表的是空格符开始的点阵码。在接下来的代码,也是按照从上到小,从左到右的取模方式来编写的,先得到最高位,然后判断是写 1 还是 0,画点。接着读第二位,如此循环,直到一个字符的点阵全部取完为止。这其中涉及到列地址和行地址的自增,根据取模方式来理解,就不难了。
最后来看看主函数源码:
  1. int main()
  2. {
  3.   SystemInit();            /* 系统内部时钟初始化 */
  4.   delay_init();               /* 系统滴答时钟配置*/
  5.   UART_Configuration();        /*初始化串口通信:115200@8-n-1*/
  6.   SSP_Configuration();                 /* SPI0配置初始化 */
  7.   OLED_Init();               /* OLED屏配置初始化 */

  8. /*------------------------------------------------------------------
  9.   |  炜世科技—WIZnet W7500官方代理商,全程技术支持,价格绝对优势! |
  10.   ------------------------------------------------------------------*/

  11. OLED_Show_Hybrid(0,0,(uint8*)"炜世科技W7500EVB\r\n    OLED");

  12.   while(1)
  13.   ;
  14. }
复制代码
14.4 下载验证
将代码下载到W7500EVB 开发板后,可以看到OLED 模块显示,如图14.4.1所示:
9.JPG
图14.4.1 W7500EVB OLED试验结果
通过这一章的学习,我们学会了OLED 模块的使用。在调试代码的时候,又多了一种显示信息的途径,在以后的程序编写中,大家可以好好利用。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-1 19:19 , Processed in 0.069984 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表