한 시스템에서 다른 시스템으로 데이터를 전송하기위한 일반 프로토콜?


18

한 시스템에서 다른 시스템으로 정보를 전송하는 일반적인 프로토콜은 무엇입니까? 예를 들어, 다른 마이크로 컨트롤러로 보내려는 일정 시간 동안 마이크로 컨트롤러에서 일부 정보를 수집했다고 가정 해 보겠습니다. SPI 및 I2C 인터페이스에 대해 들었지만 한 방법을 다른 방법으로 사용하고 구현 방법을 잘 모르겠습니다. SPI 및 I2C 외에 일반적인 다른 방법이 있습니까? 구현 프로세스가 다른 마이크로 컨트롤러와 유사합니까? 수신 마이크로 컨트롤러에서 기본적으로 바이트 단위의 데이터를 구문 분석합니까?


4
당신이하고 싶은 구체적인 일은 무엇입니까?
starblue

작은 상자에서 서로 다른 시스템을 통해 서로 데이터를 전달하는 방법을 생각하면 거리가 매우 짧다고 가정 할 수 있습니다. 상자의 다른 조각을 갖는 이유는 각 부분이 자체 기능을 갖도록 기능을 단순화하는 것이다 (희망하는 차종 감각 ..)
O_O

2
그것은 사람들이 일반적으로 시스템이라고 부르는 것이 아닙니다. 그것들은 내가 서브 시스템으로 정의 할 것입니다. 단일 작업 세트를 수행하는 단일 시스템으로 간주 할 수있는 것의 일부를 구성합니다. 의미 론적이지만 많은 답변이 귀하가 질문에서 찾고있는 것에 대한 완벽한 아이디어를 가지고 있지 않기 때문에 매우 광범위하다고 생각합니다.
Kortuk

1
Kortuk이 말한 내용을 따라 문제를 정의하는 데 도움이됩니다. 스스로 물어봐야 할 중요한 질문 중 하나는 개별 서브 시스템을 동일한 기능의 다른 구현으로 대체 할 것인지 아니면 일회성 설계인지 여부입니다. 당신이 진짜 버스를 사용하여 CPU에 서브 시스템의 구현 세부 정보를 노출하는 경우가 통신 인터페이스를 사용하는 경우, 그것은 않는 반면, 다음 서브 시스템의 변화는 중요하지, 컨트롤러에 대한 변화 / W 등의 필요로 하는 방법 당신이 (대체 구현 ) 하위 시스템 (동일한 메시지 프로토콜을 충족하는 한)
JustJeff

작업을 분리하는 것 외에 다른 이유없이 여러 장치에 기능을 분할하는 것이 더 간단하지 않습니다. 통신 및 동기화는 동일한 마이크로에서 두 개의 프로세스를 갖는 것보다 더 복잡합니다. 이러한 프로세스에 특히 호환되지 않는 대기 시간 프로파일이있는 경우 (하나는 빠르게 업데이트해야하고 다른 하나는 청크를 완료하는 데 시간이 걸릴 수 있음),이를 분리해야하는 정당한 이유가있을 수 있습니다. 그럼에도 불구하고,보다 일반적인 해결책은 인터럽트를 사용하거나 더 긴 작업을 더 세분화하는 방법을 찾는 것입니다. 당신이 묘사 한대로 나는 당신이 이것을 다시 생각해야한다고 생각하고 있습니다.
darron

답변:


10

SPI와 I2C는 실제로 시스템간에 데이터를 전송하는 것보다 주변 장치를 컨트롤러 또는 CPU에 연결하는 데 더 많이 사용된다는 점에서 비슷합니다. USB는 사람들이 통신 시스템으로 취급하기를 원하는 또 다른 인터페이스로, 실제로 주변 장치 연결 버스입니다.

시스템 간의 통신은 장치를 버스에 연결하는 것과 정확히 다릅니다. 버스 연결을 통해 프로세서가 장치의 레지스터를 직접 뱅킹 할 수있는 반면, 통신 인터페이스를 통해 데이터 스트림을 송수신 할 수 있습니다. 버스에 연결된 장치는 일반적으로 통신을, 정말 문제가되지 않는 반면, 장치 드라이버를 필요로 어떤 까지 호스트 컴퓨터에 관한 한, 다른 쪽 끝에 연결되어 있습니다.

