发 帖  
原厂入驻New
[经验]

如何在示波器上读取I2C总线

2020-9-21 09:29:26  324 I2C 示波器
分享
1
项目概况
我将使用泰克多域示波器3104解码I²C数据,并通过顺序轮询所有地址并寻找确认(ACK)信号来确定设备的I²C地址。任何I²C设备都可以。我收到了英飞凌3D霍尔效应传感器的评估套件,并将其用作我的I²C设备。
产品成本(和产品链接)其他资讯
infineon 3D磁性传感器2 Go套件$ 28套件手册 | 传感器手动 | 传感器产品简介
4位标题(0.100英寸)$ 1数据表
Arduino Uno R3$ 15产品信息
双向逻辑电平转换器三块数据表
跳线三块
如上所述,这里可以接受任何与I²C兼容的传感器或显示器。您无需使用电磁传感器2 Go套件。

设置电路
我使用的Arduino板具有5V逻辑。3D2GO评估套件由3.3 V供电。这意味着必须在Arduino的数据线和评估套件之间插入双向逻辑电平转换器(BD-LLC)。
要将BD-LLC插入Arduino和I²C设备之间,请进行以下连接:
  • 从Arduino到BD-LLC上的GND
  • BD-LLC到3D2GO上GND的GND
  • 从Arduino到BD-LLC上的低压(LV)的3.3V
  • BD-LLC上的LV至3D2GO上的3.3V
  • BD-LLC上的Arduino 5V至高压(HV)
  • Arduino SDA转HV1
  • Arduino SCL转Hv2
  • BD-LLC LV1至3D2GO SDA
  • BD-LLC LV2至3D2GO SCL


设置示波器
接下来,您需要设置示波器。为此,请按照下列步骤操作:
  • 打开示波器,然后等待它完成自检。
  • 将探头插入通道1和通道2。
  • 将探头的接地夹连接到电路中的接地点(如有必要,请使用跨接线)。
  • 将探头1连接到SDA,将探头2连接到SCL(如有必要,请使用跳线)。
现在,您可以打开Arduino IDE,并将以下代码上传到您的开发板上。这是一个I²C扫描器,它将扫描设备的所有地址并查找ACK响应。
  1. //  I2C Scanner from Arduino.cc
  2. //  Attribution to Krodal, Nick Gammon, Anonymous

  3. #include <Wire.h>

  4. void setup()
  5. {
  6.   Wire.begin();

  7.   Serial.begin(9600);
  8.   Serial.println("\nI2C Scanner");
  9. }

  10. void loop()
  11. {
  12.   byte error, address;
  13.   int nDevices;

  14.   Serial.println("Scanning...");

  15.   nDevices = 0;
  16.   for(address = 1; address <= 127; address++)
  17.   {
  18.     // The i2c_scanner uses the return value of
  19.     // Wire.endTransmission to see if
  20.     // a device acknowLEDged the address.
  21.     Wire.beginTransmission(address);
  22.     error = Wire.endTransmission();

  23.     if (error == 0)
  24.     {
  25.       Serial.print("I2C device found at address 0x");
  26.       if (address<16)
  27.         Serial.print("0");
  28.       Serial.print(address,HEX);
  29.       Serial.println("  !");

  30.       nDevices++;
  31.     }
  32.     else if (error==4)
  33.     {
  34.       Serial.print("Unknown error at address 0x");
  35.       if (address<16)
  36.         Serial.print("0");
  37.       Serial.println(address,HEX);
  38.     }   
  39.   }
  40.   if (nDevices == 0)
  41.     Serial.println("No I2C devices found\n");
  42.   else
  43.     Serial.println("done\n");

  44.   delay(5000);           // wait 5 seconds for next scan
  45. }
