微雪树莓派PICO笔记——6. I2C(集成电路总线)
文章目录
- 简介
- 协议详解
- RP2040 I2C主要参数
- 函数讲解
- 内存操作
- 软件I2C
- 例程地址
- 实操
- 程序讲解
简介
I2C 集成电路总线,一种串行通信总线,使用多主从架构
由飞利浦公司在20世纪80年代为了让主板和嵌入式系统以连接低速周边设备而开发
正确读法 “I平方C” 或者"I方C"
而"I二C"是错误读法
I2C硬件连接方式
- 在物理连接上十分简单,分别由SDA(串行数据线),SCL(串行时钟线)及上拉电阻组成
- 通信原理是通过控制SCL和SDA高低电平来产生I2C总线协议所需要的信号进行数据传输
- 在总线空闲状态时,SCL和SDA会上拉电阻拉高,保持着高电平
- 通过其物理连接方式,我们就可以知道I2C协议是串行,同步通讯协议
特征
I2C总线上的每一个设备都会对应这唯一的I2C地址
部分从设备可以·通过外围电路来改变I2C地址
主从设备之间就通过这个地址来确定与哪个器件进行通信
I2C总线上的主设备和从设备之间以字节(8位)为单位进行双向的数据传输
通讯速率
然而只支持标准模式的设备不能向上兼容,因为它们不能支持更高的传输速率
所以说不能在更高速率的I2C总线系统中存在
协议详解
I2C协议规定,总线上数据的传输必须有个起始信号作为开始条件,以一个结束信号作为传输的停止条件
起始和结束信号均是由主设备产生,这也意味着从设备不可以主动发起通信,所以的设备都是主设备发起的
主设备可以发起询问的指令,然后等待从设备的通信
当总线在空闲状态时,SCL和SDA都保持着高电平
当SCL为高电平而SDA由高到低的跳变,表示产生一个起始信号
当传输结束时,SCL为高而SDA由低到高的跳变,表示产生一个停止条件
在起始条件产生后,总线处于忙状态,由于本次数据传输的主从设备独占总线,其它的I2C器件无法访问总线
在停止信号产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态
数据传输以字节单位,主设备在SCL线上产生每个时钟脉冲的过程中将SDA线上传输一个数据位
当一个字节按照数据位由高到低的顺序传输完后,紧接着从设备将拉低SDA线
- 回传给主设备一个应答位,此时才被认为一个字节真正的被传输完成
当然,并不是所有的字节传输都必须有一个应答位
- 比如说从设备不能再接收主设备(发送的)数据时,从设备将不回传应答位
RP2040 I2C主要参数
函数讲解
machine.I2C(i2c_id,scl,sda,freq=400000)
- I2C对象构造函数,作用为初始化对应I2C通道和引脚.
- i2c_id:使用I2C通道,可为0或者1;
- scl:SCL引脚,应为Pin对象(I2C0默认为9,I2C1默认为7)
- sda:SDA引脚,应为Pin对象(I2C0默认为8,I2C1默认为6)
- freq:I2C时钟频率,默认为400Kb/S
I2C.scan()
- 扫描从设备函数,返回所有I2C总线上挂载从设备7位地址的列表。
I2C.readfrom(addr, nbytes, stop=True)
- readfrom函数其作用为通过I2C总线从设备读取数据并返回字节串。
- addr:从设备地址。
- nbytes:读取字符长度。
- stop:是否在接收完成数据后发送结束信号。
I2C.readfrom_into(addr, buf, stop=True)
- readfrom_into函数其作用为readfro函数的升级版,可以将读取数据指定存放在字符数组中。
- addr:从设备地址
- buf:字符数组,用于存放数据
- stop:是否在接收完成数据后发送结束信号
I2C.writeto(addr, buf, stop=True)
- writeto函数其作用为向从设备写入数据。
- addr:从设备地址
- buf:发送字符串
- stop:是否在接收完成数据后发送结束信号
内存操作
- I2C.readfrom_mem(addr, memaddr, nbytes, *, addrsize=8)
- readfrom_mem函数其作用为从设备的寄存器中读取数据。
- addr:从设备地址
- memaddr:寄存器地址
- nbytes:读取字节长度
- addrsize:寄存器地址长度
添加了寄存器操作的函数:
I2C.readfrom_mem_into(addr, memaddr, buf, *, addrsize=8)
- readfrom_mem_into函数其作用为从设备的寄存器中读取数据到指定字符数组。
- addr:从设备地址
- memaddr:寄存器地址
- buf:字符数组,用于存放数据
- addrsize:寄存器地址长度
I2C.writeto_mem(addr, memaddr, buf, *, addrsize=8)
- writeto_mem函数其作用为将数据写入从设备的寄存器
- addr:从设备地址
- memaddr:寄存器地址
- buf:发送字符串
- addrsize:寄存器地址长度
软件I2C
以下函数,MircoPython标注为只用于软件I2C
- I2C.start()
- start函数其作用为在I2C总线中发送开始信号(SCL保持高电平,SDA转为低电平)
- I2C.stop()
- start函数其作用为在I2C总线中发送终止信号(SCL保持高电平,SDA转为低电平)
- I2C.readinto(buf, nack=True,)
- readinto函数其作用为从I2C总线读取数据到指定的字符数组,读取长度为字符数组的长度。
- buf:存放数据的字符数组
- nack:在接受最后一个数据后,是否发送nack信号
- I2C.write(buf)
- write函数其作用为将buf字符数组的数据写入到I2C总线中。
- buf:需要发送的字符数组
例程地址
- Github仓库
MicroPython源码
实操
- pico 1
- USB to Miscro USB 数据线 1
- Pico Eval Board 1
查看原理图,Pico 的GPIO6和GPIO7连接到LSF0204,这是一个双向电压电平转换器,它可以在不同工作电压的
器件中传递电平信号,防止器件损坏
然后通过LSF0204连接到ICM-20948,这是一个九轴传感器,分别有3轴加速度/陀螺仪/磁力计
可以用于检测运动姿势,方位和磁场
ICM20948相对重要的寄存器
![[Pasted image 20220923224853.png]]
- WHO_AM_I ,只读寄存器,寄存器地址为0X00,其中内容用于识别设备,如果其中值为0XEA则可以判读该设备为ICM_20948
- RED_ADD_ACCEL_XOUT_H,只读寄存器,寄存器地址为0X2D,存放X轴加速度读取值高8位
- 接下来几个连续地址的寄存器,都是用来存放加速度XYZ三轴读取数值,可以用于连续读取获取数值
- REG_BANK_SEL,可读可写寄存器,用于切换USER BANK
- 以上几个指令均位于USER BANK0下,切换USER BANK可切换对应不同的寄存器组
可以理解为USER BANK为页数,寄存器为行数
程序讲解
简单程序1:
from machine import I2C,Pini2c = I2C(id=1,scl=Pin(7),sda=Pin(6),freq=100_000) # 初始化I2C通道1,使用引脚,I2C频率为100KHZ
addr_list = i2c.scan() # 使用扫描函数,扫描I2C总线下所有的设备地址,并返回对应的列表
# 判断是否只有一个设备连接到了I2C总线
if len(addr_list) == 1:who = i2c.readfrom_mem(addr_lst[0],0x00,1)# Identify ICM20948if who[0] == 0xEA :print("Just a ICM20948 connected")else :print("Have a device connected but it is not ICM20948")
# Nothing connected
elif len(addr_list) == 0:print("Nothing connected")
# More than one device is connected
else :print("More than one device is connected")
微雪PICO教程
微雪树莓派PICO笔记——6. I2C(集成电路总线)相关推荐
- 微雪树莓派PICO笔记——1.基础介绍
文章目录 基础硬件 原理图讲解 电路图重点讲解 点灯实操 基础硬件 长度51mm,宽度21mm,板厚1mm pcb使用了沉金工艺,所以引脚都做了半孔设计,即可焊接2.54mm的排针,也可以直接焊在主板 ...
- 微雪树莓派PICO笔记——5. UART (异步收发传输器)
文章目录 通讯协议 UART UART详解 RP2040 UART参数 UART流程图 函数详解 例程地址 码代码 通讯协议 MCU如果要说话需要约定一定的规则,这些规则,我们称为通信协议 常见的有U ...
- 微雪树莓派PICO笔记——3.PWM(脉冲宽度调制)
文章目录 什么是PWM PWM的应用 RP2040 PWM框架图 PWM流程图 PWM内部框架图 [MicroPython]machine.PWM类函数详解 代码实现 什么是PWM 脉冲宽度调制 (P ...
- 微雪树莓派PICO笔记——7. SPI(串行外设接口)
文章目录 SPI简介 硬件连接 通讯协议详解 RP2040 SPI 主要参数 RP2040 SPI 逻辑框图 machine.SPI类函数详解 例程地址 代码示例 代码实现 SPI简介 SPI全称为串 ...
- 微雪树莓派PICO笔记——4. ADC(模拟数字转换器)
文章目录 什么是ADC RP2040 ADC技术参数 ADC大致框架图 [MicroPython]machine.ADC类函数详解 代码实现 如果我们需要使用PWM精准的控制LED的亮度,就需要反馈 ...
- 树莓派学习笔记——Linux I2C驱动说明
1.前言 [linux内核说明] 通常情况下,I2C设备由内核驱动控制,但是某些情况下I2C设备也可由用户空间控制.如果在用户空间控制I2C设备,需要访问/dev目录中所提供的接口,在使用I2C设备之 ...
- 树莓派学习笔记——wiringPi I2C设备使用详解
1.前言 最近认真学习了树莓派,从浅到深认真分析了wiringPi实现代码,借助树莓派学习linux收获颇丰.深入学习linux一段时间后发现它非常有魅力,一个简单的IO口输出操作尽有那么多的&quo ...
- 树莓派学习笔记——I2C设备载入和速率设置
1.载入设备 方法1--临时载入设备 sudo modprobe -r i2c_bcm2708 #卸载设备 -r代表removesudo modprobe i2c_bcm2708 #重新载入设备 方法 ...
- [树莓派]PICO基础使用_微雪OLED显示
简介 Raspberry Pi Pico是具有灵活数字接口的低成本,高性能微控制器板.它集成了Raspberry Pi自己的RP2040微控制器芯片,运行速度高达133 MHz的双核Arm Corte ...
最新文章
- 处理 react_【学习教程】React 中阻止事件冒泡的问题
- 计算机网络系统结构分析 pdf,计算机网络(实验三:数据包结构分析).pdf
- .NET 动态脚本语言Script.NET系列文章汇总 非常精彩的应用举例
- 关于redis的几点思考
- 新松机器人刻蚀机_中国最大机器人产业基地新松智慧园在沈阳启用
- linux msgsend 头文件,Unix/Linux进程间通信
- 不要版面费的期刊名称
- WSL2:docker中ubuntu18.04编译webRTC
- 跨域问题:Access-Control-Allow-Origin
- 对PAR DAR SAR的理解
- 解决问题:chrome和edge浏览器出现“你的连接不是专用连接“,无法继续访问页面
- safari支持java_safari上如何正确启用java插件
- 大学生数学竞赛资料目录20190403更新
- 交通肇事逃逸会受到什么处罚
- m180n 如何设置网络打印_「hp彩色打印机」惠普m180n打印机怎么设置彩色打印? - seo实验室...
- android开发split的方法在String中的特殊使用
- Java面试手册——高频问题总结(二)
- charing animation
- 外行朋友值得一读的5本经典数学书
- Android-O wifi PNO扫描流程
热门文章
- 【打CF,学算法——二星级】CodeForces 292A 	SMSC (模拟)
- 【JZOJ3155】最短路
- 嵌入开发(WinCE)的一些经验(2)
- 虚拟机(复制网卡配置)
- UE4智慧城市项目制作规范
- Warning: os-prober will not be executed to detect other bootable partitions
- Android小说爬虫工具,几行代码实现小说阅读下载
- 黄峥2021年致股东信原文:
- Unity 刀光拖尾生成
- 微处理器未来十年的主要市场,哪种指令集会主宰市场?