如何设计和调试自定义I2C主从系统?


Answers:


10

我在Embedded Linux Conference上提供的本教程试图回答这些问题,提供指向所解决主题的更详细描述的链接,并使用驾驶4WD无人机的实际示例进行说明,其中Arduino Mini Pro充当从属并控制4个独立的轮子。原始文件可以在这里找到。

注意:此答案目前正在开发中,因为我调整了链接中的重点。


I2C总线的典型应用

  • 与相对较慢的外围设备接口。例如:传感器,机械执行器。
  • 控制“快速”外围设备,该外围设备使用其他通道交换数据。例如:编解码器。

    在PC中,操作系统通常通过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)
  • 在所选设备内注册为信息处理程序。

公交交通示例

公交交通示例 总线写周期示例 总线读取周期第1部分示例 总线读取周期第2部分示例


定制奴隶

为什么要创建自定义I2C从设备?

  • I2C接口不提供所需的传感器/执行器。
  • 可用的唯一地址少于所需的从站。
  • 从站上所需的自定义功能:
    • 对刺激的半自主反应。
    • 过滤/预处理输入数据。
  • 功率优化:当主处理器空闲时,自定义的“传感器中心”进行内部管理。
  • 实时响应输入。
  • [您的想象力在这里]

如何设计定制的I2C从器件?

  • 定义需求(请参阅上一张幻灯片)。
  • 选择微控制器或微处理器。
  • 选择调度程序或操作系统(如果有)。
  • 定义通信子协议:
    • 定义要交换的参数和命令。
    • 将它们整理成“注册者”,然后选择一个免费地址。

I2C主机的设计

关键设计标准:

  • 重量/尺寸。
  • 所需的计算能力和平均延迟。
  • 类似于PC的设备
    • 嵌入式设备,通常无头。
    • 首选的编程语言:解释还是编译。
  • 用于驱动从站的总线/ GPIO的可用性:
    • 仅限GPIO:bitbang协议
    • I2C:用户空间应用程序与内核驱动程序。
    • 没有可用的GPIO / I2C接口:USB到I2C适配器。

调试:分而治之

使用临时设备直接控制总线。例子:

  • 海盗船(也可用于其他公共汽车)
  • USB转I2C主适配器,也基于FTDI FT232R芯片。
  • 自定义设备(可以是单独的项目)。
  • 用逻辑分析仪或示波器/高级仪表监听总线。例子:

    • 带有兼容逻辑分析仪的sigrok / pulseview
    • 2通道独立示波器/仪表
    • 使用特定于从机的在线调试器/在线仿真器。

      示例:用于AVR芯片的AVR Dragon(Arduino UNO,Nano,Mini,MiniPro)


海盗海盗

海盗船

  • 主要用于开发目的。
  • 可以同时嗅探总线并驱动它。
  • 通过串行(ttyACM)端口的控制台接口,包括宏,或对几种编程语言的编程访问。
  • 内置上拉电阻器和电压源(5V / 3.3V)
  • 支持许多其他协议。
  • 参考文献:Wikipedia主页

USB转I2C适配器

usbtoi2c

  • 占地面积小。
  • 适用于永久性安装。
  • 无需在主机上进行特殊连接:它可用于与典型PC进行接口。
  • 可用的变体也具有SPI功能。
  • 没有控制台界面,只有串行二进制协议。
  • 需要协议包装器
  • 参考:协议

sigrok和Pulseview

sigrok(Bakend组件)徽标

西格罗克

Pulseview(可视化器)示例

脉冲视图

低端逻辑分析仪示例

Saleae

  • 事实标准,用于Linux上PC驱动的测量(但在其他OS上也可用)。
  • 支持各种逻辑分析仪,示波器和仪表。
  • 各种协议解码器,包括I2C。
  • 用于可视化逻辑信号和调试协议错误。
  • 即使是非常低端的,廉价的硬件也可以为调试提供一个全新的维度。
  • 参考:sigrokpulseview支持的硬件

示例:操纵4WD无人机

使用2个Arduino Mini Pro构建的原型。 无人驾驶飞机


奴隶在本例中做什么?

I2C从站:

  • 控制施加到每个车轮的扭矩量。
  • 控制每个车轮旋转的方向。
  • 通过光学编码器(里程表)测量每个车轮的转速。
  • 将以上参数公开给I2C主设备。

从角色

I2C从设备的高级框图。


选择从站:Arduino Mini Pro

MiniPro

  • 为每个车轮提供足够的销钉/功能:
    • 1个具有独立配置占空比的PWM输出。
    • 1个GPIO,用于将里程表输入注册为IRQ。
    • 2个GPIO用于选择:
      • 向前
      • 逆转
  • I2C硬件模块,用于中断驱动的i2c交换。
  • 用于基于SPI编程的专用引脚。
  • 占地面积小。
  • 低成本。
  • 图片中表示的克隆的电路板布局经过优化,可安装在DIL插座上。

从属特定ICD:AVR Dragon

AVR龙


选择操作系统:ChibiOS

ChibiOS

  • RTOS:抢占,任务,信号量,动态系统tic等。
  • 占用空间小:仅链接使用的代码/数据。
  • 通过HAL区分RTOS和BSP。
  • 非商业用途的GPLv3。
  • 积极发展,但已经成熟。
  • 支持8位AVR。

但是,它对AVR的BSP支持有限,缺少:-中断AVR GPIO的驱动程序(已添加)。-I2C支持AVR从模式(自定义)。它必须作为AVRDrone SW的一部分单独开发。


定义通讯参数

对于每个车轮:

  • 用于驱动它的PWM信号的占空比 -1个字节。0xFF =最大扭矩/ 0x00 =无扭矩

  • 旋转方向 -1个字节。

    • 0x00 =空闲
    • 0x01 =反向
    • 0x02 =转发
    • 0x03 =锁定
  • 光学编码器的时隙之间的平均周期 -2个字节。

    • 写任何东西都会重置测量。
  • 参数索引 -1个半字节:

    • 0 =占空比
    • 1 =方向
    • 2 =平均期间
  • 车轮索引 -1个半字节:

    • 0 =左后
    • 1 =右后
    • 2 =右前
    • 3 =左前
    • 4 =全部

子协议:定义寄存器

寄存器格式: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

汽车顺时针旋转。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.