复制代码
现在,每5秒钟,Arduino将轮询I²C地址1-127。如果在被查询的地址处存在设备,则将在发送地址字节后将SDA线拉低,从而向Arduino发送确认信号。
现在,我们可以继续使用示波器对I²C总线进行解码。
对于Tektronix MDO3000或MDO4000系列示波器,请执行以下步骤,并在括号中使用通用说明。
  • 按下通道1按钮(打开示波器通道1)
    • 按“标签”(如果可以,请标记您的输入)
    • 使用  通用b向下滚动到“数据”(标签通道1为“数据”)
    • 选择“插入预设标签”
    • 使用“ 通道1”  按钮下方的“ 垂直刻度 旋钮 ” 设置每格2伏(减小信号的高度,使其占不到屏幕的一半)
    • 使用Channel 1  按钮 上方  的  旋钮将信号移至屏幕的中上部分
  • 按下“向下”箭头移至“通道2”(打开示波器通道2)
    • 使用通用b向下滚动到“ CLK”(标签通道2为“ clock”)
    • 选择“插入预设标签”
  • 按  菜单关闭  按钮
  • 按下频道2按钮
    • 使用“ 通道2”  按钮下方的旋钮设置每格2伏(减小信号的高度,使其不到屏幕的一半)
    • 使用“ 通道2”按钮上方的旋钮将信号移到屏幕的下部中间(这将时钟信号的迹线与数据信号的迹线分开)
  • 按下B1按钮(示波器的总线功能可让您解释和显示串行或并行数据;在这种情况下,我们正在处理I²C数据)
    • 按“总线B1”,然后使用通用a选择“ I2C”(告诉示波器需要哪种数据类型)
    • 选择“定义输入”
      • 使用通用a在通道2上选择“ SCL”(将CLK通道分配为SCL)
      • 使用通用b在通道1上选择“ SDA”(将DATA通道分配为SDA)
      • 使用通用a通用b将SDA和SCL上的“阈值”设置为“ 1 V”
      • 将“在地址中包含R / W”设置为“是”
      • 将“ B1标签”设置为“ I2C”(以保持跟踪状态)
      • 将“总线显示”设置为“总线和波形”
      • 设置“十六进制”
  • 按下触发  菜单按钮
    • 选择“公共汽车”
    • 选择“源B1-I2C”
    • 选择“开始时触发”
  • 菜单关闭
  • 使用Scale  旋钮将时间刻度更改为1.00 ms
  • Single捕获单个波形
  • 使用Wave Inspector旋钮放大要更仔细检查的I²C事务的任何部分。在我的情况下,在地址0x5E之后接收到一个ACK,因为那是磁传感器芯片的地址。



以下视频引导您完成解码I²C总线所需的步骤。(在Youtube,需要一定的上网工具支持)

如何将数据从示波器保存到计算机解码后的数据存储在事件表中。您可以将其保存到USB驱动器或计算机中。



由于插入USB驱动器是一个简单的例子,因此我们将通过远程控制示波器来做到这一点。以下步骤特定于microsoft Windows以及Tektronix MDO3000和MDO4000系列示波器。
附带说明,我们将要做的是潜在的数据安全风险。在工作之前,请与您的IT部门联系。
我的计算机位于192.168.0.18,示波器位于192.168.0.40。对命令进行适当的调整。
  • 以管理员身份运行CMD.EXE并键入以下内容以创建共享:
    • mkdir C:\示波器
    • NET SHARE Scope = C:\ Oscilloscope / remark:“ TEK3104 Data” / grant:domain \ user,FULL  //这将在您的主硬盘上创建一个名为“ Scope”的共享。您可以将其更改为所需的任何位置。确保将domain \ user更改为计算机连接到的域的名称,或将PC的名称更改为您用来登录Windows的用户名。
    • ipconfig //注意本地连接ipv4地址。在我的示例中,它是192.168.0.18。
  • 接下来,当仍在CMD.EXE中时,使用PuTTY或telnet连接到示波器:
    • TELNET -O 192.168.0.40 4000  //将192.168.0.40更改为您的示波器的IP,该IP在启动时显示在主屏幕上。
  • 现在,您已通过默认端口4000上的IP地址连接到示波器。键入以下内容:
    • !d //清除设备。
    • files:mount:list? //这将显示所有已安装的驱动器。
    • files:mount:drive“ H:; 192.168.0.18; Scope; user; pass;” //这会在机器上的192.168.0.18处创建一个持久驱动器。
    • files:mount:list?  //这将导致出现一个新的驱动器。
    • files:mkdir“ H:/ NewArticles” //在计算机上创建一个名为“ New Articles”的目录。
    • files:cwd“ H:/ NewArticles”    //将焦点更改到该目录。
    • save:eventtable:B1“ eventtable.csv”   //(最终)将数据保存到计算机。





结论

在不到15分钟的时间里,我们对I²C总线进行了解码,然后从整个房间将数据保存到计算机中进行分析。
现在已经建立了共享文件夹,以后的工作可以在几分钟之内完成。这种自动解码过程比仅探测信号并尝试手动解释逻辑电平要有效得多。

我使用了本文中显示的范围和过程来解码3D磁传感器2 Go的几种不同模式的I²C总线数据,并确定哪些命令对应于哪些电源模式。


相关经验

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表