0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文详细了解I2C总线与PiOLED显示板

NVIDIA英伟达企业解决方案 来源:NVIDIA英伟达企业解决方案 作者:NVIDIA英伟达企业解 2022-01-04 14:56 次阅读

在上文中,我们已经将SFIO与GPIO之间的关系分析清楚了,接下来我们就带大家更深入地了解一下I2C引脚与开发库的使用,以及调整PiOLED显示内容的方法。这两个部分都是 Jetbot 智能小车项目中非常关键的一环,但我们更希望读者能将执行技术使用在更广泛的场景中。

I2C总线的特性

前面提到过,在 Jetson 的 40 根引脚中有 18 根 SFIO 类的引脚与电路板直连,这是不能改变功能的引脚,其中就有两组 I2C 的[3, 5]与[27,28]引脚,是不需要透过 Jetson-IO 指定就能使用的。

全名为“集成电路总线(Inter-Integrated Circuit)”的 I2C 是由飞利浦公司在 1980 年代初所设计的,是一种“多主从(master/slave)架构的串行通信总线”,由于结构设计得非常简单并且有很大的弹性空间,使得这个总线的普及度相当高,广泛用于微控制器传感器阵列,显示器,IoT 设备,EEPROM 等之间的通信。

这里并不讲解 I2C 的工作原理电子电路图,这些太过底层的知识对于应用工程师来说意义并不大,就算不懂也不会影响代码的操作。不过 I2C 总线的特性,倒是需要了解一下,这对于应用开发是有帮助的。以下简单列出 I2C 总线的一些特性:

只需要 SDA 数据线和 SCL 时钟线就能完成所有工作,总线界面已经集成在芯片内部,不需要特殊的界面电路。

是一个真正的多主机总线:

(1)如果两个或多个主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据破坏,每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。

(2)数据传输和地址设定由软件设定,非常灵活。总线上的器件增加和删除不影响其他器件正常工作。

(3)最大主(master)设备数量:无限制;最大从(slave)机数量:127。

可以通过外部连线进行在线检测,便于系统故障诊断和调试,故障可以立即被寻址,软件也利于标准化和模块化,缩短开发时间。

连接到相同总线上的 IC 数量只受总线最大电容的限制,串行的 8 位双向数据传输位速率在标准模式下可达每秒 100 Kbit、快速模式下可达每秒 400 Kbit、高速模式下可达每秒 3.4 Mbit、超高速模式下可达每秒 5 Mbit 性能。

总线具有极低的电流消耗、抗高噪声干扰,增加总线驱动器可以使总线电容扩大 10 倍,传输距离达到 15 米,兼容不同电压等级的器件与工作温度范围宽。

看完以上这些特性之后,就能很清楚地了解为何 I2C 总线协议会受到广泛的青睐,不仅扩充性强而且稳定性高,并且成本还比较低,接下去就来看看如何使用代码来透过这个总线去控制周边设备。

I2C总线的检测工具- i2c-tools

首先要捋清楚 I2C 的归类是 SFIO 而不是 GPIO 类型,不能使用前一篇文章最后所提到的 Jetson.GPIO 库进行开发。

I2C 有自己专属的 i2c-tools 检测工具,可以用指令检测设备上 I2C 的状态,并使用 SMBUS 总线开发库来进行开发,Jetbot 系统的机电操控指令也是基于这个库进行高阶封装的。虽然在 Jetbot 系统里已经将这些工具与库都安装调试好,不过这里还是提供这个工具与开发库的安装与调试步骤,这样就能在其他 Jetson 系列设备上调用。

安装 i2c-tools 与 smbus 库的步骤很简单,请执行以下指令:

sudo apt update && sudo apt install -y i2c-tools

不过这些牵涉到底层的调用,因此需要配置使用的权限,如下步骤:

sudo usermod -aG i2c $USER

现在就可以执行以下指令,检查看看设备里有几个 i2c 总线:

i2cdetect -l

从下图可以看到在 Jetson Nano 2GB 里有 7 组 I2C 总线:

如果您手边还有 Jetson Nano、AGX Xavier 或 Xavier NX 开发套件,可以执行这个指令看看不同设备的 I2C 总线数量,可以发现 Jetson Nano 与 AGX Xavier 各有 9 组,而 Xavier NX 有 11 组。

不过不管芯片提供有多少组总线,目前在 40 针引脚上只用到两组,那到底用到那两组?请使用前一篇文章里面提到的“sudo /opt/nvidia/jetson-io/jetson-io.py”这个工具,进去就能看到现在使用 I2C 总线编号,其他可能用在与一些内部设备相连接的总线,在这里就不做探索。

接下来就可以检查个别总线上所连接的设备,例如将 Jetbot 用到的 PiOLED 显示屏,按照要求连接在 Jetson Nano 2GB 的第 3 引脚与第 5 引脚上,对照 40 针引脚说明,可以知道这两根引脚属于I2C_2这一组总线,于是要检查这组所接设备时,需要执行以下指令:

i2cdetect -y -r 1