물론 이것은 항상 더 위험한 경계가되고 있습니다. PCI와 ISA와 같은 것은 틀림없이 버스입니다. I2C, SPI, USB는 아마도 버스입니다. RS232, RS485 및 이더넷은 확실히 통신 인터페이스입니다. 그러나 CAN 버스 및 1553과 같은 것은 데이터 이동에 관한 것이지만 매우 관련이 있습니다.


CANbus는 매우 관여하고 있으며 이더넷은 그렇지 않습니까? CAN은 간단한 앞뒤 메시징을 위해 작업하기가 매우 간단합니다. 이들은 전용 칩이며 대부분의 제품군은 마이크로 컨트롤러 내부를 지원합니다.
Kortuk

@Kortuk-232와 같은 것이 일종의 피어 투 피어 대칭을 갖는 한 1553 또는 CAN은 마스터 / 슬레이브 관계를 부과합니다. 나는 이더넷이 간단하다고 말하지 않았고, 단지 엔드 포인트에 버스 컨트롤러 / 버스 장치 구별을 부과하지 않는다고 생각합니다.
JustJeff

CAN에 대한 나의 의견은 전적으로 접선 노출에 대한 것입니다. 그것은 내가 작업 한 여러 시스템에서 사용되지 않는 선택적 주변 장치 였지만 설명서를 수백 번 통과 한 후에는 삼투로 사용되지 않는 옵션에 대해 약간 흡수합니다. 따라서 CAN은 컨트롤러 / 제어 장치 유형의 아키텍처라는 가정하에 노력하고 있습니다.
JustJeff

버스마다 상황에 따라 다른 의미가 있다고 생각합니다. 회로도 수준에서 여러 신호가있는 인터페이스를 버스로 간주 할 수 있습니다. 더 많은 추상화로 더 높은 레벨로 이동하면 버스의 의미가 변경됩니다. 버스가 약간 더 높으면 일반적으로 여러 장치가 있거나 관련 될 수 있음을 의미합니다. 예를 들어 RS485 멀티 포인트는 확실히 버스입니다. 리눅스 장치의 관점에서 볼 때 RS485는 다시 통신 인터페이스가되어 자신의 프로토콜 계층을 추가하여 버스로 다시 전환 할 때까지 버스에서 강등됩니다. 각 수준마다 다른 의미가 있습니다.
darron

11

데이터를 전송하는 한 가지 방법이 없으며 거리, 데이터 속도, 환경, 응용 프로그램에 따라 통신하는 여러 가지 방법이 있습니다 ...

가장 낮은 레이어는 실제 레이어 이며 실제로 비트를 움직입니다.

  • SPI 및 I²C는 전송을 방해 할 수있는 잡음이 많지 않은 장치 내부의 단거리 용입니다.

  • RS-232를 통한 최대 수십 미터 거리의 직렬 통신은 너무 빠르지 않은 통신에 적합합니다.

  • 예를 들어 RS-485와 같이 노이즈가 많거나 더 긴 거리 차동 신호가 사용되는 경우. 더 빠른 데이터 전송을 위해 이더넷이 점점 더 많이 사용되고 있습니다.

  • 그런 다음 다양한 무선 표준도 있습니다.

물리 계층 이외에도 전송 오류, 네트워크에서의 라우팅 및 기타 여러 가지를 감지하고 수정하기 위해 데이터 전송 방법을 구성하는 더 많은 계층이 있습니다. 예를 들어, 인터넷 프로토콜은 일반적으로 이더넷 프로토콜 위에 여러 계층의 다소 복잡한 스택입니다.


7

간단한 직렬 UART (별도 클록이없는 하나의 Tx 및 하나의 Rx 라인)를 사용할 수 있으며 광절 연기 또는 자기 절연기를 사용 하여 서로 다른 전위 (1 차 및 2 차 회로) 사이를 쉽게 교차하도록 조정할 수 있습니다 .

프로토콜이 진행되는 한, 정의 된 명령 바이트 및 체크섬 체계가있는 모든 것이 잘 작동합니다. 실제로 모든 유형의 통신에 적합한 포괄적 인 표준 프로토콜은 없습니다. I2C는 시그널링 표준 (어드레싱, 중지, 시작 등 정의)을 가지고 있지만 실제로 전달되는 프로토콜은 전적으로 개발자에게 달려 있습니다.

