【正点原子K210连载】第二十章 machine.I2C类实验 摘自【正点原子】DNK210使用指南-CanMV版指南

1)实验平台:正点原子ATK-DNK210开发板
2)平台购买地址https://detail.tmall.com/item.htm?id=731866264428
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban

第二十章 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.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 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 硬件资源
  4. 六轴传感器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数据手册中的描述一致。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java并发编程之美-第1章 并发编程线程基础-线程的创建与运行

文章目录 1.什么是线程2. 线程创建和运行 1.什么是线程 进程是操作系统进行资源分配和调度的基本单位,线程是 CPU 分配的基本单位。 程序计数器用来记录线程当前要执行的指令地址。CPU一般是使用时间片轮转方式让线程轮询占用的,程序计数器是记录线程…

MVC 返回集合方法,以及分页

返回一个数据集方法 返回多个数据集方法 》》定义一个Model public class IndexMoel {public List<UserGroup> UserGroup{get;set;}public List<User> User{get;set;}}》》》控制器 //db 是 EF 中的上下文 var listnew IndexModel(); list.UserGroupdb.UserGro…

Java--static详解

1.static静态的意义&#xff0c;加在属性面前就为静态属性&#xff1b;加在方法面前就为静态方法 2.如图&#xff0c;定义了一个静态属性age&#xff0c;一个非静态属性score&#xff1b; 输出语句一共四句&#xff0c;其中第三句报错&#xff0c;由于静态和非静态的区别&…

EXSI 实用指南 2024 -编译环境 Ubuntu 安装篇(二)

1. 引言 在当今的虚拟化领域&#xff0c;VMware ESXi 是备受推崇的虚拟化平台&#xff0c;广泛应用于企业和个人用户中。它以卓越的性能、稳定的运行环境和丰富的功能&#xff0c;为用户提供了高效的硬件资源管理和简化的 IT 基础设施维护。然而&#xff0c;如何在不同操作系统…

安卓逆向经典案例——XX优品(uniapp)

uni-app逆向 uniapp的目录结构 有一个io文件夹&#xff0c;下面有dcloud uniapp UniApp 可以用于开发 H5 应用&#xff0c;但它不仅仅局限于 H5 应用。UniApp 的特点包括&#xff1a; 1. 跨平台&#xff1a;可以一套代码同时生成适用于多个平台&#xff08;如 iOS、Android、…

【学习笔记】4、组合逻辑电路(上)

数字电路的分类&#xff1a;组合逻辑电路&#xff0c;时序逻辑电路。本章学习组合逻辑电路。 4.1 组合逻辑电路的分析 给定的逻辑电路&#xff0c;确定其逻辑表达式&#xff0c;列出真值表&#xff0c;得到简化后的逻辑表达式&#xff0c;分析得到其功能。 3位奇校验电路 &…

仕考网:公务员考试的录取流程

公务员考试的录取流程分很多个阶段&#xff0c;以下是流程介绍&#xff1a; 1. 报名阶段&#xff1a;考生需根据公布的招聘信息和岗位要求进行报名。 2. 笔试阶段&#xff1a;公务员笔试&#xff0c;包括申论和行测两部分。 3. 成绩公布与面试资格&#xff1a;笔试合格者将获…

什么是期权隐含波动率?期权隐含波动率和历史波动率的区别?

今天带你了解什么是期权隐含波动率&#xff1f;期权隐含波动率和历史波动率的区别&#xff1f;期权波动率反映的是价格波动程度&#xff0c;是对资产收益率不确定性的衡量&#xff0c;通常用标准差表示。 隐含波动率是根据期权市场价格反推出的波动率。它是市场参与者根据期权…

Agents 要点

一、Agents概念 人类是这个星球上最强大的 Agent。Agent是一个能感知并自主地采取行动的实体&#xff0c;这里的自主性极其关键&#xff0c;Agent要能够实现设定的目标&#xff0c;其中包括具备学习和获取知识的能力以提高自身性能。 关键点&#xff1a;感知环境、自主决策、具…

windows中超详细深度学习环境配置之安装显卡驱动、cuda、cudnn、pytorch、torchvision、pycharm

