从 TM1637 看一看非常规 I2C

背景介绍:

《看 Sugar 如何说 I2C 通信》 中 Sugar 把 I2C 的硬件知识单拿出来说了说,硬件原理是 I2C 的精髓所在。

有些芯片以“非常规方式”使用 I2C,比如本篇要说的 TM1637,懂硬件原理就能理解这种非常规软件的设计依据。

本篇的另一大亮点是引入了 Proteus 的使用,使用虚拟硬件一分钱不花地搞懂全部知识。

TM1637 与 TM1650

TM1637TM1650 是同一厂家生产的同类芯片,主要用于驱动 8 段数码管和扫描矩阵键盘(请看 Sugar 写的《看 Sugar 讲矩阵键盘的使用》)。

Sugar 把两者的 datasheet 拿过来对比一下,一目了然两者有何区别。

1、TM1637TM1650 能多驱动两个 8 段数码管。

从 TM1637 看一看非常规 I2C

2、两者长相不同,TM1637 脚多几根。

从 TM1637 看一看非常规 I2C

3、TM1650 能扫描更多的按键。

从 TM1637 看一看非常规 I2C

非常规 I2C 通信

一、倒序的位号

当 Sugar 看到 TM1637 的中文 datasheet 时觉得挺舒服的,看到下面的寄存器也觉得简单易懂。

从 TM1637 看一看非常规 I2C

然而当 Sugar 看到这个示波器波形和 I2C 总线数据时当真是晕了一下:

从 TM1637 看一看非常规 I2C

按 datasheet 所述,这个调亮度的应该是 0x89 怎么会是 0x91 呢?脑子里的二进制敏感神经觉得是二进制位的编号反了,一查 datasheet 果然是这样:

从 TM1637 看一看非常规 I2C

按照 《看 Sugar 如何说 I2C 通信》写到的常规 I2C 二进制位编排方式应为:

从 TM1637 看一看非常规 I2C

bit7 -> bit0 高位在左,而 TM1637 和 TM1650 都是 bit1 -> bit 8 低位在左。这就导致了按常规方法解析 TM16xx 的 I2C 数据出错。

二、TM16xx 没有“设备地址”

在搞清楚二进制位编号顺序问题后,细看数据监视过程如下:

从 TM1637 看一看非常规 I2C

展开一组数据,可以发现 TM16xx 驱动 8 段数码管时发送的数据是:“命令” + “数据”的形式,与 datasheet 所述一致。这就表示 TM16xx 不是 I2C 从设备,没有常规的“I2C 从设备地址”。

从 TM1637 看一看非常规 I2C

这种不以“从设备”身份出现在总线上的器件就比较霸道,如果要在同一总线上挂其他 I2C 设备,则 I2C 从设备地址要避开所有的命令,几乎 TM16xx 就是在说:这条 I2C 总线归我了。

搞清楚以上两点,就已经会用 TM16xx 芯片了。搞清楚之后,因为不按常规出牌的 datasheet 给数据分析带来麻烦,所以 Sugar 从常规角度按 datasheet 做了个总结,看下面这个图来做数据分析就舒服多了:

从 TM1637 看一看非常规 I2C

神奇的 Proteus

估计将本文看到这里的读者会对 Sugar 用虚拟硬件研究知识的方法感兴趣,下面 Sugar 就来介绍一下这套方法。

首先来看一下 Sugar 这次仿真工程的全貌,如下:

从 TM1637 看一看非常规 I2C

使用的是 Arduino 主控,深入研究 Arduino 的 C++ 封装对锻炼软件架构能力很有帮助。Sugar 的第一期《软件架构训练计划》以 RT-Thread 为主体,在掌握了 RT-Thread 之后,做应用层代码的目标是像 Arduino 一样易用。Arduino 在 Proteus 中的仿真比较成熟而且各种库非常多,所以在 Proteus 中做单片机编程仿真 Arduino 虚拟硬件是首选。

在本次的 Proteus 工程中 Sugar 使用了“总线”连接,目的是使图面看起来更干净,使用总线的操作过程如下:

从 TM1637 看一看非常规 I2C

连线拐 45 度弯的时候按住键盘上的 Ctrl 键就行。自动标号是点左面的 LBL 按钮后,按 A 键出现对话框,输入NET=P#OK 后在线上点鼠标左键进行自动标号。

在 Proteus 中芯片直接搜型号就能找到,本次用到的虚拟仪器有“ I2C 总线监视器”和“示波器”,到下图所示的地方找:

从 TM1637 看一看非常规 I2C

关于 Proteus 的操作 Sugar 在网上找到了一份非常不错的中文教程,将在 10 月 1 日连带相关软件以及本篇的工程一起在《软件架构训练计划》群里共享。

本篇软件架构训练内容

本篇使用的 Arduino 库的 github 地址是:

https://github.com/bremme/arduino-tm1637

Sugar 用了 6 位 8 段数码管显示“1234567890”,这个库原生支持 4 位 8 段数码管,变成 6 位并且不丢显示内容的话需要做 2 处修改。Sugar 给出其中一处的提示,读者可以尝试通过架构调试锁定另一处的位置,并改之。第一处的提示如下:

从 TM1637 看一看非常规 I2C

如上图修改之后能显示 6 位了,超过 6 个数字要显示时会漏掉后 2 位,这就留给读者自己改吧(按架构找,不然代码太多会很痛苦,找到并改对了就锻炼了架构能力)。

至于本篇的代码,那是相当的简单,Sugar 一行都没写,只拼了 3 块积木(弄 3 块积木写这么多东西,不要打我哟),如下:

从 TM1637 看一看非常规 I2C

关注作者

欢迎扫码关注我的公众号MultiMCU EDU
从 TM1637 看一看非常规 I2C

提示:在公众号“关于我”页面可加作者微信好友。

喜欢本文求点赞,有打赏我会更有动力。