예를 들어 PMBus 는 I2C를 물리적 매체로 사용하는 전원 공급 장치 통신 프로토콜입니다.


6

실제로는 "일반적인"프로토콜이 없습니다. 결국 사용하는 것은 응용 프로그램에 따라 다릅니다. 더 나은 답변을 제공하기 위해서는 귀하의 요구 사항을 조금 더 이해해야합니다. 서브 시스템으로서 서로 대화하는 별도의 마이크로 컨트롤러를 갖고 싶다고 언급했습니다.

이 응용 프로그램에 대한 몇 가지 질문 :

  1. 이 프로젝트에 2 개 이상의 마이크로 컨트롤러가 있습니까?
  2. 속도 및 처리량 요구 사항은 무엇입니까? 정보가 얼마나 빨리 도착하고 얼마나 자주 데이터를주고 받습니까?

질문 1에 NO라고 대답 한 경우 :

이 프로젝트에 2 개의 micrco 컨트롤러 만있는 경우 UART를 확실히 사용할 수 있습니다. 둘 다 통신을 시작해야하는 경우 흐름 제어를 사용하십시오. 그렇지 않으면 한 방향으로 데이터를 전송하는 것이 쉽지 않습니다. 대부분의 경우 더 높은 전송 속도 중 하나를 선택하면 "충분히 빠릅니다". I2C 및 SPI는 일반적으로 마스터 / 슬레이브 아키텍처에만 적합합니다.

질문 1에 YES (2 개 이상의 컨트롤러)로 대답 한 경우 1

  • 프로젝트에 둘 이상의 마이크로 컨트롤러가있는 경우 어느 컨트롤러가 통신을 시작합니까? 마스터 컨트롤러 만 하나입니까 (예 : 마스터-슬레이브 아키텍처)? 아니면 언제라도 서브 시스템이 말할 수 있습니까?
  • 서로 통신 할 서브 시스템이 필요합니까? 예 : 장치 A, B 및 C의 경우 : A는 B와 C로, B는 A와 C로 모두 보낼 수 있습니다.

따라서 이제는 주소 지정 가능한 장치를 공통 버스에 놓을 수있는 확장 성이 뛰어난 것이 필요합니다. 이 후속 질문에 대한 답변은 I2C와 SPI (마스터-슬레이브) 또는 CAN (멀티 마스터)과 같은 것을 결정하는 데 도움이됩니다.

마이크로 컨트롤러에는 UART 주변 장치가있을 가능성이 높으며 다른 장치 (특히 CAN)는 더 높은 엔드 칩에서만 사용할 수 있습니다. 두 경우 모두 이러한 주변 장치를 사용하여 바이트를 이동하는 방법에 대한 많은 설명서가 있어야합니다.


5

@Jon이 지적했듯이, 통신 인터페이스를 선택할 때 한 가지 문제는 한 개체가 항상 통신을 시작해야하는지 또는 두 개 이상의 개체가 그렇게 책임을 지는지 여부입니다. 관련된 문제는 한 엔티티가 항상 원치 않는 통신을 수신 할 수 있는지 여부입니다. SPI는 한 쪽에서 항상 통신을받을 수있는 응용 프로그램에서 자주 사용됩니다. 예를 들어 74HC595 시프트 레지스터와 같은 것은 결코 "사용 중"이 아닙니다. SPI는 마이크로 컨트롤러와 마이크로가 제어해야하는 하드웨어 간의 통신에는 좋지만 실제로는 두 마이크로 컨트롤러 간의 통신에는 좋지 않습니다. I2C 하드웨어가있는 두 개의 프로세서가이를 사용하여 통신하는 경우, 소프트웨어는 매우 관대 한 제약 조건 내에서 진행중인 작업을 처리하는 데 원하는 시간이 소요될 수 있습니다. 데이터 손실을 유발하지 않습니다. 프로세서가 들어오는 각 바이트를 처리하는 데 100 마이크로 초가 걸리면 처리량이 심각하게 제한되지만 발신자가 수신자가 유지할 수있을 정도로 속도가 느려집니다. 일반적으로 SPI에서 발생할 수있는 유일한 방법은 핸드 셰이 킹을위한 별도의 와이어가있는 경우입니다.

