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 28335 IIC结构图
图1 IIC发送接收结构

(2)可以看到要发送的数据先到DXR寄存器,然后被自动加载到移位寄存器XSR,因此相对应的发送操作就是顺序向DXR寄存器写入字节数据,这张图没有体现出来的是I2CCNT寄存器是控制本次发送数据的总字节数的寄存器,因此在写入实际数据到DXR之前,需要先将数据长度写入CNT寄存器。
SAR寄存器
图2 SAR寄存器定义
(3)然后在实际发送数据前需要声明此时发送的从器件地址,也就是I2C_SLAVE_ADDRESS,这里对应OLED的数据手册,7位地址为0x3C,与模拟IIC不同,模拟IIC需要自己处理7位地址时的第8个bit,也就是读/写,而这里是通过控制模式控制寄存器I2CMDR来确定读写,因此可以直接写入7位地址给28335的SAR寄存器,中间记得查询状态寄存器STA.BB检查一下i2c忙不忙。
TI源码 IIC发送数据封装

图3 TI源码 IIC发送数据封装
(4)这里TI的源程序做了一层封装,将一次发送所需的数据打包成了结构体I2CMSG,方便函数接口设置以及适应单次不同长度数据的发送要求,我则对其做了部分更改,就直接输入地址+要发送的短帧数据作为形参,这样省事一些,实际上TI的结构体允许变长度发送,此处见源码。
结构体内容
图4 TI发送数据结构体
可以看到后面有相当大一个可自定义缓存区,然后在TI自己的发送函数中可以变长发送,不过我这里用不上,就先去掉了,其实就是CNT写入要发送的总字节数,并且逐次向DXR寄存器写入即可。

(5)一点学艺不精的小困惑
最开始调试出现的问题在于,只有第一个字节有时钟并且发出去了,后面SCLK被强制拉低,导致SDA后面的数据都不带时钟,因此返回的状态值读出来一直是0x5555,根据TI源程序的定义,这个是I2C_STP_NOT_READY_ERROR
返回的状态
图5 返回的状态值

然后先后排查了硬件连线,短路,从机地址,最后单步debug中,给每句的返回值都加了断点,发现逐语句调试时,通信都正常,一旦断点放开,返回值马上就变成0x5555,于是我猜是从设备的处理速度不够快,于是看了一下电气特性表,在每次访问后面每句都加了3ms的延时,这样才正常工作。
延时示例
图6 延时示例

2、LOED驱动
这里OLED我是直接用的模块附送的例程,具体没有去深究,看了一下主要还是点阵控制,循环点亮和清除,驱动芯片是SSD1306,暂时先这样,能显示了就OK。
唯一跟单片机相关的一点是,因为显示需要事先存储成点阵数组形式,这种比较耗资源,所以需要更改cmd文件给.text扩容,我看了一下cmd文件基本上就把RAM2赋给了RAM1,空间差不多就够了。
F28335 cmd更改
图7 28335 cmd更改以存储字符点阵

3、总结
整个移植用了两天,其实改代码还好,主要是看文档理解整个过程,以及跟上面提到的IIC的发送延时作斗争,还是算是完成了基本显示功能。

4、资源链接
整个简易的工程我打包放到了CSDN下载页面,中文注释,欢迎新入门的小伙伴粗略了解整个28335硬件IIC的控制流程。
下载资源限制了积分的设定,固定为5分,绝对物有所值,连接审核完成后放出。
https://download.csdn.net/download/qianzilu/20592053

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值