注意,这个指令最後面所选的编号是从“0”开始,因此对应到 I2C 总线编号时,需要经过“减1”的处理。执行之后会看到如下图的结果,有个 16 进制编号为“0x3c”的设备正连接在 I2C_2 总线上面。

网上大部分的说明就是告诉我们“找到设备”了,但我们如何识别这个设备是什么?却没有人说个明白。经过几番搜索之后,才在https://i2cdevices.org/addresses里面找到这些编号的对应设备,例如“0x3c”的设备总共有 6 种(如下图),每一种都有可能。

经过一一查看之后,发现这 6 个全部都属于“显示类”的设备,而SSD1306的规格符合我们连接的 PiOLED 显示器规格,如下图:

这一番摸索之后,大概就能明确如何透过指令来确认所连接的设备,大家只要依循这样的逻辑与资源,就能非常容易地捋顺这个 I2C 总线的使用。现在已经能使用 i2c-tools 工具来检测 I2C 总线所连接的设备,接着就来看看在代码层面该如何对 I2C 设备执行控制!

PiOLED显示板

这是创客树莓派极为常用的显示设备,在网上可以找到以下三种:

Adafruit原版(下图最左边):约150人民币

国产树莓派PiOLED屏(下图中间):约30人民币

0.91寸OLED显示屏(下图右边):约10人民币

其实三种的关键元件都一样,就是右边那个最便宜的“0.91 寸 OLED 显示屏”,左边两个只是再添加一个很简单很便宜的电路转接板,然后再加以焊接加工而已。如果您打算按照 Jetbot 提供的自行组装方式,包括 3D 打印车体、单独采购 PCA9685+TB6612 控制板,那么“自行焊接加工”的步骤是跳不过去的。

对初学者来说,推荐使用中间的“树莓派 PiOLED 屏”会比较方便,现在以这个为例子,按照前面的下图接到 Jetson Nano 2GB 上,就能在前面的 “i2cdetect -y -r 1”指令下看到 “0x3c” 设备。

如果你在 Jetbot 系统上,并且正常开机的状况下,应该就能看到显示器上出现如下图的信息,这个信息是由 ~/jetbot/jetbot/apps/stats.py 所控制,现在就来看一下这只代码的内容,下面将一些比较关键的代码列出来说明:

以下是正 OLED 屏的调用细节:

这个屏的尺寸是 128x32 像素,与 SSD1306 规格相同,因此直接使用 Adafruit 所提供的Adafruit_SSD1306库。

接下来用 Adafruit_SSD1306.SSD1306_128_32 创建 disp 对象,里面的参数

(1)rst 是 Raspberry Pi pin configuration 的引脚定义,在这里并不使用(none);

(2)i2c_bus 指定所使用的总线编号,前面说过这里使用的是第二组(i2c_2),但在代码里的编号是“1”,如果用的是第一组则编号为“0”;

(3)gpio 表示这个脚位是否被占用?设置为“1”就表示已占用。

显示屏是以“图像”方式来处理,第 60 行“draw.rectangle”是先将显示屏涂黑。

从 80~85 行利用 Linux 针对 CPU、内存、存储空间的检测指令,获取显示的数据,并抽取所需要的内容,分别存入 CPU、MemUsage 与 Disk 三个变量里。

第 89~92 行就是显示 4 组数据,因为显示屏的高度为 32 像素,而每个字符的高度为 8 像素,因此只能显示 4 组数据,这里的字符并不支持中文。在代码里面显示的内容是有线网 IP、无线网 IP、内存使用状况与存储空间的信息。

第 95~97 行则是将前面四行写入的信息,以图像为单位来现实,每一秒更新一次。

下图是这个 OLED 所显示的内容,与 89~92 行的输出是一致的。

我们可以尝试修改一下显示的内容,例如有线网 IP 对 Jetbot 来说并不重要,但是 CPU 使用状态是挺有价值的,因此我们可以稍作修改,包含要显示的顺序,例如无线网 IP 其实只要知道一次就行,可以放到最下面,而内存与 CPU 的使用状态是相对敏感的,可以将顺位往上调。下面就是修改后的内容:

如果您使用镜像版或者脚本(create-sdcard-image-from-scratch.sh)安装 Jetbot,应该修改完存档之后,就会看到 OLED 屏的显示发生变化。

如果使用容器安装 Jetbot 的话,这部分需要重建 base 与 display 两个容器,需要执行以下步骤让这个改变生效。

重新启动 Jetbot 容器之后,就会看到显示屏上的内容已经改变(如下图),这样就能轻松改变 OLED 的显示内容。

事实上还有很多方式可以操作 I2C 对 OLED 的显示处理,在 Adafruit 所提供的开源项目https://github.com/adafruit/Adafruit_Python_SSD1306下面有些范例代码可以尝试,不过操作前先把 Jetbot 容器关闭,否则 I2C 会被占用。

现在对 Jetson Nano(含2GB)的 I2C 检测与操作应该有更进一步的了解,这些内容也适用于 Jetson 系列其他开发套件,主要差别就是得确认所要使用的 I2C 编号,例如在 Xavier AGX 上相同位置的 I2C 是第 9 组,因此得在代码中修改 “i2c_bus=8”,其他部分则完全一样。

