Questions tagged «i2c»

I²C(集成电路间)是飞利浦(现在为NXP)发明的多点串行总线,用于同一PCB上的IC之间的通信,即短距离通信。

2
冗余I2C在航天航空电子设备中的使用
我最近阅读了有关JPL x2000航空电子设备开发项目的报告,该项目使用商业硅片开发了更多模块化的航空电子设备平台,以降低成本和功耗。他们选择了两个冗余协议的架构,以将航天器中的所有电子设备连接起来。高速1394总线用于大数据,而I2C总线(100khz)用于低带宽控制。它被配置为多主机总线,每个节点都可以在其中相互通信。 我使用I2C的不仅仅是单个传感器,但据我了解,距离存在严重限制。在航天器中,可能有很长的线束。 除了具有两个冗余I2C总线之外,每个设备还具有定制的ASIC,该ASIC在总线和此处和此处所示的主芯片之间提供隔离。该芯片是否也可以提供某种调节? 谁能解释为什么他们可能选择使用设计用于一个PCB内通信的协议来进行大型车辆内的通信? 我知道可能没有一个确定的答案,但是我有兴趣了解影响选择的因素。
10 i2c  protocol 

1
I2C的压摆率是多少?
我正在使用C18编译器的内置功能在PIC18上配置I 2 C,如文档的第2.4节中所述: void OpenI2C2( unsigned char sync_mode, unsigned char slew ); 我不确定该怎么办slew。我可以从以下两个选项中进行选择i2c.h: SLEW_OFF:在100 kHz模式下禁用摆率 SLEW_ON:为400 kHz模式启用了摆率 在第257页的寄存器15-1中的数据表中,对这两个选项进行了更详细的说明: 1 =在标准速度模式(100 kHz和1 MHz)下禁用摆率控制 0 =为高速模式(400 kHz)使能摆率控制 我还是不明白-我有几个问题: 什么是转换率? 对我来说,这两个选项没有意义-如果我想禁用400kHz的摆率并启用100kHz,该怎么办?为什么是这样? 我应该SLEW_OFF何时选择何时SLEW_ON?
10 pic  c  i2c  software  c18 

