여러 핀 I2C 슬레이브 장치를 모두 동일한 핀 세트의 마이크로 컨트롤러에 연결하려고하지만 I2C 장치는 모두 동일한 주소를 공유합니다. 주소는 하드웨어에 고정되어 있습니다.
동일한 주소로 여러 장치를 연결하는 방법이 있습니까?
어쩌면 구성 가능한 주소를 가진 각 장치에 일종의 I2C 주소 변환 모듈이 있으므로 각 주소에 고유 한 주소를 할당 할 수 있습니다.
여러 핀 I2C 슬레이브 장치를 모두 동일한 핀 세트의 마이크로 컨트롤러에 연결하려고하지만 I2C 장치는 모두 동일한 주소를 공유합니다. 주소는 하드웨어에 고정되어 있습니다.
동일한 주소로 여러 장치를 연결하는 방법이 있습니까?
어쩌면 구성 가능한 주소를 가진 각 장치에 일종의 I2C 주소 변환 모듈이 있으므로 각 주소에 고유 한 주소를 할당 할 수 있습니다.
답변:
이를 수행하기 위해 I2C에 내장 된 것은 없습니다. 일반적으로 슬레이브 장치에는이 문제를 피하기 위해 몇 개의 주소 비트를 토글하기 위해 0 또는 1로 설정할 수있는 일부 외부 핀이 있습니다. 또는 부품의 부품 번호가 4 또는 5 인 소수의 제조업체를 다루었지만 유일한 차이점은 I2C 주소입니다.
대부분의 장치에는 I2C 통신을 처리하는 특정 하드웨어가 있습니다. 즉 슬레이브 ACK가 하드웨어에 있으므로 실제로 해킹 할 수 없습니다.
번역 모듈은 2 개의 I2C 버스로 $ 0.50 PIC를 구매하고 빠른 코드를 작성하여 내가 추측하는 주소 변환기로 작동하도록 할 수 있습니다.
고정 주소를 가진 여러 I2C 장치 에서이 문제가 발생했습니다. 우리의 솔루션은 마이크로 컨트롤러에서 I / O 라인을 사용 하여 해결하고 싶지 않은 디바이스에서 SDA 라인을 강제로 높이고, 대상 디바이스 의 I / O 라인이 입력 (고 임피던스)으로 설정되도록하는 것이 었습니다 ). 즉, 대상 장치 만 I2C 주소와 일치하고 다른 장치는 후속 데이터를 무시합니다.
비활성 장치에 대한 SDA 라인의 저항은 결국 버스의 풀업 역할을하므로 정확한 값은 보유한 장치 수와 버스에 필요한 풀업에 따라 달라집니다. 따라서 10K 저항을 선택하면 3 개의 비활성 장치가 3K3 풀업을 제공합니다.
쇼트 키 다이오드는 데이터를 호스트로 다시 전송할 때 장치가 SDA 라인을 충분히 낮게 유지할 수 있도록합니다.
I2C 장치 중 어느 것도 클록 스트레칭 (핸드 쉐이킹)을 사용하지 않고 I2C 마스터를 비트 뱅킹하는 경우 일부 장치가 클록과 데이터 핀을 교환하도록하는 것이 간단한 해킹입니다. 바이트를 전송하는 동안 클럭과 데이터 핀이 교환 된 장치는 각 "0"비트를 이벤트가 아닌 것으로보고 (클럭없이 데이터 상승 및 하강) 각 "1"비트를 I2C 정지로 간주합니다 시작 (데이터가 낮을 때 클록 상승, 데이터 상승 및 하강으로 인한 클록 상승 후 클록 하강). 한 장치에 대한 의도적 인 중지 및 시작 조건은 다른 장치에 의해 데이터 비트로 표시 될 수 있지만 한 장치가 "1"비트 사이에 시작 및 중지 조건 수가 너무 많지 않으면 어떤 장치도 "실수로"발생하지 않을 것입니다.
버스 스위치 를 사용하여 주소가 충돌하는 장치간에 I2C 버스를 멀티플렉싱하는 것을 고려할 것 입니다. 버스 스위치는 커패시턴스와 저항이 매우 낮으며 버퍼 / 드라이버와 달리 두 개의 회로 노드를 연결하거나 연결을 끊는 진정한 스위치입니다.
버스 스위치는 일반적으로 하나의 홀수 특성을 갖습니다. 오픈 드레인 장치를 사용하기 때문에 I2C에는 중요하지 않습니다. 전원 공급 장치 Vdd. (이것은 전원을 켤 때 게이트 전압이 기본적으로 MOSFET이기 때문에 스위칭 전압이 Vdd에 가까워지면 사용 가능한 Vgs가 훨씬 낮아지기 때문입니다)
비교하고 싶은 TCS3414 컬러 광 센서 2 개 (필터가 다른 FN 및 CS 패키지)가 있습니다. I2C 주소는 고정 배선되어 있습니다. SCL (clock) 및 SDA (data) 라인 측면에서 I2C의 작동 방식을 살펴본 후 SDA 라인을 끄면 칩의 시작 또는 정지 비트가 차단되어 휴면 상태가되는 것으로 보입니다. 따라서 CMOS 아날로그 스위치 (4066B)를 사용하여 각 장치의 SDA 라인을 켜거나 끕니다. 이것은 두 장치 사이를 전환하는 데 효과적이었습니다. 나는 그것이 해킹이라는 것을 알고 PCA9548이 훨씬 나을 것이지만 나는 편리한 것이 없었습니다.
일부 제조업체는 I2C 버스 멀티 플렉스 및 스위치 IC를 제공합니다.
mux는 한 번에 하나의 채널을 활성화 할 수 있습니다. 스위치는 여러 개의 스위치를 병렬로 활성화 할 수 있습니다.
실험을 위해 Adafruit에는 TCA9548a 보드가 있습니다.
주소가 동일한 8 개의 대상 칩이있는 경우 8 대 1 MUX를 선택하십시오. 대상 칩에 액세스하기 전에 올바른 I2C 버스를 활성화하도록 MUX를 구성하십시오.
장점
간단한 demux 칩 (예 : 74HC139 afaik)을 사용하고 I2C CLK 핀을 입력에 연결하십시오 (I2C CLK 핀은 출력 전용이므로). GPIO 핀을 사용하여 원하는 출력을 제어하십시오. 그런 다음 모든 슬레이브간에 I2C 데이터 핀을 공유 할 수 있습니다.