SPI 또는 I2C를 고려할 때의 타협?


117

SPI 또는 I2C 인터페이스 사용을 결정할 때 고려해야 할 사항은 무엇입니까?

이 가속도계 / 자이로 브레이크 아웃 보드는 각 인터페이스마다 하나씩 두 가지 모델로 제공됩니다. Arduino 프로젝트에 쉽게 통합 할 수 있습니까?

http://www.sparkfun.com/products/11028

여기에 이미지 설명을 입력하십시오


13
I2C와 SPI에는 장점이 있습니다. I2C는 설정하기가 더 복잡하며, 일단 안정되면 쉽게 확장 할 수 있습니다 (버스 배선이 너무 길거나 길지 않은 경우). SPI는 설치가 용이합니다. 필요한 경우 매우 쉽게 비트 뱅킹 할 수 있습니다. 확장은 모든 칩 선택과 함께 I / O를 사용합니다. 고급스러운 I / O 및 커넥터 공간이 있고 버스가 필요하지 않은 경우 항상 SPI를 사용합니다.
한스

I2C는 어떻게 더 복잡합니까? 다른 마이크로 (소형 PIC 및 알맞은 크기의 ARM)에서 두 버스를 모두 사용했으며 모든 경우에 I2C 설정이 더 간단했습니다 (즉, 적은 레지스터 작성). SPI는 클록 극성 및 데이터 샘플링 옵션으로 인해 더 복잡합니다.
Armandas

6
@Armandas-안 돼요! SPI에는 클록 / 데이터 극성에 대한 4 가지 가능한 모드가 있으며 그 중 두 가지가 우세합니다. 거의 모든 SPI 장치는 클록의 하강 에지에서 MISO 출력을 업데이트하고 클록의 상승 에지에서 MOSI 입력을 읽습니다. 데이터 시트를보고 몇 분 안에 어느 것을 알아낼 수 있습니다. 실수로 잘못된 모드를 선택하면 오실로스코프 트레이스를 보면 신속하게 파악할 수 있습니다. SPI 데이터 오류는 드물며 I2C처럼 이상한 상태에 빠지지 않습니다.
Jason S

6
한 번 ARM 프로세서에서 I2C 드라이버를 작성해야했기 때문에 I2c가 훨씬 더 복잡하다고 말합니다. 나는 NXP 문서의 상태 시스템을 따랐으며 길이는 약 20 주였습니다. 마지막 바이트를 읽거나 쓰는 등의 승인을 알아내는 데 상당한 시간이 걸렸습니다. SPI와 관련하여 이러한 문제가 없었습니다. 클럭 및 데이터를 정렬해야합니다.
Hans

1
@JonL는 잘 솔직히 내가 OP를 사용하고자하는 특정 브레이크 아웃 보드의 문제를 논의하고, 지적 유일한 사람입니다 이후는 것으로, 지금까지 완전한 답변을 제공 한 유일한 하나입니다 하지 가능 SPI 및 I2C,하지만 I2C 모두 - 그래서 그는 그가이 특정 보드를 사용하고자하는 경우 I2C를 사용 할 수 있습니다. 다른 사람들은 인터페이스하기가 더 쉬운 인터페이스 (SPI 또는 I2C) 만 다루었습니다.
tcrosley

답변:


98

요약

  • SPI가 더 빠릅니다.
  • 마이크로 컨트롤러에 I2C 컨트롤러가없는 경우 I2C는 더 복잡하고 사용하기 쉽지 않습니다.
  • I2C는 2 줄만 필요합니다.

I2C는 SDA 라인에 양방향 데이터가있는 버스 시스템입니다. SPI는 별도의 라인 (MOSI 및 MISO)에서 데이터를 입력 및 출력하는 지점 간 연결입니다.

본질적으로 SPI 는 한 쌍의 시프트 레지스터로 구성되며, 데이터를 한 시프트 레지스터에 클록 인하 고 다른 하나는 데이터를 클록 아웃합니다. 일반적으로 데이터는 8 클럭 펄스마다 연속해서 바이트 단위로 작성되지만 SPI 요구 사항은 아닙니다. 원하는 경우 16 비트 또는 13 비트의 워드 길이를 가질 수도 있습니다. I2C에서 SPI의 시작 시퀀스에 의해 동기화가 수행되는 동안 SS가 높을 때 수행됩니다 (SS는 활성이 낮음). 클럭 펄스가 몇 개인 지 결정합니다. 13 비트 워드를 사용하면 SS는 13 클럭 펄스 후 마지막 클록을 비트 단위로 래치합니다.
양방향 데이터는 두 개의 개별 라인에 있기 때문에 인터페이스하기가 쉽습니다.

