第二十章 machine.I2C类实验

《DNK210 使用指南 -CanMV 版 V1.0》第二十章 machine.I2C类实验

本章将介绍machine模块中的I2C类。通过本章的学习,读者将学习到machine模块中I2C类的使用。

本章分为如下几个小节:

20.1 machine.I2C类介绍

20.2 硬件设计

20.3 程序设计

20.4 运行验证

20.1 machine.I2C类介绍

machine.I2C类是machine模块内提供的类,该类不仅能用于访问和控制Kendryte K210硬件上的I2C控制器,还能使用软件模拟I2C与外部设备通讯。I2C总线用于和多个外部设备进行通信,多个外部设备可以共用一个I2C总线。Kendryte K210的硬件I2C控制器具有以下特点:

1. 支持主机模式和从机模式

2. 支持主机多从机通信

3. 支持标准模式(100Kb/s)

4. 支持快速模式(400Kb/s)

5. 支持7-bit和10-bit寻址

6. 支持关闭SCL时钟实验连续数据传输

7. 支持可编程数字噪声滤波功能

machine.I2C提供了I2C构造函数,用于创建一个I2C对象,I2C构造函数如下所示:

class I2C(id=I2C.I2C0, mode=I2C.MODE_MASTER, scl=None, sda=None, gscl=None, gsda=None, freq=400000, timeout=1000, addr=0, addr_size=7, on_receive=None, on_transmit=None, on_event=None)

通过I2C构造函数可以通过指定参数创建并初始化一个I2C对象。

id指的是I2C的编号,可以是I2C.I2C0~I2C.I2C5和I2C.I2C_SOFT,其中I2C.I2C0~I2C.I2C2对应了Kendryte K210硬件上的I2C0、I2C1和I2C2,而I2C.I2C3~I2C.I2C5和I2C.I2C_SOFT则是CanMV软件通过控制GPIOHS模拟的I2C。

mode指的是I2C模式,可以是I2C.MODE_MASTER(主机模式)或I2C.MODE_SLAVE(从机模式)。

scl指的是I2C SCL信号使用的IO引脚编号。

sda指的是I2C SDA信号使用的IO引脚编号。

gscl指的是当使用软件模拟I2C时,I2C SCL信号使用的GPIOHS编号。

gsda指的是当使用软件模拟I2C时,I2C SDA信号使用的GPIOHS编号。

freq指的是I2C的通讯频率,支持标准模式100Kb/s、快速模式400Kb/s,若是硬件I2C,还支持超快速模式1000Kb/s和高速模式3.4Mb/s。

timeout指的是软件模拟I2C等待SCL信号释放的超时时间。

addr指的是从机模式下的从机地址,即本机地址。

addr_size指的是地址的长度,可以是7或10,分别对应7-bit和10-bit寻址。

on_receive指的是从机模式下的接收回调函数。

on_transmit指的是从机模式下的发送回调函数

on_event指的是从机模式下的事件回调函数(开始事件和结束事件)。

I2C构造函数的使用示例如下所示:

from board import board_info
from machine import I2C
i2c = I2C(id=I2C.I2C0, scl=board_info.IMU_SCL, sda=board_info.IMU_SDA)

machine.I2C类为I2C对象提供了scan()方法,用于扫描I2C总线上的从机,scan()方法如下所示:

I2C.scan()

scan()方法用于扫描I2C总线上挂载的所有I2C设备并以列表的形式返回它们的I2C从机地址。

scan()方法的使用示例如下所示:

from board import board_info
from machine import I2C
i2c = I2C(id=I2C.I2C0, scl=board_info.IMU_SCL, sda=board_info.IMU_SDA)
devices = i2c.scan()

machine.I2C类为I2C对象提供了readfrom_mem_into()方法,用于读取从机寄存器的值到指定的变量中,readfrom_mem_into()方法如下所示:

I2C.readfrom_mem_into(addr, memaddr, buf, mem_size=8)

readfrom_mem_into()方法用于读取从机寄存器的值到指定的变量中。

addr指的是I2C从机的从机地址。

memaddr指的是I2C从机的寄存器地址。

buf指的是指定保存数据的变量。

mem_size指的是寄存器宽度,默认为8bit。

readfrom_mem_into()方法的使用示例如下所示:

from board import board_info
from machine import I2C
i2c = I2C(id=I2C.I2C0, scl=board_info.IMU_SCL, sda=board_info.IMU_SDA)
devices = i2c.scan()
buf = bytearray(1)
i2c.readfrom_mem_into(devices[0], 0x0F, buf)

