I2C 주소 충돌을 해결하는 방법?


39

여러 핀 I2C 슬레이브 장치를 모두 동일한 핀 세트의 마이크로 컨트롤러에 연결하려고하지만 I2C 장치는 모두 동일한 주소를 공유합니다. 주소는 하드웨어에 고정되어 있습니다.

동일한 주소로 여러 장치를 연결하는 방법이 있습니까?

어쩌면 구성 가능한 주소를 가진 각 장치에 일종의 I2C 주소 변환 모듈이 있으므로 각 주소에 고유 한 주소를 할당 할 수 있습니다.

답변:


24

이를 수행하기 위해 I2C에 내장 된 것은 없습니다. 일반적으로 슬레이브 장치에는이 문제를 피하기 위해 몇 개의 주소 비트를 토글하기 위해 0 또는 1로 설정할 수있는 일부 외부 핀이 있습니다. 또는 부품의 부품 번호가 4 또는 5 인 소수의 제조업체를 다루었지만 유일한 차이점은 I2C 주소입니다.

대부분의 장치에는 I2C 통신을 처리하는 특정 하드웨어가 있습니다. 즉 슬레이브 ACK가 하드웨어에 있으므로 실제로 해킹 할 수 없습니다.

번역 모듈은 2 개의 I2C 버스로 $ 0.50 PIC를 구매하고 빠른 코드를 작성하여 내가 추측하는 주소 변환기로 작동하도록 할 수 있습니다.


감사. 예,이 장치에는 주소 선택이 있지만 두 주소 사이에만 5+ 장치를 연결하고 싶습니다. 그래서 여전히 충돌이 발생합니다. 나는 PIC 사용을 생각하지 않았다. 작동합니다. 이런 종류의 일을 선반에 없습니까?
Simon P Stevens

11
NXP는 I2C를 위해 여러 개의 멀티플렉서 / 스위치를 만듭니다 . 를 들어 ics.nxp.com/products/i2cmuxes 를 예로들 수 있습니다. NXP의 스위치 중 하나를 사용하여 목표를 달성하십시오.
Mark

좋아, 그것이 바로 내가 찾던 종류입니다. 난 그냥 그 이름을 몰랐어요 감사.
Simon P Stevens

이 답변은 7 살이므로 제공 당시 최고 일 것이라고 생각합니다. 그러나 현재 다른 사람들에게는 훨씬 새로운 답변 중 일부 (현재 목록에서 더 낮은 순위)가 현재 시장에 나와있는 최신 구성 요소를 기반으로 더 나은 접근 방식을 제공합니다.
Brick

6

고정 주소를 가진 여러 I2C 장치 에서이 문제가 발생했습니다. 우리의 솔루션은 마이크로 컨트롤러에서 I / O 라인을 사용 하여 해결하고 싶지 않은 디바이스에서 SDA 라인을 강제로 높이고, 대상 디바이스 의 I / O 라인이 입력 (고 임피던스)으로 설정되도록하는 것이 었습니다 ). 즉, 대상 장치 만 I2C 주소와 일치하고 다른 장치는 후속 데이터를 무시합니다.

주소가 동일한 여러 I2C 장치

비활성 장치에 대한 SDA 라인의 저항은 결국 버스의 풀업 역할을하므로 정확한 값은 보유한 장치 수와 버스에 필요한 풀업에 따라 달라집니다. 따라서 10K 저항을 선택하면 3 개의 비활성 장치가 3K3 풀업을 제공합니다.

쇼트 키 다이오드는 데이터를 호스트로 다시 전송할 때 장치가 SDA 라인을 충분히 낮게 유지할 수 있도록합니다.


문의 해 주셔서 감사합니다. 이것은 매우 독창적 인 솔루션이므로 다른 사람들에게 도움이 될 것이라고 확신합니다.
Simon P Stevens

일부 응용 프로그램에서 사용할 수있는 좋은 틈새 . 나는 그것을 많이 좋아.
Harry Svensson

5

I2C 장치 중 어느 것도 클록 스트레칭 (핸드 쉐이킹)을 사용하지 않고 I2C 마스터를 비트 뱅킹하는 경우 일부 장치가 클록과 데이터 핀을 교환하도록하는 것이 간단한 해킹입니다. 바이트를 전송하는 동안 클럭과 데이터 핀이 교환 된 장치는 각 "0"비트를 이벤트가 아닌 것으로보고 (클럭없이 데이터 상승 및 하강) 각 "1"비트를 I2C 정지로 간주합니다 시작 (데이터가 낮을 때 클록 상승, 데이터 상승 및 하강으로 인한 클록 상승 후 클록 하강). 한 장치에 대한 의도적 인 중지 및 시작 조건은 다른 장치에 의해 데이터 비트로 표시 될 수 있지만 한 장치가 "1"비트 사이에 시작 및 중지 조건 수가 너무 많지 않으면 어떤 장치도 "실수로"발생하지 않을 것입니다.