NN+3N+2

tcrosley와 마찬가지로 SPI는 I2C보다 훨씬 높은 주파수에서 작동 할 수 있다고한다.

I2C 는 조금 더 복잡합니다. 버스이기 때문에 장치를 처리하는 방법이 필요합니다. 통신은 고유 한 시작 순서로 시작합니다. 클럭 (SCL)이 높으면 데이터 라인 (SDA)이 낮게 당겨지고 나머지 통신 데이터는 클럭이 낮을 때만 변경 될 수 있습니다. 이 시작 순서는 각 통신을 동기화합니다.
통신은 어드레싱을 포함하므로, 임의의 수의 장치 (최대 127 개)에 2 개의 라인 만이 필요하다.

편집
데이터 라인이 양방향이라는 것은 명백하지만, 이것은 클럭 라인에도 해당됩니다. 슬레이브는 버스 속도를 제어하기 위해 클럭늘릴 수 있습니다 . 이로 인해 I2C는 레벨 시프 팅 또는 버퍼링에 덜 편리합니다. 표준 모드의 SPI 라인은 모두 단방향입니다.

각 바이트 (주소 또는 데이터)가 전송 된 후 수신기는 SDA에 확인 펄스를 넣어 수신을 확인해야합니다. 마이크로 컨트롤러에 I2C 인터페이스가있는 경우 자동으로 처리됩니다. 마이크로 컨트롤러가 지원하지 않는 경우 여전히 비트 뱅킹을 수행 할 수 있지만 읽기 및 읽기에 I / O 핀을 사용하지 않는 한 I / O 핀을 각 승인 또는 읽기 데이터에 대한 출력에서 ​​입력으로 전환해야합니다. 쓰기위한 것.

400kHz에서 표준 I2C는 SPI보다 훨씬 느립니다. 1MHz에서 작동하는 고속 I2C 장치가 있으며 여전히 20MHz SPI보다 훨씬 느립니다.


7
아직 I2C 전문가가 아니더라도 사용할 수있는 방식으로 적절한 오류 감지 및 복구를 처리해야하는 모든 I2C 사례를 처리하는 마이크로 컨트롤러를 만나지 못했습니다. SDA는 완전한 pain./ 인 로우로 유지되고있을 때 난 항상 누락 된 시계 케이스를 처리하기 위해 일시적으로 bitbanging 수있는 "스마트"I2C 주변에서 다시 드롭 다운 했어
제이슨 S

(그러나 나머지 답변에 동의 한 이후 +1)
Jason S

주변에는 I2C 장치가 3.4MHz로 작동하지만 느린 장치와 결합 할 수 있는지 확실하지 않습니다 (모든 장치가 버스 주소 지정을 따를 수 있어야 함). 또한 3.4MHz I2C의 타이밍은 약간 다르다고 생각합니다.
Hans

@Hans-HS I2C는 일반적인 400kbit 장치와 하위 호환되는 것으로 보입니다 . 솔직히 말해서, (연구없이) HS (아직)를 지원하는 마이크로 컨트롤러를 본 적이 없었기 때문에 언급하고 싶지 않았습니다.
stevenvh

@stevenvh : 일부 컨트롤러의 2- 와이어 구현 (예 : Cypress PSOC)은 SCK가 내부 클럭의 적어도 한주기 또는 두주기 동안 래치되기 전에 SCK가 낮아야하며 제대로 작동하지 않을 것을 요구합니다. 시스템 클럭 펄스없이 I2C 시작 조건을 감지하고 클럭 스트레치 할 수없는 이유를 모르겠지만 이러한 동작은 이러한 칩이 낮은 시스템 클럭 속도로 실행될 때 버스의 모든 I2C 트랜잭션이 천천히 달려라). 400MHz에서도 3MHz로 실행되는 PSOC에 비해 너무 빠르다.
supercat

39