machine.I2C类为I2C对象提供了writeto_mem()方法,用于将指定变量的值写入到从机的寄存器中,writeto_mem()方法如下所示:

I2C.writeto_mem(addr, memaddr, buf, mem_size=8)

writeto_mem()方法用于将指定变量的值写入到从机的寄存器中。

addr指的是I2C从机的从机地址。

memaddr指的是I2C从机的寄存器地址。

buf指的是指定保存数据的变量。

mem_size指的是寄存器宽度,默认为8bit。

writeto_mem()方法的使用示例如下所示:

from board import board_info
from machine import I2C
i2c = I2C(id=I2C.I2C0, scl=board_info.IMU_SCL, sda=board_info.IMU_SDA)
devices = i2c.scan()
buf = bytearray(1)
buf[0] = 0x00
i2c.writeto_mem(devices[0], 0x0F, buf)

20.2 硬件设计

20.2.1 例程功能

1. 创建一个I2C对象,并将其配置为主机模式

2. 使用I2C对象的scan()方法,扫描板载的I2C从设备,并打印输出

3. 使用I2C对象的readfrom_mem_into()方法,读取板载六轴传感器SH3001的芯片ID,并打印输出

20.2.2 硬件资源

1. 六轴传感器SH3001

SCL - IO22

SDA - IO23

20.2.3 原理图

本章实验内容,需要通过I2C总线与板载的六轴传感器SH3001进行通讯,正点原子DNK210开发板上六轴传感器SH3001的连接原理图,如下图所示:

图20.2.3.1 六轴传感器SH3001连接原理图

通过以上原理图可以看出,板载的六轴传感器SH3001通过I2C总线与Kendryte K210进行连接,其中I2C总线的SCL信号和SDA信号对应的IO编号分别为IO22和IO23。同时,因为六轴传感器SH3001的SDO引脚是被拉低的,因此结合六轴传感器SH3001的数据手册可以直到该连接方式的六轴传感器SH3001的I2C通讯从地址为0x36。

20.3 程序设计

20.3.1 machine.I2C类

有关machine.I2C类的介绍,请见第20.1小节《machine.I2C类介绍》。

20.3.2 程序流程图

图20.3.2.1 machine.I2C类实验流程图

20.3.3 main.py代码

main.py中的脚本代码如下所示:

from board import board_info
from fpioa_manager import fm
from machine import I2C

# 构造I2C对象
i2c = I2C(I2C.I2C0, scl=board_info.IMU_SCL, sda=board_info.IMU_SDA)

# 扫描I2C总线从设备
devices = i2c.scan()
print("Find devices:", devices)

# 读取SH3001芯片ID
buf = bytearray(1)
i2c.readfrom_mem_into(0x36, 0x0F, buf)
print("SH3001 Chip ID: 0x%X" % buf[0])

可以看到,首先是构造了一个I2C对象,I2C对象被配置为默认的主机模式,并且I2C总线的SCL和SDA信号使用的分别是六轴传感器SH3001所连接的SCL和SDA对应的IO。

接着使用scan()方法,扫描I2C总线上的从设备地址,并且通过print()打印输出,由于板载六轴传感器SH3001的I2C设备地址为0x36,因此应该会扫描到设备地址为0x36的I2C设备。

最后使用readfrom_mem_into()方法读取六轴传感器SH3001的芯片ID,并通过print()打印输出,因为六轴传感器SH3001的芯片ID为0x61,因此这一步骤输出的芯片ID因该为0x61。

20.4 运行验证

将DNK210开发板连接CanMV IDE,并点击CanMV IDE上的“开始(运行脚本)”按钮后,可以看到“串行终端”窗口中输出了一系列信息,如下图所示:

图20.4.1 “串行终端”窗口打印输出

可以看到,“串行终端”串口中先是显示了扫描到的I2C总线设备地址,设备地址为54,要注意的是,这的设备地址是以十进制表示的,对应的十六进制就是0x36,也就是板载六轴传感器SH3001的I2C设备地址。

接着是输出了板载六轴传感器SH3001的芯片ID为0x61,这与SH3001数据手册中的描述一致。

#硬件##开发##嵌入式##人工智能##嘉楠科技#
正点原子DNK210开发板教程 文章被收录于专栏

正点原子DNK210开发板教程:DNK210使用指南 -CanMV版 V1.0

全部评论

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结: 27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
04-15 14:28
已编辑
Java
程序员小白条:学院+两段经典项目+技术栈,最大众的简历,纯看运气
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务