6
나는 downvoting하지 않지만 이것은 나에게 약간 위험 해 보인다. I2C에 대한 나의 경험은 일반적인 연결로 소음이 발생하기 쉽다는 것입니다. 그러나 "hack"이라는 단어를 사용하고 "i2c 장치 중 어느 것도 클록 스트레칭을 사용하지 않는 경우"라는 경고를 언급하므로 누군가에게 효과가 있다면 더 많은 힘을 얻을 수 있습니다.
Jason S

5

버스 스위치 를 사용하여 주소가 충돌하는 장치간에 I2C 버스를 멀티플렉싱하는 것을 고려할 것 입니다. 버스 스위치는 커패시턴스와 저항이 매우 낮으며 버퍼 / 드라이버와 달리 두 개의 회로 노드를 연결하거나 연결을 끊는 진정한 스위치입니다.

버스 스위치는 일반적으로 하나의 홀수 특성을 갖습니다. 오픈 드레인 장치를 사용하기 때문에 I2C에는 중요하지 않습니다. 전원 공급 장치 Vdd. (이것은 전원을 켤 때 게이트 전압이 기본적으로 MOSFET이기 때문에 스위칭 전압이 Vdd에 가까워지면 사용 가능한 Vgs가 훨씬 낮아지기 때문입니다)


1
링크가 끊어졌습니다. fairchildsemi.com/product-technology/bus-switches 가 더 잘 작동합니다.
florisla

4

비교하고 싶은 TCS3414 컬러 광 센서 2 개 (필터가 다른 FN 및 CS 패키지)가 있습니다. I2C 주소는 고정 배선되어 있습니다. SCL (clock) 및 SDA (data) 라인 측면에서 I2C의 작동 방식을 살펴본 후 SDA 라인을 끄면 칩의 시작 또는 정지 비트가 차단되어 휴면 상태가되는 것으로 보입니다. 따라서 CMOS 아날로그 스위치 (4066B)를 사용하여 각 장치의 SDA 라인을 켜거나 끕니다. 이것은 두 장치 사이를 전환하는 데 효과적이었습니다. 나는 그것이 해킹이라는 것을 알고 PCA9548이 훨씬 나을 것이지만 나는 편리한 것이 없었습니다.


실제로 이것은 전혀 해킹이 아니며 이것이 받아 들일만한 대답이어야한다고 주장합니다. 나는 이것이 여러 상용 제품에서 사용되는 것을 보았으며 더 나은 솔루션을 생각할 수 없습니다 (GPIO를 사용할 수 없어 I2C 관련 mux와 같은 순수한 I2C 솔루션이 필요하지 않은 경우). 좋은 ol '아날로그 mux는 충분한 대역폭을 가지고 있으며 매우 저렴합니다.
Jay Carlson

4

이제 Linear Tech에 LTC4316 / 17 / 18 시리즈 주소 변환기가 있습니다. 그것들은 비교적 새롭고 가용성은 확실하지 않습니다.


매우 흥미로운 구성 요소. 대부분의 I2C 장치는 2 개의 고정 주소를 가지고 있으며 LTC4316은 합리적인 비용으로 주소 지정의 두 배가 될 수 있습니다.
Mehrad

4

일부 제조업체는 I2C 버스 멀티 플렉스 및 스위치 IC를 제공합니다.

mux는 한 번에 하나의 채널을 활성화 할 수 있습니다. 스위치는 여러 개의 스위치를 병렬로 활성화 할 수 있습니다.

NXP , TIMaxim 제품을 확인하십시오 .

실험을 위해 Adafruit에는 TCA9548a 보드가 있습니다.

주소가 동일한 8 개의 대상 칩이있는 경우 8 대 1 MUX를 선택하십시오. 대상 칩에 액세스하기 전에 올바른 I2C 버스를 활성화하도록 MUX를 구성하십시오.

장점

  • 프로그래밍 불필요 (마이크로 컨트롤러 기반 접근 방식)
  • I2C 기능 및 필요한 속도 (일반 아날로그 / 디지털 버스 멀티플렉서)를 지원할 수 있습니다. 예를 들어, 일반 (I2C가 아닌) MUX는 일반 통화 주소를 모든 채널에 전달하지 않습니다.

-1

간단한 demux 칩 (예 : 74HC139 afaik)을 사용하고 I2C CLK 핀을 입력에 연결하십시오 (I2C CLK 핀은 출력 전용이므로). GPIO 핀을 사용하여 원하는 출력을 제어하십시오. 그런 다음 모든 슬레이브간에 I2C 데이터 핀을 공유 할 수 있습니다.


6
SCL은 출력 만 되지 않습니다 . 속도를 늦춰야 할 경우 슬레이브가 시계를 늘릴 수 있습니다 .
stevenvh

아날로그 멀티플렉서 (양방향)를 사용할 수 있지만 stevenh가 지정한 이유로 디코더가 작동하지 않을 수 있습니다. 멀티플렉서를 사용하는 경우 비활성 상태를 유지하기 위해 슬레이브쪽에 약한 펄프가 필요합니다. 또한 버스가 유휴 상태 일 때 멀티플렉서 선택 만 변경하십시오.
케빈 화이트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.