(편집 : 분명히하기 위해 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를 사용하지 않으면 가치가 없습니다.


5
IIC에 대한 귀하의 종교적 혐오는 여기에 없습니다. IIC와 SPI는 모두 자신이하는 일에 능숙하며 각자의 자리를 가지고 있습니다. IIC에 대한 귀하의 반대 의견의 대부분은 부적절한 사용으로 인한 것입니다. IIC는 전원 공급 장치 산업에서 지능적 공급 장치를 제어하기 위해 일상적으로 사용되지만 온보드 전용으로 생각해야합니다. IIC 버퍼를 원한다면 IIC가 올바른 해결책이 아니라는 강력한 증거입니다. 그러나 IIC는 같은 보드에있는 저속 장치에 매우 적합합니다.
Olin Lathrop

2
I2C의 로직 레벨 임계 값은 Vcc에 따라 다르므로 동일한 시스템에서 3V / 3.3V 및 5V 장치를 사용하는 경우 매우주의해야합니다 . 아니요, 잘못되었습니다. IIC 로직 임계 값은 고정 전압입니다. 당신은 하찮게 3.3 V로 라인을 잡아 당겨 5 V와 3.3 V 시스템을 혼합 할 수 있습니다
올린의 Lathrop을

5
그것은 I2C의 종교적 혐오가 아니라 I2C의 실질적인 혐오입니다. 온보드 시스템을 사용하면 훨씬 쉬워 질 것입니다. 의미가있을 때 사용하지만 소프트웨어 비용이 추가되고 너무 많은 하드웨어 엔지니어가 소프트웨어 문제를 야기하는 트레이드 오프에 대해 논의하지 않고 I2C 장치를 보드에 고정시키기 만하면됩니다.
Jason S

3
IIC는 전기적으로 구현하기가 조금 더 쉽고 펌웨어에서 SPI가 조금 더 쉽습니다. 그러나 두 가지 측면 모두에서 매우 쉽고 간단합니다.
Olin Lathrop

2
@Olin-고정 1.5V 임계 값은 과거에 사용 된 것으로 보이지만 최신 버전의 스펙 임계 값에 따르면 실제로 0.3Vcc 및 0.7Vcc입니다. 사양에서 인용 한 내용은 레거시 장치의 경우 1.5V입니다.
stevenvh

16

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에 불과하므로 그다지 큰 차이는 없습니다.


3
I2C보다 SPI를 선택해야하는 또 다른 이유 : 모든 라인은 단방향이므로 레벨 시프터와 같은 것이 조금 더 쉽습니다.
markrages

3
I2C가 SPI보다 쉬운가요?! I2C에서 더 쉬운 유일한 것은 모든 것을 함께 연결할 수있는 연결성입니다. 그렇지 않으면 I2C에서 신호 무결성이 더 어려워지고 I2C에서 강력한 소프트웨어 구현이 훨씬 더 어려워집니다.
Jason S

2
@JasonS, I2C를 사용하여 수십 개의 임베디드 소프트웨어 프로젝트를 완료했으며 게시물에서 언급 한 잠금 문제를 결코 겪지 않았습니다. 나는 당신의 나쁜 경험으로 인해 당신이 그것을 좋아하지 않는 것을 이해할 수 있습니다. 저는 현재 I2C DAC를 사용하여 오디오를 출력하는 동시에 SPI를 통해 SD 카드에서 다음 데이터 버퍼를 읽는 제품을 시장에 출시했습니다. 잘 작동합니다. 버스 경합이 발생하고 오디오가 끊어 졌기 때문에 DAC와 SD 카드 모두에 SPI를 사용할 수 없었습니다. 마이크로 (하이 엔드)에는 SPI와 I2C 포트가 하나만 있습니다.
tcrosley

1
오디오를 I2C DAC로 출력 할 수 있다는 것에 깊은 감명을 받았습니다! (최대 클럭 속도는 얼마입니까?) 단기적으로 온보드 IC를 사용하는 경우 잠금 상태가 발생할 가능성은 매우 작지만 여전히 존재합니다. (또한 I2C에 데이터를 쓰는 경우에는 절대로 데이터가 손실되지 않습니다. 누락 된 / 추가 클럭이라고 생각되는 것을 영원히 기꺼이 기다릴 장치에서 읽어야합니다.
Jason S

1
@JasonS, 오디오는 음성 품질, 8KHz입니다. 각 128 비트 인터럽트를 사용하여 각 16 비트 샘플을 출력합니다. I2C도 자체 인터럽트로 실행됩니다. 여가 시간은 SD 카드의 데이터를 읽는 데 사용됩니다. 쓰기 작업시 잠금이 발생하지 않는 것이 좋습니다. ADC를 제외하고는 일반적으로 출력 장치에 I2C를 사용했습니다. 그러나 Wii 리모컨과 Wii Nunchuck (3 '케이블을 통해) 사이의 읽기 전용 인터페이스 (2 개의 버튼, 가속도계 및 조이스틱)가 400KHz에서 I2C라는 것을 알고 있습니까? 웹에서이 장치 인터페이스를 해킹하는 많은 정보가 있습니다.
tcrosley

15

일반적으로 SPI는 더 빠른 버스입니다. 클럭 주파수는 MHz 범위에있을 수 있습니다. 그러나 SPI는 양방향 통신을 위해 최소 3 개의 회선이 필요하며 버스의 각 장치에 대해 추가 슬레이브 선택이 필요합니다.

I2C는 보유한 장치 수에 관계없이 (물론 한도 내에서) 2 줄만 필요합니다. 그러나 속도는 kHz 범위에 있습니다 (일반적으로 100-400kHz).

오늘날 대부분의 마이크로 컨트롤러는 두 버스 모두에 대해 하드웨어를 지원하므로 둘 다 사용이 간단합니다.


4
@ 제이슨 : IIC에 대해 약간의 편견이있는 것 같지만, 다른 사람들을 고려하여 불공평 한 것은 불공평합니다. IIC와 SPI는 각각 자체 주름이있는 "쉬운"상태입니다. SPI에는 추가 라인이 필요하므로 쉽지 않습니다. IIC는 조금 더 복잡하지만, 때때로 수행했던 모든 펌웨어 구현을 수행하는 것은 여전히 ​​쉽습니다. 그렇게 많은 코드를 사용하지는 않습니다. 둘 다 자신의 자리를 가지고 있으며 둘 다 자신이하는 일을 아는 사람에게는 영향을 미치지 않을 정도로 충분히 쉽습니다.
Olin Lathrop

5
@Jason : 방금 확인했는데 8 비트 PIC에서 IIC의 펌웨어 구현을 위한 일반 IIC 코드 는 311 줄에 불과하며 그 중 절반 이상이 주석입니다. 시작, 넣기, 넣기, 멈춤 등의 루틴 수준에서 IIC 버스에 대한 절차 적 인터페이스를 제공합니다. 간단한 EEPROM을 구동하기 위해 호출하는 모듈은 272 라인이며, 아마도 1/2 주석이며 기본 데이터, UART 디버그 인터페이스 등과 같은 높은 수준의 관리가 포함됩니다. SPI보다 무의미합니다.
Olin Lathrop

2
@Andrew Kohlsmith-- 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
코너 늑대

5
@FakeName 잘못되었습니다. 13 년 동안 산업용 전력 전자 장치를 사용했습니다. (대형 3 상 mtor의 시작 및 모니터링은 매우 시끄러운 환경입니다.) SPI의 안정성이 중요하지 않으며, 계획 및 설명 된 모든 장애 모드가있는 시스템을 설계하고, 필요한 경우 시스템에 복구 옵션이 내장되어 있습니다. 나는 I2C (또는 그 문제에 대한 SPI) 통신을 죽이는 소음 스파이크를 본 적이 없지만, I2C 컨트롤러가 나를 위해 모든 것을 수행하는 데 전적으로 의존하지는 않았습니다. 하나의 버스가 더 나은 것이 아니라 계획과 설계의 문제입니다.
akohlsmith

2
@akohlsmith : 단일 마스터 단일 슬레이브 I2C는 "비트 뱅"마스터로 강력해야합니다. 여러 슬레이브가 있고 두 개가 서로 다른 방식으로 "혼동"하는 경우 버스가 복구 불가능하게 잠길 수 있습니다 (예 : 0으로 채워진 두 개 이상의 메모리 칩이 마스터가 슬레이브를 읽으려고한다고 생각하지만 비트 카운터) 동기화되지 않은 경우, 각각은 다른 쪽이 주장하는 시간 동안에 만 SDA를 릴리스하며, 모든 슬레이브를 오버 드라이브 할 수있을만큼 강력한 "높은"드라이브를 할 수 없다면 마스터가 할 수있는 것은 아무것도 없습니다.
supercat

12

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에서 권장 할 사항이 많습니다.


1MHz를 허용하는 고속 버전의 I2C가 있습니다. 정상적인 I2C는 400kHz입니다.
레지스탕스

@TheResistance : 정상적인 I2C는 400kHz이지만 버전은 최대 1MHz로 지정되었습니다. 내가 모르는 것은 더 빠른 버전이 지정되었는지 여부입니다.
supercat

사양에 따르면 400kbps (kHz가 아니라 잘못된 단위를 사용)는 Fast-mode, 1Mbps는 Fast-mode Plus, 최대 3.4Mbps의 High-Speed ​​모드가 있습니다. 초고속은 최대 5Mbps이지만 단방향입니다.
레지스탕스

@TheResistance : 감사합니다. 나는 그 이후 버전에 대해 들어 보지 못했습니다. '단방향'이란 정확히 무엇을 의미합니까? SPI 슬레이브 대 마스터 통신 속도가 마스터 대 슬레이브보다 빠를 수 있다는 것을 알고 있습니다. 슬레이브가 마스터 후에 클럭을 얻도록 보장되지만 I2C와 동등한 개념을 확신하지 못합니다. 연결성이 있습니까?
supercat

여기 에서 사양을 찾으 십시오 . 23 페이지에서 초고속은 ACK뿐만 아니라 데이터를 다시 보내지 않는 (쓰기 전용) 장치에 사용할 수 있다고 말합니다.
의 저항

8

이 질문은 여기서 훌륭한 답변으로 철저히 탐구되었지만 칩 제조업체의 관점에서 볼 수있는 I 2 C 에 대한 관점이 하나 더있을 것 입니다.

I 2 C의 전기 인터페이스는 개방형 수집기 입니다. 이제 숨을 쉬고 의미를 생각하십시오. I 2 C를 사용 하여 버스의 작동 전압에 완전히 독립적 인 칩을 설계 할 수 있습니다. 내가 할 수있는 일은 SDA 라인을 낮게 당기고 SCL과 SDA의 전압을 접지 기준 임계 전압과 비교하여 선택할 수 있습니다. 그리고 정상적인 하이 사이드 보호 구조를 제외하고 다른 구조로 교체하면 나머지 시스템과 무관하게 자체 생명을 유지할 수있는 칩을 만들 수 있습니다-SCL, SDA는 칩에 전류를 공급하지 않습니다. 확실히 그 핀에 전류를 공급하지 않습니다. 그렇기 때문에 실시간 시계 및 기타 저전력 제품을위한 멋진 버스입니다.


4

다른 답변에서 언급하지 않은 한 가지는 I2C가 동일한 버스에서 여러 마스터를 지원한다는 것입니다. 양방향 통신이 필요하고 폴링 기반 방법을 사용하지 않으려는 경우 I2C는 작업을 수행합니다.

더 먼 거리에서 CAN은 동일한 기능을 가지며 더욱 강력합니다. 그러나 CAN은 하드웨어 지원과 트랜시버를 필요로하는 비동기 프로토콜이므로 저렴한 시스템에서는 옵션이 아닐 수 있습니다.


좋은 점 (멀티 마스터), 인터럽트 핀이있는 SPI 장치도 보았습니다. 한 장치는 여전히 마스터이지만 두 장치 모두 양방향 통신을 인스턴스화 할 수 있습니다. 원격 장치의 경우 물론 더 견고하고 더 나은 옵션 (예 : CAN)이 있습니다.
Paul

0

동기화 클럭이 ​​상승 할 때마다 SPI 프로토콜을 사용하여 비트를 장치에 직접 씁니다. xnor 논리 회로를 사용하여 메모리에서 "홈 메이드"주소를 일치시켜 원하는 장치를 i2c 장치 인 것처럼 선택할 수 있습니다.

i2c는 장치의 형식으로 저작 회로를 통합하고 있으며 표준 등은 복잡하고 다릅니다. spi를 사용하면 spi 메모리를 사용하여 화면에 비디오를 표시 할 수 있지만 i2c는 표시 할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.