2
I2C上拉电阻计算
我正在尝试使用ATxmega16A4U微控制器来驱动此I2C LCD显示器。 列出的这两种器件都可在最高400 kHz的I2C时钟频率下工作。这两个设备是I2C总线上唯一的设备。 但是,计算上拉电阻器边界的计算会得出一些相当奇怪的值。 计算I2C最小上拉电阻值: [R中号我Ñ= Vc c - 0.43 m A= 966.7 欧[R米一世ñ=VCC-0.43米一种=966.7Ω\begin{equation} R_{min} = \frac{Vcc - 0.4}{3mA} = 966.7 \Omega \end{equation} 查看uC数据手册,第92页列出了最大引脚输入电容10pF。 但是对于LCD,它在第8页上有一个称为Capacitive load represent by each bus lineCb的东西,其最大值为400pF。我以为我应该将此值加到10pF uC输入电容上,但这看起来确实很高,计算也很麻烦。 例如,当我尝试计算400kHz时钟的最大上拉电阻值时: [R中号一个X= 300个Ñ 小号10 p F+ 400 p F= 731.7 Ω[R米一种X=300ñs10pF+400pF=731.7Ω\begin{equation} R_{max} = \frac{300ns}{10pF + 400pF} = …
10 i2c  pullup 

4
重中断负载下I2C读/写失败
在我的系统中,我正在使用I2C,并且我意识到在繁重的中断负载(来自其他来源)下,I2C通信很容易中断。这是I2C的预期行为吗?我本来希望尽管有中断负载,但仍然可以,因为I2C并非完全是时间紧迫的接口,时钟随数据一起提供。 更新: 处理器是STM32。中断是由于ADC引起的,因此我无法在读取事件期间禁用中断,因此我必须找到一种可以使i2c通信更加稳定的解决方案。STM32是主设备,从设备是另一个设备(加速度计)。 更新2: 当我用一根小的飞行电缆将逻辑分析仪连接到时钟时,问题就消失了。有趣的是,没有中断加载,读写工作良好,有中断加载却没有。但是,如果我将探针连接到时钟上,则在中断负载下也可以进行读写操作。我认为某个地方存在电容问题。
10 i2c 

4
这是I²C通讯吗?
我需要解码两个设备之间的通信,但是我没有关于这些设备的信息。我所知道的是,需要四根线(GND,VCC和两根通信线)。我怀疑这是I²C通讯。 我正在尝试使用示波器解码工具对其进行解码,但是我不太确定。目视检查波形时,无法正确识别I²C通信的元素。 查看波形,我做了以下假设,也许有人可以帮忙。这些是我的假设: 一切都导致人们相信时钟是蓝色信号,数据是红色信号。 时钟似乎已反转,因为其空闲状态未处于高电平。 我不确定数据信号是否也反转了,但事实似乎如此。 我的假设正确吗? 在最后一个图中,数字5的圆圈用圆圈表示,并且信号的一部分。我无法识别开始,确认和停止位。任何人都可以仅通过查看数字来识别这些元素吗? [编辑]有些人问我有关通信中的设备的信息。通信是在汽车钥匙和我不能说的工具之间进行的,但是我正在尝试对其进行逆向工程。

1
I2C仅在探查或加载1Mohm时工作
我正在尝试对Msp430fr5847(主机)和具有未知I2C芯片的从属传感器(工业传感器的一部分)之间的通信进行故障排除 我遇到了一批新传感器,其中我的数据全为零返回,但是当尝试使用我的Saleae逻辑专业版(2Mohm,10pf)或示波器(10Mohm,50pf)进行故障排除时,该系统在探测时可以正常工作SDA引脚。 如果在SDA与地面之间添加一个1Mohm的电阻,则该电路可以正常工作,但如果仅添加一个10pf或100pf的电容器,则该电路无法正常工作。 我正在使用4.7k上拉电阻连接到3.3v电源轨。 是什么可能导致此问题,以及在不无意间解决问题的情况下可以进行故障排除。 编辑:19/07/2017这是我的信号的快速范围跟踪。 我忘记提及的其他事情是,仅探测SDA会使电路板工作,探测SCL或我的中断线不能使其正常工作。 编辑:21/07/2017 该图变厚了,看来连接不同的示波器无法使电路正常工作,并且可以看出,唯一的区别是未发送ACK。 在上图中,电路未正确运行时,蓝色和绿色迹线是SCL和SDA。黄色和粉红色迹线来自于我也将我的Saleae逻辑连接到SDA引脚并接地但没有插入USB的情况(试图避免接地回路)。 为了给传感器增加更多背景信息,这是我们从制造商那里购买的工业压力传感器。我们之前已经使用第一批传感器设计和测试了这些PCB。我们最近收到了一批新货,现在遇到了这些问题。我已经做了一些调查,我强烈怀疑内部的传感器采用ZSC31014或类似,PDF数据表(从数据表中使用Google独特的寻找后的句子)HERE 编辑:26/07/2017 因此,希望按照SamGibson的详细回答解决问题的最后一部分,我已经实现了将地址的高位设置为掩盖起始位末尾毛刺的解决方案。 这在大多数情况下都可以按预期方式处理数据,但是现在看来,在写入后的第一个读取命令中(如果这是一组i2c位的正确术语),从机将尝试提前ACK(在写位的位置)。我可以说是从机通过添加一个与SDA线串联的小电阻(47欧姆)将线拉低。 我通常会以一个新问题开始,但是当我附加在上面的疑难解答中没有作用的相同作用域时,这个问题似乎消失了,即使我附加了作用域探针,这似乎也确实是一个边界问题,没有将其连接到示波器的问题得到解决,所以我假设这是一个电容问题。 没有附加范围的问题图 示波器探头已连接但未连接到示波器的问题图,注意从机下拉写位而不是ACK位时电压略高。

2
MCP3424,如何并行读取通道?
关于这个问题 我没有电子工程背景,这是我通过I2C进行通信以及写寄存器的第一个挑战,因此,请不要在我这方面承担太多的知识。我正在编写Arduino。 在询问特定的电子组件/芯片时,我认为人们无法进行实验/测试以给出正确的答案。我也希望人们甚至不知道这一部分。因此,我将尝试在此问题中添加很多信息。 如果您需要更多信息,请告诉我。 该组件具有四个ADC 我正在使用4通道组件MCP3424(数据表)。它有两个包装。我使用的是MCP3424 E / SL 4通道SOIC版本,而不是MCP3422或MCP3423 2通道版本。 我相信它有四个ADC。在RS-Online上,似乎E / SL版本具有4个ADC(直接链接),而E / ST仅具有1个(直接链接)。 我认为这必须意味着它可以同时在多个通道上进行采样。我看不出有任何其他原因在该组件上放置多个ADC。 我对吗? 通过I2C进行通信 通过发送一个配置字节,然后等待采样结束并读取结果来进行通信。 配置字节格式 有趣的是: 从左数第3位,从1开始计数:连续采样 从1开始,从左数第1位和第2位 有关配置字节的更多信息,请参见数据表第18页,此处也有描述。 读取结果的格式 我的示例仅具有18位分辨率(位5和6设置为1)。读回的结果将是四个字节:前三个包含值,第四个包含配置字节。 但是,最左边的位!RDY指示该值是否为“新”,即自上次读取以来是否为新读数。第一次读取一个结果时,该值为0,随后的结果为1,直到ADC准备好新的采样值为止。 如何在不并行采样的情况下使用它 我完全知道该怎么做。我在网上找到的所有示例,也很简单。只需将配置字节写入组件,然后回读一个值即可。 如何设置每个通道自动连续采样,并并行读取通道 伪代码可能像 setup(): start sampling channel 1, 18bit, 0gain, continuously start sampling channel 2, 18bit, 0gain, continuously start sampling channel …
9 arduino  adc  i2c 

2
如何处理模块上的多个上拉电阻
我正在考虑为几天前开发的开发板制作一个模块,其中将包括spi / i2c接口。 问题是我没有在主板的MCU引脚中包括上拉电阻,而是在考虑将它们添加到模块中以使其更“通用”,因此每个用户都可以使用它们而无需在其中添加额外的电阻。原型板。 但是后来我遇到了下一个问题。如果在额外的模块中添加上拉电阻,并且例如将两个或多个模块连接到同一条总线,则这些电阻将并联,这样电阻将下降并且无法实现其功能。 但是,如果我在主板上增加上拉电阻,则这些引脚在MCU中始终为低电平有效。 因此,主要问题是: 如何将多个模块连接到同一条总线上,而每个模块上都有一个上拉电阻,而当一个以上模块时却不能使它们并联?那可能吗? 还是这里最好的解决方案是在MCU中启用上拉电阻,而不在模块中插入上拉电阻? 谢谢。-

5
I2C EEPROM位敲击:写正常,但仅当未设置第一位时
我目前正在使用位撞击驱动SDA和SCL线的I2C EEPROM项目。 我的读取功能可以正常工作,但是每当我写任何以“ 1”开头的字节时,我总会读回FF。即使该字节之前已经用其他方式编程过。领先的“ 0”是完美的。这不是我的阅读习惯;正如我在示波器上看到的那样,它返回FF。 我正在寻找关于为什么会这样的建议。有什么明显的我可能会引起问题的原因吗?[我无法发布代码-公司机密... :(] 我看到的每个波形都完全符合规范。我正在去耦EEPROM。我的引体向上是2.2k,所以在规格范围内。在此原型中,我的时钟频率约为500 Hz。芯片正在向我的每个字节发送ACK,以便识别它们。但这是行不通的... 我正在使用Microchip 24LC256。 一个字节的简化写入算法: wait SDA low SCL low wait for each bit if bit is set: SDA high if bit is unset: SDA low wait SCL high wait wait SCL low wait wait SDA high SCL high wait wait check ACK …
9 i2c  eeprom 

2
PIC12F675 GP4不起作用
我正在为一个项目使用PIC12F675,除一件事情外,其他所有东西都工作正常。GP4不能用作数字IO。我已经看了很多配置和代码,但是找不到任何东西。 配置: #pragma config FOSC = INTRCCLK #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config MCLRE = OFF #pragma config BOREN = ON #pragma config CP = OFF #pragma config CPD = OFF 码: #include <xc.h> #include <math.h> #include "config.h" #define _XTAL_FREQ 4000000 void delay(unsigned int …
9 pic  c  embedded  programming  audio  oscillator  spark  dc-dc-converter  boost  charge-pump  eagle  analog  battery-charging  failure  humidity  hard-drive  power-supply  battery-charging  charger  solar-energy  solar-charge-controller  pcb  eagle  arduino  voltage  power-supply  usb  charger  power-delivery  resistors  led-strip  series  usb  bootloader  transceiver  digital-logic  integrated-circuit  ram  transistors  led  raspberry-pi  driver  altium  usb  transceiver  piezoelectricity  adc  psoc  arduino  analog  pwm  raspberry-pi  converter  transformer  switch-mode-power-supply  power-electronics  dc-dc-converter  phase-shift  analog  comparator  phototransistor  safety  grounding  current  circuit-protection  rcd  batteries  current  battery-operated  power-consumption  power-electronics  bridge-rectifier  full-bridge  ethernet  resistance  mosfet  ltspice  mosfet-driver  ftdi  synchronous  fifo  microcontroller  avr  atmega  atmega328p  verilog  error  modelsim  power-supply  solar-cell  usb-pd  i2c  uart 

6
I2C信号和远程电源(10米电缆)
经过一番阅读/测试后,我设法使用I2C和FTP CAT5铜双绞线电缆在2个设备之间进行稳定的通信。 绿线-SCL 白/绿线-GND 蓝线-SDA 白/蓝线-GND GND仅在一根电缆端连接,I2C总线时钟为10Khz,并且我已将10Kom上拉电阻器连接到VCC 它运作良好且稳定。当我决定使用另外两对电缆供电(+ 12V)时,它停止工作。我在另一对上的一对GND上测试了+ 12V,也在同一对上测试了+ 12V / GND:相同的结果,它停止工作。整个I2C总线停止工作,其他设备也停止工作。 不知道我可以使用同一根电缆还是选择最安全的电缆-另一根电缆供电。
9 power  i2c 

2
I2C总线上的MITM
我一直在尝试设计一个模块,该模块将允许我修改I2C总线上的选定从属响应。这是原始总线配置(为清楚起见,未显示上拉和电源连接: 该总线上只有2个设备,并且只有100kHz。控制器MCU(I2C主设备)和RFID读卡器(I2C从设备)NXP PN512。我无法修改控制器固件或更改I2C总线事务。好消息是控制器仅发送两种交易类型: Master (Write Register) - <s><address+W><register number><data><p> Master (Read Register) - <s><address+W><register number><p><s><address+R><data><p> 我想做的是用我自己的字节替换在主寄存器读取期间选择的数据字节。我可以通过UART(921.6kbaud)将MCU希望读取的寄存器号发送到我的PC。我可以在那里用C / C ++或Python处理它们。当我收到需要替换其值的寄存器号时,可以将假字节发送回我的设备,它将负责将其发送回控制器,以替换原始卡的响应。 首先,我将I2C总线分为两部分: 我尝试了Arduino Nano,后来尝试了使用时钟扩展的CPLD。面对MCU控制器的ATmega328硬件I2C不能跟上,因为有时启动序列的产生早于上一个停止周期后的5us。因此,AVR时不时要进行NAK读取事务。CPLD可以处理停止/启动速度,结果证明在MCU中禁用了总线扩展。 我想出了一个可以通过检测单字节写入来“预测”主寄存器读取的想法,因为我确信它后面会进行读取。在下一个读周期地址写入期间,似乎有足够的时间从从设备引入字节。那不是很有效。总线事务在开始时(大约前5秒)似乎还不错,但随后控制器停止了总线上的所有通信,就好像它检测到不是在直接与标签读取对话一样。 读卡器还可以产生对主机的中断。IRQ是基于计时器或事件的。我将问题归因于本来是在总线上引入的延迟。我可能错了,但我想出了另一种“零延迟”设计。 我的想法是,我只能断开SDA线,而使SCL线保持连接在主机和从机之间。这样,我仍然可以在任一方向上替换数据线上的字节。由于我必须根据总线周期来控制SDA线的方向,因此设计变得更加复杂。这是处理总线事务并通过UART将十六进制字节发送到计算机的VHDL代码。从计算机接收字节尚未实现: library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity I2C_Sniffer is port ( clk : in std_logic; scl_master : in std_logic; sda_master : inout std_logic; sda_slave : …

2
进行长距离I2C / TWI的最佳方法
我有一个项目需要在很长的距离(30至40米)内进行I²C/ I2C / TWI。我见过有人建议将时钟速率降低到500 Hz左右,以减轻我认为的这么长的线电容的影响?我使用的组件至少需要标准的100 kHz时钟速率。我进行了进一步的研究,并在回答另一个问题的建议中建议使用P82B96电平转换器。在数据表中,他们提供了在甚至100米的线上使用它们的示例: 我遇到了另一种通过adafruit的分线板转换电平的方法,adafruit只是一个带两个上拉电阻的mosfet(bss138)(一个用于每侧/电压)。他们的想法来自来自NXP(AN10441)的应用笔记,其中的两个通道可以像这样使用: 现在我想知道:哪种解决方案是最好的?还是我忽略了什么?而且,5V是否足以确保良好的连接?使用更高的电压(例如12V)会有好处吗?
9 i2c  bus 

1
是否可以仅在PCI Express 1X上使用SMBus?
根据PCI Express上的Wikipedia页面,PCI-e 1X插槽在两个通道上具有18个引脚位置(因此为36个引脚),位置5-9代表SMBus和JTAG。 我想将µC连接为SMBus(本质上是I²C)设备,并且我了解其他消息协议要求,但不确定要与哪些引脚接口。 我可以看到SMCLK,SMDAT,TCK,TDI,TMS,TRST,TDO,WAKE,PERST,PRSNT1,PRSTN2的引脚,以及一堆PCI专用的引脚。我知道PRSNT引脚必须短路,并且该器件有+ 12V和+ 3.3V电源,但其余的有些令人困惑。通常,使用I²C时,我会考虑使用SDA和SCL,但是我在这里看到的引脚看起来更像是我希望从SPI获得的那种接口,具有独立的输入和输出数据引脚以及器件选择。这是JTAG位吗?我是想看看SMCLK / SMDAT吗? 因此,我的问题有两个: 我应该关注哪些引脚? 除了注册PRSNT1 / PRSNT2引脚以外,我还需要做其他事情吗?也就是说,我可以安全地忽略除SMBus接口以外的所有内容吗?实际上,我是否甚至需要将该卡标记为带有这些引脚,还是仅用于使用PCI总线的设备? 道歉,如果这似乎是一个微不足道的问题-与硬件相比,我更擅长于软件。
9 i2c  pcie  smbus 

1
I2C IC,用于零件识别
我正在为主机系统寻找一种方法,以识别某个机械模块C已连接到该系统。该机械模块不需要任何电子设备,但是由于主机兼容性原因(与其他机械组件A,B),在它和主机之间建立了I2C总线(即使我们不需要它) )。 我正在考虑将IC放在机械零件侧的此总线上,以便主机可以探测寻找IC的总线,从而知道该零件是否已连接。 本质上,我正在寻找一种I2C IC,该I2C IC仅具有输入引脚(用于配置其地址),该输入引脚在探测其地址时会进行ACK确认,而没有其他选择。 这些IC是否存在?还是我必须使用一些其他常规IC(例如gpio扩展器),并且在可配置地址引脚上有很多?

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.