TMS320F28335 硬件IIC 驱动0.96 inch OLED显示屏 移植过程复盘
作者:互联网
最近尝试从32转向DSP,也算是试验一下自己的硬件学习方法论,从淘宝采购了TMS320F28335 硬件IIC 驱动0.96 inch OLED显示屏。
分步骤走:
1、先看TMS320F28335的硬件IIC寄存器流程:
与32(此处指STM32、GD32)的IIC库函数流程有一些不同,DSP的操作都是寄存器操作,所以单独的发送过程与配置过程是没有解耦的,这也使得整个寄存器配置的时序相对而言有些反逻辑直觉。
(1)首先摆一张IIC的结构图:
图1 IIC发送接收结构
(2)可以看到要发送的数据先到DXR寄存器,然后被自动加载到移位寄存器XSR,因此相对应的发送操作就是顺序向DXR寄存器写入字节数据,这张图没有体现出来的是I2CSAR寄存器是控制本次发送数据的总字节数的寄存器,因此在写入实际数据到DXR之前,需要先将数据长度写入SAR寄存器。
图2 SAR寄存器定义
(3)然后在实际发送数据前需要声明此时发送的从器件地址,也就是I2C_SLAVE_ADDRESS,这里对应OLED的数据手册,7位地址为0x3C,与模拟IIC不同,模拟IIC需要自己处理7位地址时的第8个bit,也就是读/写,而这里是通过控制模式控制寄存器I2CMDR来确定读写,因此可以直接写入7位地址给28335的OAR寄存器,中间记得查询状态寄存器STA.BB检查一下i2c忙不忙。
图3 TI源码 IIC发送数据封装
(4)这里TI的源程序做了一层封装,将一次发送所需的数据打包成了结构体I2CMSG,方便函数接口设置以及适应单次不同长度数据的发送要求,我则对其做了部分更改,就直接输入地址+要发送的短帧数据作为形参,这样省事一些,实际上TI的结构体允许最大
(5)一点学艺不精的小困惑
最开始调试出现的问题在于,只有第一个字节有时钟并且发出去了,后面SCLK被强制拉低,导致SDA后面的数据都不带时钟,因此返回的状态值读出来一直是0x5555,根据TI源程序的定义,这个是I2C_STP_NOT_READY_ERROR
图4 返回的状态值
然后先后排查了硬件连线,短路,从机地址,最后单步debug中,给每句的返回值都加了断点,发现逐语句调试时,通信都正常,一旦断点放开,返回值马上就变成0x5555,于是我猜是从设备的处理速度不够快,于是看了一下电气特性表,在每次访问后面每句都加了3ms的延时,这样才正常工作。
图5 延时示例
2、LOED驱动
这里OLED我是直接用的模块附送的例程,具体没有去深究,看了一下主要还是点阵控制,循环点亮和清除,驱动芯片是SSD1306,暂时先这样,能显示了就OK。
唯一跟单片机相关的一点是,因为显示需要事先存储成点阵数组形式,这种比较耗资源,所以需要更改cmd文件给.text扩容,我看了一下cmd文件基本上就把RAM2赋给了RAM1,空间差不多就够了。
图6 28335 cmd更改以存储字符点阵
3、总结
整个移植用了两天,其实改代码还好,主要是看文档理解整个过程,以及跟上面提到的IIC的发送延时作斗争,还是算是完成了基本显示功能。
4、资源链接
整个简易的工程我打包放到了CSDN下载页面,中文注释,欢迎新入门的小伙伴粗略了解整个28335硬件IIC的控制流程。
下载资源限制了积分的设定,固定为5分,绝对物有所值,连接审核完成后放出。
标签:硬件,TI,TMS320F28335,发送,OLED,IIC,寄存器 来源: https://blog.csdn.net/qianzilu/article/details/119176208