超详细介绍安装Gpu版本的pytorch深度学习环境 一、显卡驱动安装1.1 下载驱动1.2 安装驱动 二、cuda安装2.1 下载cuda2.2 安装cuda2.3 检查cuda是否安装成功 三、安装cudnn3.1 cudnn下载3.2 cudnn安装 四、安装miniconda4.1 miniconda下载4.2 miniconda安装4.3 添加环境变量 五、…

开源模型应用落地-Yi模型小试-Yi-1.5-9B-Chat-16K-入门篇(一)

一、前言 Yi 开源模型是由零一万物公司发布的一系列自然语言和多模态模型。2024年5月13日,零一万物发布了最新的 Yi-1.5系列开源模型,开源了6B/9B/34B的 base 版和 chat 版模型,并第一时间发布在ModelScope、huggingface、 wisemodel 等 AI 开源社区平台。 二、术语 2.1. 零…

无人机之机身保养

一、外观检查 1、检查机器表面整洁无划痕、无针孔凹陷擦伤、畸变等损坏情况&#xff1b; 2、晃动机身&#xff0c;仔细听机身内部有无松动零件或者螺丝在机身内部。 二、桨叶检查 1、有无裂痕、磨损、变形等缺陷&#xff0c;如有明显缺陷建议更换&#xff1b; 2、卡扣、紧…

Figma中文网?比Figma更懂你的神秘网站!

Figma奠定了在线UI设计工具的基本形式&#xff0c;许多国内设计师都在使用Figma。在本文中&#xff0c;我们将解密国内大型设计师使用的Figma灵魂合作伙伴&#xff0c;被称为Figma中文网络的即时设计资源社区。Figma中文网络UI设计工具的魅力是什么&#xff1f;让我们一起看看吧…

基于Java的校园交友网站系统

你好&#xff0c;我是专注于计算机技术研究的学姐码农小野。如果你对校园交友网站系统的构建或者相关技术感兴趣&#xff0c;欢迎私信交流。 开发语言 Java 数据库 MySQL 技术 Java语言、SpringBoot框架、B/S结构 工具 MyEclipse、Navicat、Maven 系统展示 首页 个人…

DID差分模型案例集(传统DID、队列DID、渐近DID、空间DID、PSM-DID)

双重差分&#xff08;DID&#xff09;模型是一种广泛应用于经济学、社会学等领域的统计方法&#xff0c;主要用于评估政策或事件的因果效应。以下是DID模型几个重要变体的简要介绍&#xff1a; 1、传统DID&#xff08;Traditional DID&#xff09;&#xff1a;这是DID模型的基…

使用wxPython和Python-docx创建合同生成器:一个实用的GUI应用程序教程

在当今的商业世界中,合同是不可或缺的。但是,反复修改和生成合同可能会是一个耗时且容易出错的过程。今天,我们将探讨如何使用Python创建一个简单但强大的合同生成器,它不仅可以节省时间,还能减少人为错误。 项目概述 我们将创建一个图形用户界面(GUI)应用程序,允许用户: 选…

Python基础教学之三:函数与模块篇——实现代码重用和模块化

Python基础教学之三&#xff1a;函数与模块篇——实现代码重用和模块化 一、函数的定义与使用 1. 理解函数 函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码块。它可以提高代码的重用性和程序的清晰度。 你可以定义一个由自己想要功能的函数&#xff0c;以下是…

从零写UVC摄像头驱动(一)驱动框架

一、前言 写一个USB摄像头驱动程序1.构造一个usb_driver2.设置video_device probe: 2.1. 分配video_device:video_device_alloc 2.2. 设置 .fops .ioctl_ops (里面需要设置11项) 如果要用内核提供的缓冲区操作函数&#…

Redis基础教程(十六):Redis Stream

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

附下载 | 100项能源领域网络与数据安全政策全集(2024版)

能源是工业的粮食&#xff0c;能源安全事关国家根本安全。当今国际局势风云变幻&#xff0c;全球地缘政治、经济、科技体系正经历深刻变化&#xff0c;能源局势将更加错综复杂&#xff0c;威胁能源安全的各种“灰犀牛”“黑天鹅”事件时有发生&#xff0c;促使国际能源版图深刻…