I2C는 정말 훌륭한 프로토콜입니다. 상상할 수있는 가장 완벽한 프로토콜이되는 것을 막는 가장 큰 한계는

  1. 속도는 다소 제한적입니다. SPI는 훨씬 빨라질 수 있으며 UART조차도 조금 더 빨라질 수 있습니다.
  2. (2) I2C에는 두 개의 전선 만 있으면되는 것이 매우 편리하지만 두 전선 모두 양방향 오픈 컬렉터 통신이 가능해야합니다. 따라서 리피터를 통해 I2C를 전송하기가 어렵습니다.

개인적으로, 컨트롤러 벤더가 핸드 셰이 킹을 포함한 3 선 SPI 변형을 지원하고 싶습니다. 그래도 그렇게하는 컨트롤러는 알지 못합니다.


웃기는 말이 있습니다 ... 칩 선택보다 더 많은 장치가 버스에 참여할 수 있도록 SPI 인터페이스를 양방향이 아닌 I2C와 유사한 인터페이스 (첫 번째 바이트는 주소)로 바꿔야합니다. . 슬레이브 디바이스가 모두 FPGA 인 경우 작동합니다. :) 나도 그 두 가지 주요 동기 표준 사이에 무언가가 있기를 바랐다.
darron

아, 나는 주소 바이트가 수신 될 때까지 슬레이브에서 출력 인 에이블이 주장되지 않고 단일 칩 선택이 선언 될 때까지 계속 유지된다는 것을 분명히해야한다고 생각합니다. 그래서 정상적인 SPI + 고수준과 약간 다릅니다 실험 계획안. 그러나 마스터 장치의 관점에서 표준 SPI와 완전히 호환됩니다. (마이크로 프로세서처럼)
darron

@ 대런 : 쿨. 업계에서 와이어가 활발하게 구동되는 개방형 표준 3 선 통신 버스를 사용하기 위해 어떻게해야하는지 궁금합니다. 수동 풀업을 피하고 모든 장치가 인터럽트 신호를 보내는 것 사이에는 약간의 충돌이 있다고 생각합니다.하지만 마스터에 연결되거나 슬레이브의 편의를 위해 인터럽트 핀을 추가하여 해결할 수 있습니다 (현재의 구현 프로토콜에는 슬레이브가 하나만 있으므로 서비스를 원할 때 데이터 리턴 와이어를 사용하여 비동기 적으로 신호를 보낼 수 있습니다).
supercat

@darron : 칩 선택 핀을 사용하지 않기 위해, 마스터 신호는 클럭이 낮을 때 데이터 와이어에 2 개의 상승 에지를 전송하여 명령 시작 신호를 보냅니다. 슬레이브는 클럭과 데이터가 모두 낮을 때 (유휴) 상태 값을 출력하여 마지막 데이터 바이트가 유효한지 여부를 표시 할 수 있습니다. 그렇지 않으면 클럭이 낮고 데이터가 높을 때주의를 요한다는 것을 나타냅니다. 이 프로토콜에 대한 마스터 하드웨어를 설계하는 경우 데이터 와이어 미러링 된 클록에 8 개의 클록 펄스를 전송하는 기능을 추가하고 슬레이브 하드웨어에는 상승 에지 수의 비동기 카운트를 포함합니다.
supercat

@darron : ... 데이터 바이트. 5 이상인 경우 바이트가 무시됩니다 (슬레이브는 마스터가 데이터 바이트 수신에 관심이 있지만 실제로 말하고 싶지 않은 것으로 가정 함). 그래도 클럭이 낮을 때 슬레이브가 마지막 바이트 상태를보고하도록하는 것 (슬레이브 장치가 프로세서 인 경우 마스터가 슬레이브가 준비되지 않았다는 것을 마스터에게 알리는 것)만큼 중요하지는 않습니다. 그리고 마지막 '거래 기회'를 놓쳤다
supercat

3

같은 순서로 2 개의 CPU에서 가장 많이 사용되는 물리 계층 인스턴스는 특별한 순서가없는 것 같습니다.

  • 데이지 체인 SPI (예 : JTAG에서 사용)
  • 슬레이브 당 선택 와이어 SPI
  • "비동기식 스타트-스톱 직렬 통신"(일명 CPU의 UART TX 핀을 다른 CPU의 UART RX 핀에 직접 연결) "TTL 수준 RS-232"
  • I2C
  • 8 비트 데이터 + 스트로브 (예 : IEEE 1284 프린터 포트 병렬 포트)
  • 공유 메모리 (한 번에 하나의 CPU 만 주소 / 데이터 / 제어 버스를 구동 함)

