从 TM1637 看一看非常规 I2C
背景介绍:
《看 Sugar 如何说 I2C 通信》 中 Sugar 把 I2C 的硬件知识单拿出来说了说,硬件原理是 I2C 的精髓所在。
有些芯片以“非常规方式”使用 I2C,比如本篇要说的
TM1637
,懂硬件原理就能理解这种非常规软件的设计依据。本篇的另一大亮点是引入了
Proteus
的使用,使用虚拟硬件一分钱不花地搞懂全部知识。
TM1637 与 TM1650
TM1637
与 TM1650
是同一厂家生产的同类芯片,主要用于驱动 8 段数码管和扫描矩阵键盘(请看 Sugar 写的《看 Sugar 讲矩阵键盘的使用》)。
Sugar 把两者的 datasheet 拿过来对比一下,一目了然两者有何区别。
1、TM1637
比 TM1650
能多驱动两个 8 段数码管。
2、两者长相不同,TM1637
脚多几根。
3、TM1650
能扫描更多的按键。
非常规 I2C 通信
一、倒序的位号
当 Sugar 看到 TM1637
的中文 datasheet 时觉得挺舒服的,看到下面的寄存器也觉得简单易懂。
然而当 Sugar 看到这个示波器波形和 I2C 总线数据时当真是晕了一下:
按 datasheet 所述,这个调亮度的应该是 0x89
怎么会是 0x91
呢?脑子里的二进制敏感神经觉得是二进制位的编号反了,一查 datasheet 果然是这样:
按照 《看 Sugar 如何说 I2C 通信》写到的常规 I2C 二进制位编排方式应为:
bit7 -> bit0
高位在左,而 TM1637 和 TM1650 都是 bit1 -> bit 8
低位在左。这就导致了按常规方法解析 TM16xx 的 I2C 数据出错。
二、TM16xx 没有“设备地址”
在搞清楚二进制位编号顺序问题后,细看数据监视过程如下:
展开一组数据,可以发现 TM16xx 驱动 8 段数码管时发送的数据是:“命令” + “数据”
的形式,与 datasheet 所述一致。这就表示 TM16xx 不是 I2C 从设备,没有常规的“I2C 从设备地址”。
这种不以“从设备”身份出现在总线上的器件就比较霸道,如果要在同一总线上挂其他 I2C 设备,则 I2C 从设备地址要避开所有的命令,几乎 TM16xx 就是在说:这条 I2C 总线归我了。
搞清楚以上两点,就已经会用 TM16xx 芯片了。搞清楚之后,因为不按常规出牌的 datasheet 给数据分析带来麻烦,所以 Sugar 从常规角度按 datasheet 做了个总结,看下面这个图来做数据分析就舒服多了:
神奇的 Proteus
估计将本文看到这里的读者会对 Sugar 用虚拟硬件研究知识的方法感兴趣,下面 Sugar 就来介绍一下这套方法。
首先来看一下 Sugar 这次仿真工程的全貌,如下:
使用的是 Arduino 主控,深入研究 Arduino 的 C++ 封装对锻炼软件架构能力很有帮助。Sugar 的第一期《软件架构训练计划》以 RT-Thread 为主体,在掌握了 RT-Thread 之后,做应用层代码的目标是像 Arduino 一样易用。Arduino 在 Proteus 中的仿真比较成熟而且各种库非常多,所以在 Proteus 中做单片机编程仿真 Arduino 虚拟硬件是首选。
在本次的 Proteus 工程中 Sugar 使用了“总线”连接,目的是使图面看起来更干净,使用总线的操作过程如下:
连线拐 45 度弯的时候按住键盘上的 Ctrl
键就行。自动标号是点左面的 LBL
按钮后,按 A
键出现对话框,输入NET=P#
点 OK
后在线上点鼠标左键进行自动标号。
在 Proteus 中芯片直接搜型号就能找到,本次用到的虚拟仪器有“ I2C 总线监视器”和“示波器”,到下图所示的地方找:
关于 Proteus 的操作 Sugar 在网上找到了一份非常不错的中文教程,将在 10 月 1 日连带相关软件以及本篇的工程一起在《软件架构训练计划》群里共享。
本篇软件架构训练内容
本篇使用的 Arduino 库的 github 地址是:
https://github.com/bremme/arduino-tm1637
Sugar 用了 6 位 8 段数码管显示“1234567890”,这个库原生支持 4 位 8 段数码管,变成 6 位并且不丢显示内容的话需要做 2 处修改。Sugar 给出其中一处的提示,读者可以尝试通过架构调试锁定另一处的位置,并改之。第一处的提示如下:
如上图修改之后能显示 6 位了,超过 6 个数字要显示时会漏掉后 2 位,这就留给读者自己改吧(按架构找,不然代码太多会很痛苦,找到并改对了就锻炼了架构能力)。
至于本篇的代码,那是相当的简单,Sugar 一行都没写,只拼了 3 块积木(弄 3 块积木写这么多东西,不要打我哟),如下:
关注作者
欢迎扫码关注我的公众号MultiMCU EDU
。