我在Embedded Linux Conference上提供的本教程试图回答这些问题,提供指向所解决主题的更详细描述的链接,并使用驾驶4WD无人机的实际示例进行说明,其中Arduino Mini Pro充当从属并控制4个独立的轮子。原始文件可以在这里找到。
注意:此答案目前正在开发中,因为我调整了链接中的重点。
I2C总线的典型应用
如果有多个总线控制器可用,则按速度对外围设备进行分组,以使快速的外围设备不会受到较慢的外围设备的影响。
I2C总线快速入门-关键功能
- 串行总线。
- 仅2条线:串行时钟和串行DAta(加地线)。
- 4种速度:100kHz,400kHz,1MHz,3.2MHz。
- 通常,有1个主设备和1个或多个从设备。
- 通信始终由主设备启动。
- 多个主机可以共存于同一总线上(多主机)。
- 开漏:SDA和SCL都需要上拉电阻。
- “时钟伸展”
- 主机控制SCL,但是如果需要调整速度,从机可以将其按住(因为漏极开路)。
- 主机必须检查这种情况。
- 从站可能会卡住并阻塞总线:需要从主站到从站的复位线。
- 通常支持7位寻址,但也支持10位。
- 逻辑协议:未指定实际电压水平,并且取决于各个实现。例如:1.8V / 3.3V / 5.0V
参考网址:
总线配置示例
议定书的特点(简体)
- 2种消息类型:读取和写
- 开始/停止位-在其余答案中用“ [”和“]”表示
- 地址:7位或10位
- R / W位:R = 1 / W = 0用于区分所发送消息的类型。
- 总线上的数据:(地址<< 1 | R / W)
- 在所选设备内注册为信息处理程序。
公交交通示例
定制奴隶
为什么要创建自定义I2C从设备?
- I2C接口不提供所需的传感器/执行器。
- 可用的唯一地址少于所需的从站。
- 从站上所需的自定义功能:
- 功率优化:当主处理器空闲时,自定义的“传感器中心”进行内部管理。
- 实时响应输入。
- [您的想象力在这里]
如何设计定制的I2C从器件?
- 定义需求(请参阅上一张幻灯片)。
- 选择微控制器或微处理器。
- 选择调度程序或操作系统(如果有)。
- 定义通信子协议:
- 定义要交换的参数和命令。
- 将它们整理成“注册者”,然后选择一个免费地址。
I2C主机的设计
关键设计标准:
- 重量/尺寸。
- 所需的计算能力和平均延迟。
- 类似于PC的设备
- 嵌入式设备,通常无头。
- 首选的编程语言:解释还是编译。
- 用于驱动从站的总线/ GPIO的可用性:
- 仅限GPIO:bitbang协议
- I2C:用户空间应用程序与内核驱动程序。
- 没有可用的GPIO / I2C接口:USB到I2C适配器。
调试:分而治之
使用临时设备直接控制总线。例子:
- 海盗船(也可用于其他公共汽车)
- USB转I2C主适配器,也基于FTDI FT232R芯片。
- 自定义设备(可以是单独的项目)。
用逻辑分析仪或示波器/高级仪表监听总线。例子:
海盗海盗
- 主要用于开发目的。
- 可以同时嗅探总线并驱动它。
- 通过串行(ttyACM)端口的控制台接口,包括宏,或对几种编程语言的编程访问。
- 内置上拉电阻器和电压源(5V / 3.3V)
- 支持许多其他协议。
- 参考文献:Wikipedia,主页
USB转I2C适配器
- 占地面积小。
- 适用于永久性安装。
- 无需在主机上进行特殊连接:它可用于与典型PC进行接口。
- 可用的变体也具有SPI功能。
- 没有控制台界面,只有串行二进制协议。
- 需要协议包装器。
- 参考:协议
sigrok和Pulseview
sigrok(Bakend组件)徽标
Pulseview(可视化器)示例
低端逻辑分析仪示例
- 事实标准,用于Linux上PC驱动的测量(但在其他OS上也可用)。
- 支持各种逻辑分析仪,示波器和仪表。
- 各种协议解码器,包括I2C。
- 用于可视化逻辑信号和调试协议错误。
- 即使是非常低端的,廉价的硬件也可以为调试提供一个全新的维度。
- 参考:sigrok,pulseview,支持的硬件
示例:操纵4WD无人机
使用2个Arduino Mini Pro构建的原型。
奴隶在本例中做什么?
I2C从站:
- 控制施加到每个车轮的扭矩量。
- 控制每个车轮旋转的方向。
- 通过光学编码器(里程表)测量每个车轮的转速。
- 将以上参数公开给I2C主设备。
I2C从设备的高级框图。
- 为每个车轮提供足够的销钉/功能:
- 1个具有独立配置占空比的PWM输出。
- 1个GPIO,用于将里程表输入注册为IRQ。
- 2个GPIO用于选择:
- I2C硬件模块,用于中断驱动的i2c交换。
- 用于基于SPI编程的专用引脚。
- 占地面积小。
- 低成本。
- 图片中表示的克隆的电路板布局经过优化,可安装在DIL插座上。
- RTOS:抢占,任务,信号量,动态系统tic等。
- 占用空间小:仅链接使用的代码/数据。
- 通过HAL区分RTOS和BSP。
- 非商业用途的GPLv3。
- 积极发展,但已经成熟。
- 支持8位AVR。
但是,它对AVR的BSP支持有限,缺少:-中断AVR GPIO的驱动程序(已添加)。-I2C支持AVR从模式(自定义)。它必须作为AVR的Drone SW的一部分单独开发。
定义通讯参数
对于每个车轮:
子协议:定义寄存器
寄存器格式:0xαβ
-α=参数索引-β=车轮索引
地址(任意选择):0x10
总线海盗格式:
-[=起始位-] =结束位-r =读取字节-地址乘以2(左移1),对于R / W位
示例-总线盗版格式
[i2c_addr reg_addr =(parm,wheel)reg_value]
[0x20 0x20 0x02] Left Rear Forward
[0x20 0x21 0x01] Right Rear Backward
[0x20 0x22 0x01] Right Front Backward
[0x20 0x23 0x02] Left Front Forward
[0x20 0x14 0xFF] Wheels set to max torque
汽车顺时针旋转。