SPI 또는 I2C 인터페이스 사용을 결정할 때 고려해야 할 사항은 무엇입니까?
이 가속도계 / 자이로 브레이크 아웃 보드는 각 인터페이스마다 하나씩 두 가지 모델로 제공됩니다. Arduino 프로젝트에 쉽게 통합 할 수 있습니까?
SPI 또는 I2C 인터페이스 사용을 결정할 때 고려해야 할 사항은 무엇입니까?
이 가속도계 / 자이로 브레이크 아웃 보드는 각 인터페이스마다 하나씩 두 가지 모델로 제공됩니다. Arduino 프로젝트에 쉽게 통합 할 수 있습니까?
답변:
요약
I2C는 SDA 라인에 양방향 데이터가있는 버스 시스템입니다. SPI는 별도의 라인 (MOSI 및 MISO)에서 데이터를 입력 및 출력하는 지점 간 연결입니다.
본질적으로 SPI 는 한 쌍의 시프트 레지스터로 구성되며, 데이터를 한 시프트 레지스터에 클록 인하 고 다른 하나는 데이터를 클록 아웃합니다. 일반적으로 데이터는 8 클럭 펄스마다 연속해서 바이트 단위로 작성되지만 SPI 요구 사항은 아닙니다. 원하는 경우 16 비트 또는 13 비트의 워드 길이를 가질 수도 있습니다. I2C에서 SPI의 시작 시퀀스에 의해 동기화가 수행되는 동안 SS가 높을 때 수행됩니다 (SS는 활성이 낮음). 클럭 펄스가 몇 개인 지 결정합니다. 13 비트 워드를 사용하면 SS는 13 클럭 펄스 후 마지막 클록을 비트 단위로 래치합니다.
양방향 데이터는 두 개의 개별 라인에 있기 때문에 인터페이스하기가 쉽습니다.
tcrosley와 마찬가지로 SPI는 I2C보다 훨씬 높은 주파수에서 작동 할 수 있다고한다.
I2C 는 조금 더 복잡합니다. 버스이기 때문에 장치를 처리하는 방법이 필요합니다. 통신은 고유 한 시작 순서로 시작합니다. 클럭 (SCL)이 높으면 데이터 라인 (SDA)이 낮게 당겨지고 나머지 통신 데이터는 클럭이 낮을 때만 변경 될 수 있습니다. 이 시작 순서는 각 통신을 동기화합니다.
통신은 어드레싱을 포함하므로, 임의의 수의 장치 (최대 127 개)에 2 개의 라인 만이 필요하다.
편집
데이터 라인이 양방향이라는 것은 명백하지만, 이것은 클럭 라인에도 해당됩니다. 슬레이브는 버스 속도를 제어하기 위해 클럭 을 늘릴 수 있습니다 . 이로 인해 I2C는 레벨 시프 팅 또는 버퍼링에 덜 편리합니다. 표준 모드의 SPI 라인은 모두 단방향입니다.
각 바이트 (주소 또는 데이터)가 전송 된 후 수신기는 SDA에 확인 펄스를 넣어 수신을 확인해야합니다. 마이크로 컨트롤러에 I2C 인터페이스가있는 경우 자동으로 처리됩니다. 마이크로 컨트롤러가 지원하지 않는 경우 여전히 비트 뱅킹을 수행 할 수 있지만 읽기 및 읽기에 I / O 핀을 사용하지 않는 한 I / O 핀을 각 승인 또는 읽기 데이터에 대한 출력에서 입력으로 전환해야합니다. 쓰기위한 것.
400kHz에서 표준 I2C는 SPI보다 훨씬 느립니다. 1MHz에서 작동하는 고속 I2C 장치가 있으며 여전히 20MHz SPI보다 훨씬 느립니다.
(편집 : 분명히하기 위해 Olin이 올바르게 지적한대로 I2C / SPI 장치의 보드 간 사용으로 인해 발생하는 신호 무결성과 관련하여 다음과 같은 많은 문제가 발생합니다.)
와이어 수를 줄이려는 제약이 없다면 (우리는 각각의 추가 접점이 다소 비싸지 않은 밀봉 된 커넥터가있는 하나의 프로젝트를 가졌음) 가능한 경우 I2C를 피하고 SPI를 고수하십시오.
SPI는 하드웨어 및 소프트웨어별로 처리하기가 매우 쉽습니다. 하드웨어에는 Master In Slave Out (MISO 또는 SOMI)과 Master Out Slave In (MOSI 또는 SIMO), 마스터에 의해 생성 된 공유 클럭 및 장치 당 하나의 칩 선택이라는 두 개의 공유 데이터 라인이 있습니다. CS 라인은 낮아지고, 클록 사이클은 본질적으로 입력 비트에서 시프트되고, 트랜잭션이 완료 될 때까지 출력 비트를 시프트하여 CS 라인은 높아집니다. CS 회선이 높으면 슬레이브 장치가 통신하지 않습니다. CLK 및 MOSI 회선을 무시하고 다른 사람이 사용할 수 있도록 MISO 핀을 높은 임피던스 상태로 만듭니다.
여러 SPI 장치를 사용하는 마이크로 컨트롤러가 있고 내장 된 SPI 주변 장치가있는 경우 마이크로 컨트롤러의 CS 출력을 디멀티플렉서 (예 : 74HC138)로 보내고 주소 라인을 제어하여 SPI 트랜잭션간에 장치를 선택하십시오. 출력을 위해 대기하도록 레지스터에 단어를 쓰고 CS 핀이 높으면 다시 읽습니다.
SPI 신호는 모두 단방향이므로 버퍼링 할 수 있고 디지털 아이솔레이터를 사용하여 격리 장벽을 넘어서 사용할 수 있으며 LVDS와 같은 라인 드라이버를 사용하여 보드 간 전송이 가능합니다. 걱정해야 할 것은 왕복 전파 지연 뿐이며 최대 주파수를 제한합니다.
I2C는 완전히 다른 이야기입니다. 배선 관점에서 보면 훨씬 간단하지만 두 개의 와이어 SCL과 SDA 만 있으면이 두 라인은 외부 풀업과 함께 오픈 드레인 장치를 사용하는 공유 양방향 라인입니다. 장치 주소를 전송하여 시작하는 I2C 프로토콜이 있으므로 각 장치에 고유 한 주소가있는 경우 여러 장치를 사용할 수 있습니다.
하드웨어 관점에서 볼 때 잡음이 심한 시스템에서는 I2C를 사용하기가 매우 어렵습니다. I2C 라인을 버퍼링하거나 격리하려면 이국적인 IC에 의존해야합니다. 그렇습니다.하지만 많지는 않습니다. 우리는 하나의 프로젝트에 하나를 사용하고 하나의 아이솔레이터를 사용할 수는 있지만 실현할 수는 없다는 것을 깨달았습니다. 직렬로 두 개를 사용하십시오. 작은 전압 강하를 사용하여 어느 쪽이 사물의 끝인지 알아 내고 두 시리즈 강하가 두 개였습니다.
I2C의 로직 레벨 임계 값은 Vcc에 따라 달라 지므로 동일한 시스템에서 3V / 3.3V 및 5V 장치를 사용하는 경우 매우주의해야합니다.
1 ~ 2 피트 이상의 케이블을 사용하는 모든 신호는 케이블 커패시턴스에 대해 걱정해야합니다. 멀티 컨덕터 케이블의 경우 100pf / meter의 용량이 일반적이 아닙니다. 따라서 여분의 커패시턴스를 올바르게 처리하고 상승 시간 요구 사항을 충족 할 수 있도록 버스 속도를 낮추거나 풀업 저항을 사용해야합니다.
따라서 잘 설계되었다고 생각되는 시스템이 있고 대부분의 신호 무결성 문제를 처리 할 수 있으며 노이즈는 거의 없지만 여전히 존재한다고 가정 해 봅시다. 무엇을 걱정해야합니까?
처리하기 위해 준비해야하는 많은 오류 조건이 있습니다.
슬레이브 장치는 특정 바이트를 인식하지 못합니다. 이를 감지하고 통신 순서를 중지했다가 다시 시작해야합니다. (SPI를 사용하면 일반적으로 전송 한 데이터를 오류없이 수신했는지 확인할 수 있습니다.)
슬레이브 장치에서 한 바이트의 데이터를 읽는 중이며 클럭 라인의 노이즈로 인해 장치가 "최면 상태"입니다. 해당 바이트를 읽기 위해 필요한 8 개의 클럭을 보냈지 만 노이즈로 인해 슬레이브 장치는이를 생각합니다. 7 개의 클럭을 수신했으며 여전히 데이터 라인에서 0을 전송하고 있습니다. 장치가 8 번째 클럭을 수신 한 경우 마스터가 ACK 또는 NACK 비트를 전송하기 위해 데이터 라인을 올리거나 내릴 수 있거나 마스터가 중지 (P) 조건을 전송할 수 있도록 데이터 라인을 높게 해제했을 것입니다. 그러나 슬레이브는 여전히 데이터 라인을 낮게 잡고 다른 시계를 헛되이 기다리고 있습니다. 마스터가 추가 클럭을 시도 할 준비가되지 않으면 I2C 버스는 교착 상태에 빠질 것입니다. 일반적인 ACK / NACK 조건을 처리하는 여러 마이크로 컨트롤러를 사용했지만
마스터가 한 슬레이브 장치에 데이터를 쓰고 있고 다른 슬레이브가 장치 주소를 잘못 해석하여 전송 된 데이터가 그 데이터를위한 것이라고 생각하는 경우가 가장 끔찍한 경우입니다. 이 때문에 때때로 레지스터가 잘못 설정된 I2C 장치 (I / O 확장기)가있었습니다. 이 경우를 감지하는 것은 거의 불가능하며 노이즈에 강건하려면 모든 레지스터를 주기적으로 설정해야하므로이 오류가 발생하면 최소한 짧은 시간 후에 오류가 해결됩니다. (SPI에는이 문제가 없습니다. CS 회선에 글리치가 발생하면 오래 지속되지 않으며 잘못된 슬레이브 장치가 실수로 데이터를 읽지 못하게됩니다.)
오류 감지 (CRC 코드)가있는 경우 이러한 조건을 프로토콜에서 올바르게 처리 할 수 있지만 이러한 장치가있는 장치는 거의 없습니다.
이러한 조건을 처리하려면 I2C 마스터 장치에 복잡한 소프트웨어를 구축해야한다는 것을 알게되었습니다. 제 생각에, 배선 제약으로 인해 SPI가 아닌 I2C를 사용하지 않으면 가치가 없습니다.
SparkFun의 장치 용 브레이크 아웃 보드는 실제로 I2C 버전 전용입니다 (MPU-6500). MPU-6000 버전은 동일한 칩에 SPI 및 I2C 인터페이스를 모두 가지고 있으며 SparkFun에 해당 칩이있는 보드가 없습니다. 따라서 특정 보드를 사용하려는 경우 I2C를 사용하는 것으로 제한됩니다. 그러나 다음과 같은 이유로 귀하의 상황에서 I2C를 사용하는 것이 좋습니다.
일반적으로, I2C 버스는 SPI 버스보다 하드웨어 관점에서 사용하기 쉽다는 것을 알 수 있습니다. I2C는 2 선 버스 (SCL / SDA)입니다.
SCL – Serial clock.
SDA – Serial data (bidirectional).
SPI는 4 선 버스 (SCLK / MOSI / MISO / CS)입니다.
SCLK– Serial clock.
MOSI – Master-out, Slave-in. Data from the CPU to the peripheral.
MISO – Master-in, Slave out. Data from the peripheral back to the CPU.
CS – Chip select.
하나의 I2C 버스에 여러 장치를 연결할 수 있습니다. 각 장치에는 칩에 내장 된 고유 한 주소 세트가 있습니다. 주소는 실제로 모든 명령의 첫 번째 바이트 (읽기 / 쓰기 비트와 함께)로 버스를 통해 브로드 캐스트됩니다. 다른 오버 헤드와 함께 동일한 기능을 위해 I2C 버스와 SPI를 통해 더 많은 비트를 전송해야합니다.
다른 종류의 장치 (메모리, I / O, LCD 등)는 다른 주소 범위를 갖습니다. 시스템에서 PCF8574 I / O 익스팬더와 같이 일반적으로 두 번 이상 사용되는 일부 장치는 높거나 낮게 묶어 낮은 비트를 지정할 수있는 하나 이상의 주소 라인 (PCF8574의 경우 AD0-2)을 사용합니다. 주소 MPU-6500에는 이러한 주소 라인 (AD0)이 하나 있으므로 동일한 시스템에서 두 개를 사용할 수 있습니다.
SPI 버스에 여러 장치를 가질 수도 있지만 각 장치에는 자체 칩 선택 (CS) 회선이 있어야합니다. 따라서 4- 와이어 설명은 약간 잘못된 것으로, 실제로는 3 선 인터페이스 + 장치 당 1 개의 추가 와이어입니다. 나는 Arduino 시리즈 보드에 대해 경험이 없지만 Arduino에서 SPI를 사용하는 것이 더 어려울 것이라고 생각합니다. 많은 칩 선택 라인이 필요하면 다양한 쉴드에서 사용되는 공통 핀 할당으로 번거로울 수 있기 때문입니다. .
나는 대부분의 Arduino 보드가 5V에서 작동하고 일부 새로운 보드는 3.3V에서 작동한다고 생각합니다. MPU-6500은 3.3v에서 실행됩니다. 5v CPU의 I2C 버스에 대한 최소 입력 "고"전압이 3v 이하인 경우 버스가 개방되어 있으므로 SCL 및 SDA 라인에서 3.3V에 10K 풀업 저항을 제공하면 레벨 변환 문제를 피할 수 있습니다. 수집기. CPU에서 5v 내부 풀업이 비활성화되어 있는지 확인하십시오.
그러나 ATmega2560에 대한 데이터 시트 (ADK 5v Arduino를 예로 사용)에 대한 데이터 시트를 확인했으며 최소 입력 '높은'전압은 0.7 * Vcc 또는 3.5v (3.3v보다 큼)이므로 일종의 활성 레벨이 필요합니다. 칩의 5V 및 3.3V 측 모두에 풀업 저항이 필요한 TI PCA9306 은 단일 수량으로 78 센트에 불과하다.
그렇다면 왜 I2C보다 SPI를 선택합니까? 주로 SPI가 훨씬 더 빠르게 실행될 수 있기 때문에 (경우에 따라 최대 10MHz). I2C는 일반적으로 400KHz로 제한됩니다. 그러나 MPU-6050 / 6000 가속도계의 경우 실제로 문제가되지 않습니다. I2C의 경우 400KHz, SPI의 경우 1MHz에 불과하므로 그다지 큰 차이는 없습니다.
일반적으로 SPI는 더 빠른 버스입니다. 클럭 주파수는 MHz 범위에있을 수 있습니다. 그러나 SPI는 양방향 통신을 위해 최소 3 개의 회선이 필요하며 버스의 각 장치에 대해 추가 슬레이브 선택이 필요합니다.
I2C는 보유한 장치 수에 관계없이 (물론 한도 내에서) 2 줄만 필요합니다. 그러나 속도는 kHz 범위에 있습니다 (일반적으로 100-400kHz).
오늘날 대부분의 마이크로 컨트롤러는 두 버스 모두에 대해 하드웨어를 지원하므로 둘 다 사용이 간단합니다.
I2C is designed for on-board applications.
분명히 I2C 장치 제조업체는 동의하지 않습니다. TMP100을 가져 가라 . 제품 페이지가 명시 적으로 상태 : The TMP100 and TMP101 are ideal for extended temperature measurement in a variety of communication, computer, consumer, environmental, industrial, and instrumentation applications.
동일은 마찬가지입니다 TMP75
SPI는 I2C보다 훨씬 빠르게 실행될 수 있습니다 (일부 SPI 장치는 60MHz 이상입니다. "공식"I2C 사양이 1MHz 이상의 장치를 허용하는지 여부는 알 수 없음). 두 프로토콜 중 하나를 사용하여 슬레이브 장치를 구현하려면 하드웨어 지원이 필요하지만 "소프트웨어 비트 뱅"마스터를 쉽게 구현할 수 있습니다. 상대적으로 최소의 하드웨어를 사용하면 호스트가 추가 핸드 셰이 킹 와이어 없이도 한 번에 최대 500us 동안 버스를 무시하기로 결정할 경우에도 올바르게 작동하는 I2C 호환 슬레이브를 구성 할 수 있습니다. 그러나 하드웨어를 지원하더라도 안정적인 SPI 작동을 위해서는 일반적으로 핸드 셰이크 와이어를 추가하거나 호스트가 슬레이브의 최악의 응답 시간과 동일한 각 바이트 후에 지연을 "수동으로"추가해야합니다.
만약 내가 진실을 가지고 있다면, 컨트롤러의 SPI 지원에는 총 3 개의 단방향 와이어 (클럭 및 MOSI [마스터]를 사용하여 핸드 셰이 킹 및 웨이크 업 기능이있는 컨트롤러간에 8 비트 투명 양방향 데이터 전송을 제공하는 몇 가지 간단한 추가 기능이 포함됩니다. 마스터에서 -out-slave-in], 슬레이브에서 MISO [master-in-slave-out]). 이에 비해 "스톡"SPI 포트가있는 마이크로 컨트롤러 간의 효율적이고 안정적인 통신은 두 프로세서가 임의의 시간 동안 독립적으로 지연 될 수있는 경우 훨씬 더 많은 전선 (Chip-Select, Clock, MISO 및 MOSI)을 사용해야합니다. 슬레이브가 데이터를 전송하기 위해 비동기식으로 데이터 전송을 시작할 수있는 경우 (예 : 누군가가 버튼을 눌렀 기 때문에) 다른 와이어를 "깨우기"로 사용해야합니다.
I2C는 나의 "개선 된"SPI가 가질 수있는 모든 능력을 제공하지는 않지만 SPI가 부족한 내장 핸드 쉐이킹 기능을 제공하며, 많은 구현에서 마스터가 소프트웨어 비트 뱅. 프로세서 간 통신을 위해서는 SPI가 제공 할 수있는 것보다 더 빠른 속도가 필요하고 여분의 핀을 사용할 수있는 경우를 제외하고 SPI보다 I2C를 강력히 권장합니다. 핀 수가 적어야하는 프로세서 간 통신의 경우 UART에서 권장 할 사항이 많습니다.
이 질문은 여기서 훌륭한 답변으로 철저히 탐구되었지만 칩 제조업체의 관점에서 볼 수있는 I 2 C 에 대한 관점이 하나 더있을 것 입니다.
I 2 C의 전기 인터페이스는 개방형 수집기 입니다. 이제 숨을 쉬고 의미를 생각하십시오. I 2 C를 사용 하여 버스의 작동 전압에 완전히 독립적 인 칩을 설계 할 수 있습니다. 내가 할 수있는 일은 SDA 라인을 낮게 당기고 SCL과 SDA의 전압을 접지 기준 임계 전압과 비교하여 선택할 수 있습니다. 그리고 정상적인 하이 사이드 보호 구조를 제외하고 다른 구조로 교체하면 나머지 시스템과 무관하게 자체 생명을 유지할 수있는 칩을 만들 수 있습니다-SCL, SDA는 칩에 전류를 공급하지 않습니다. 확실히 그 핀에 전류를 공급하지 않습니다. 그렇기 때문에 실시간 시계 및 기타 저전력 제품을위한 멋진 버스입니다.
다른 답변에서 언급하지 않은 한 가지는 I2C가 동일한 버스에서 여러 마스터를 지원한다는 것입니다. 양방향 통신이 필요하고 폴링 기반 방법을 사용하지 않으려는 경우 I2C는 작업을 수행합니다.
더 먼 거리에서 CAN은 동일한 기능을 가지며 더욱 강력합니다. 그러나 CAN은 하드웨어 지원과 트랜시버를 필요로하는 비동기 프로토콜이므로 저렴한 시스템에서는 옵션이 아닐 수 있습니다.
동기화 클럭이 상승 할 때마다 SPI 프로토콜을 사용하여 비트를 장치에 직접 씁니다. xnor 논리 회로를 사용하여 메모리에서 "홈 메이드"주소를 일치시켜 원하는 장치를 i2c 장치 인 것처럼 선택할 수 있습니다.
i2c는 장치의 형식으로 저작 회로를 통합하고 있으며 표준 등은 복잡하고 다릅니다. spi를 사용하면 spi 메모리를 사용하여 화면에 비디오를 표시 할 수 있지만 i2c는 표시 할 수 없습니다.