赞
踩
1)实验平台:正点原子ATK-DNK210开发板
2)平台购买地址https://detail.tmall.com/item.htm?id=731866264428
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban
本章将介绍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控制器具有以下特点:
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 例程功能
图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数据手册中的描述一致。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。