이러한 물리적 계층 인스턴스 (별도의 상자에 2 개의 CPU에 대한 다른 물리적 계층 인스턴스)는 일반적으로 높은 수준의 통신 시스템을 구현하는 바이트 스트림을 소프트웨어에 제공합니다.

스마트 프로그래머는 하드웨어 담당자가 하나의 물리적 계층 인스턴스를 제거하고 완전히 다른 물리적 계층 인스턴스로 교체하기로 결정하는 경우 출력 스트림 바이트를 공급하기 위해 몇 가지 기능 만 다시 작성하면됩니다. 하드웨어로 전송하고 하드웨어에서 바이트 스트림을 다시 읽으며 모든 상위 레벨 프로토콜 항목은 계속 변경되지 않습니다.

한 CPU에서 다른 CPU로 정보를 전송하는 프로토콜은 거의 항상 일련의 패킷으로 바이트 스트림을 해석합니다.

  1. 전문
  2. 머리글
  3. 직렬화 된 데이터 (아마도 탈출)
  4. 트레일러

어떤 사람들은 (2) 많은 종류의 헤더 구조 중 하나와 (3a) 많은 종류의 직렬화 데이터 중 하나와 (3b) 여러 종류 중 하나를 혼합하여 일치시켜 완전히 새로운 맞춤형의 호환되지 않는 프로토콜을 만드는 것을 좋아합니다. (4) 많은 종류의 트레일러 중 하나를 사용하여 직렬화 된 데이터를 탈출합니다.

데이터를 패킷으로 캡슐화하는 가장 간단한 프로토콜 중 일부는 다음과 같습니다.

패킷으로 데이터를 캡슐화하기위한 약간 더 복잡한 프로토콜은 다음과 같습니다.

에 프로토콜의 긴 목록이 있습니다

프로토콜 디자인이 어떻게 잘못 될 수 있는지 설명하는 Radia Perlman의 "Protocol Design Folklore" 를 읽을 수 있습니다 .


3

단일 '일반'프로토콜이 없습니다. 선택은 (예를 들어) 다음에 따라 달라질 수 있습니다.

  • 거리
  • 필요한 처리량
  • 특수 주변 장치의 가용성
  • 소음 수준
  • 광학적 분리 필요
  • 중요도 (허용 가능한 고장률)
  • 양단의 가용 CPU 전원
  • 양쪽 끝에 사용 가능한 I / O 핀

많은 경우 데이터 링크 계층 (데이터 인코딩 방식 +/-)에서 물리 계층 (신호 수준)을 분리해야합니다 (OSI 모델, 하위 ..4 계층 확인). 가능한 물리층은 다음과 같습니다.

  • 간단한 5V 또는 3.3V 또는 1.8V TTL
  • 푸시 풀 대신 위의 오픈 컬렉터 중 하나
  • 균형 잡힌 전압 신호 (종종 FPGA와 함께 사용)
  • 밸런스 하 이거 전압 (RS485, RS432)
  • 단일 종단 고전압 (RS232)
  • 균형 잡힌 트라 포 커플 링 (다양한 이더넷 버전, PDIF 오디오)
  • 광학 (광 이더넷, 토 링크)

한 줄을 사용하여 데이터 및 시계 정보를 전달하거나 여러 줄로 나눌 수 있습니다. 후자는 인기가 있었지만 요즘 대부분의 새로운 / 빠른 프로토콜은 한 줄 (또는 한 줄로 작동하는 한 줄)을 사용하는 경향이 있습니다.

그것들은 데이터를 인코딩하고 한 줄에 클럭하는 많은 방법입니다. RS232는 전통적으로 NRZ를 사용하고, Machester 인코딩이 있으며, 호기심 많은 이름이 2.7 RLL 인 하드 디스크에서 다양한 형식을 사용합니다.

요약하자면 : 시스템간에 의사 소통을하는 방법은 여러 가지가 있습니다. 그리고 오류 감지 및 복구, 데이터 인코딩, 압축 및 암호화와 같은 커넥터 또는 높은 수준의 측면조차 언급하지 않았습니다 ...

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