原文标题:NVIDIA Jetson Nano 2GB 系列文章(45):I2C总线与PiOLED

文章出处:【微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。
审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电路板
    +关注

    关注

    140

    文章

    4967

    浏览量

    98175
  • 设备
    +关注

    关注

    2

    文章

    4522

    浏览量

    70712
  • 总线
    +关注

    关注

    10

    文章

    2891

    浏览量

    88162

原文标题:NVIDIA Jetson Nano 2GB 系列文章(45):I2C总线与PiOLED

文章出处:【微信号:NVIDIA-Enterprise,微信公众号:NVIDIA英伟达企业解决方案】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    I2C总线上拉电阻阻值如何确定?

    导读I2C总线在产品设计中被广泛应用,尽管其结构简单,但经常发生上拉电阻设计不合理的问题。本文将对I2C上拉电阻的选择进行简要分析。根信号线上,通过电阻连接
    的头像 发表于 12-27 11:34 856次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>总线</b>上拉电阻阻值如何确定?

    I2C总线为什么要接上拉电阻

    I2C为什么要接上拉电阻?因为它是开漏输出。 为什么是开漏输出? I2C协议支持多个主设备与多个从设备在总线上,如果不用开漏输出,而用推挽输出,会出现主设备之间短路的情况。所以
    的头像 发表于 11-20 10:07 499次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>总线</b>为什么要接上拉电阻

    详解I2C总线与SPI总线的区别

    I2C(Inter-Integrated Circuit)表示集成电路互连,是种用于线路内部芯片之间通信的总线
    的头像 发表于 10-16 15:16 5190次阅读
    详解<b class='flag-5'>I2C</b><b class='flag-5'>总线</b>与SPI<b class='flag-5'>总线</b>的区别

    了解I2C总线

    电子发烧友网站提供《了解I2C总线.pdf》资料免费下载
    发表于 10-08 11:13 2次下载
    <b class='flag-5'>了解</b><b class='flag-5'>I2C</b><b class='flag-5'>总线</b>

    I2C总线上拉电阻计算

    电子发烧友网站提供《I2C总线上拉电阻计算.pdf》资料免费下载
    发表于 10-08 09:54 1次下载
    <b class='flag-5'>I2C</b><b class='flag-5'>总线</b>上拉电阻计算

    I2C总线上拉电阻的必要性

    在电子通信领域,I2C总线作为种广泛应用的双向串行通信协议,其稳定性和效率对于整个系统的性能至关重要。为了确保数据传输的可靠性,I2C总线
    的头像 发表于 09-09 17:16 1118次阅读

    优秀实践:I3C共享总线上的I2C器件

    电子发烧友网站提供《优秀实践:I3C共享总线上的I2C器件.pdf》资料免费下载
    发表于 09-06 09:49 0次下载
    优秀实践:<b class='flag-5'>I3C</b>共享<b class='flag-5'>总线</b>上的<b class='flag-5'>I2C</b>器件

    简单认识I2C通信协议

    I2C(Inter-Integrated Circuit)通信协议是由飞利浦公司(现为恩智浦半导体)开发的种简单、双向二线制同步串行总线协议。自1982年发布以来,I2C协议因其高效
    的头像 发表于 07-25 18:06 1540次阅读

    ISL33001MSOPEVAL1Z I2C总线缓冲器评估

    电子发烧友网站提供《ISL33001MSOPEVAL1Z I2C总线缓冲器评估 .rar》资料免费下载
    发表于 06-07 16:49 0次下载

    I2C总线协议的工作原理和寻址格式

    I2C(Inter-Integrated Circuit)总线协议,即集成电路总线协议,是种用于连接微控制器及其外围设备的串行总线协议。
    的头像 发表于 05-27 15:47 1838次阅读

    什么是I2C协议 I2C总线的控制逻辑

    在实际使用过程中,I2C比较容易出现的个问题就是死锁 ,死锁在I2C中主要表现为:I2C死锁时表现为SCL为高,SDA直为低。
    发表于 03-12 09:17 1096次阅读
    什么是<b class='flag-5'>I2C</b>协议 <b class='flag-5'>I2C</b><b class='flag-5'>总线</b>的控制逻辑

    I2C总线的特点及应用

    I2C总线最主要的优点是其简单性和有效性。占用的空间小,降低了互连成本。总线的长度可高达7.6m,并且能够以10kbps的最大传输速率支持40个组件。
    发表于 02-02 15:56 801次阅读

    蓝牙串口通讯总线——I2C/SPI/UART

    嵌入式工程师在做串口通信调试工作的时候,会经常用到I2C、SPI、UART这3条总线I2C、SPI、UART这三种通信总线在嵌入式领域很常见,目前主流的SOC芯片都内置了这三种
    的头像 发表于 01-22 09:41 1697次阅读
    蓝牙串口通讯<b class='flag-5'>总线</b>——<b class='flag-5'>I2C</b>/SPI/UART