Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动

Microblaze添加自定义IP核,挂AXI总线,SSD1306 OELD驱动

前言

本着好好学习,认真负责的态度,我计划在空闲时间把自己用到的一些模块的使用方法与心得总结下与大家分享下,技术交流的同时共同进步,如有问题,欢迎批评指正!
本次先着重讲下添加带AXI总线的核实现SSD1306驱动,后续还会包括以下模块

  1. UART_AXI核使用及AXI总线详解
  2. QSPI_AXI核的使用
  3. AXI_DMA与AXI_FIFO使用,实现PS与PL端数据交互
  4. PS端中断的使用及其详细调用过程
  5. PS端定时器、看门狗等模块的使用
  6. 使用R5核实现TCP/IP协议及R5核之间通过Cache数据交互
  7. 通过AXI_HWICAP模块实现远程更新

上述模块会在近期一一更新,感兴趣的朋友可以关注下我☺

平台

Vivado 2017.4
XC7K325
SSD1306 SPI接口 OLED
示波器

操作步骤

  1. 新建工程,创建基于AXI总线的IP
    Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动_第1张图片
    Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动_第2张图片

根据路径找到自动生成的代码,根据需要进行修改,一般顶层文件Wrapper修改下文件名以符合规范。
Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动_第3张图片
将文件拷贝到自定义的源代码文件夹中,进行修改,添加自定义功能模块,拷贝完后,就可以将生成的ip_repo文件夹删除,防止后续添加IP时冲突。

  1. 修改AXI_IP代码
    主要是添加功能代码,
    在这里插入图片描述

,添加代码文件夹,重新封装
Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动_第4张图片
Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动_第5张图片
修改增加器件兼容性
IP创建成功后,在响应目录下回出现这两个东西
Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动_第6张图片

  1. 新建OLED显示的工程,创建新的BD,添加刚才自定义的IP,选中含有.xml文件的文件夹即可,vivado会自动识别目录下的IP。
    Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动_第7张图片
  2. 添加必要的组件,搭建好工程,编辑引脚约束,完成后编译文件,产生bit文件,后导入SDK,其中的MicroBlaze模块也可以使用ZYNQ模块替代,我在这个工程中还有一些其他外设,所以看起来复杂一些,大家可以根据自己情况裁剪。

Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动_第8张图片

  1. 在SDK中添加必要的驱动函数,编写主程序,运行,查看效果,如下图所示,
    实际显示效果有点问题,这个SSD1306 IP 的显示程序实际只用到了0-3page,即只用了半个屏幕,而下图的显示感觉像是隔一行显示,但是压缩一下又不太对,怀疑是字库有问题,真是逼死强迫症,文章写到此本该结束了,但本着追求完美的态度,同时增加文章的价值,我决定深度调试下,找出问题的原因并解决,下面再展示下调试过程。

Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动_第9张图片

SSD1306显示原理

调试之前,首先要了解下SSD1306的显示原理,仔细讲起来可能有点搂不住,下面附上我购买的OLED的连接,可以直接查看其附带文档,本次实验也是用的这款0.96的OLED,接口为SPI。
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.33252e8dxOlfdI&id=562145367495&_u=lcghn79cbb2
IP的代码是从别处抠来的,所以引脚不完全兼容,但是这并不影响使用,引脚对应如下,“\”表示可以忽略不接。

IP Signal Name Description OLED pin
VBAT Power Supply for DC/DC Converter Circuit \
RES# Power Reset for Controller and Driver RES
D/C# Data/Command Control DC
SCLK Serial Clock Input Signal D0
SDIN Serial Data Input Signal D1
VDD Power Supply for Logic \

SSD1306是一块内置CMOS OLED/PLED驱动控制器的IC芯片,芯片可以驱动共阴型OLED面板。芯片内部包含晶振、显示RAM、对比度控制模块以及256级亮度控制模块,大大降低了外围元器件数量和功耗。MCU可以通过6800/8000并行接口,I2C接口或者SPI接口实现对SSD1306的控制。
SSD1306的显存总共为128 * 64bit大小,SSD1306将这些显存分为了8页,其对应关系如下:Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动_第10张图片
可以看出,SSD1306的每页包含了128个字节,总共8页,这样刚好是128 * 64的点阵大小。
Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动_第11张图片

问题解决

为了解决这个问题,一顿看代码看文档,看了原厂SSD1306的datasheet,
Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动_第12张图片
看到这里,我忽然觉得跟OLED的初始化有关系,所以,我对其初始化代码进行了修改,重新编译下载后变成了这样
Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动_第13张图片
是不是让人很绝望……不过,事情至少朝着我想要的方向发展了,因为上图的显示确实变成了128 * 32像素的显示,说明初始化代码的修改起作用了,但肯定还是有哪个地方没有配置好,所以,参照另外一段C的代码,我对其初始化部分又做了修改……
Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动_第14张图片
下面半屏慕名奇妙下起了雪……
这应该是由于下半屏没有清屏造成的
工程真实是越做越大,都做到了这一步,我索性来了一个大修改,把驱动改成了128 * 64的IP……最终效果如下
Microblaze添加自定义IP核,挂AXI总线实现SSD1306 OELD驱动_第15张图片

结语

时间精力有限,就先写这么多,要是有具体问题,欢迎留言讨论!

本工程所用代码已上传github
https://github.com/njustmemszj/1908_OLED_SSD1306.git

各位看客老爷要是觉得有用可以扫码打赏下以示支持,万分感谢!

你可能感兴趣的:(ZYNQ,Xilinx,microblaze,IP,OLED)