AVR 교육 과정. SPI 모듈 작업. 데이터 읽기 및 쓰기. Ch2. SPI 작업 방법 - 이론 Spi 입력

전송 인터페이스.

한 장치에서 다른 장치로 또는 한 칩에서 다른 칩으로 데이터를 전송하기 위해 많은 데이터 전송 인터페이스가 개발되었습니다. 각 인터페이스에는 긍정적인 측면과 부정적인 측면이 모두 있으므로 어떤 인터페이스가 있는지, 각각의 장단점을 파악하고 주어진 상황에서 데이터를 전송하는 데 적합한 인터페이스를 사용해야 합니다.

인터페이스에는 비동기식 및 동기식 데이터 전송이 제공됩니다. 동기식 데이터 전송에서는 클럭 신호가 데이터와 동시에 전송되므로 수신기와 송신기가 동기화됩니다. 이러한 프로토콜의 예로는 SPI 인터페이스가 있습니다.

비동기 데이터 전송에는 클럭 신호가 없습니다. 이러한 회선에서는 수신기와 송신기가 일치하지 않을 위험이 있으며, 그 결과 추가 데이터가 올바르게 수신되지 않습니다. 이를 방지하기 위해 비동기 인터페이스는 데이터 라인을 따라 주기적으로 동기화를 수행합니다. 이러한 인터페이스의 장점은 전송에 필요한 도체 수가 적다는 것입니다.

가장 인기 있는 몇 가지 인터페이스를 자세히 살펴보겠습니다.

USART 인터페이스.

USART 인터페이스는 직렬 범용 동기-비동기 트랜시버입니다. 데이터는 정기적으로 USART로 전송됩니다. 이 기간은 지정된 USART 속도에 의해 결정되며 보드(baud) 단위로 지정됩니다(0 또는 1과 같은 값만 사용할 수 있는 문자의 경우 보드는 초당 비트 수와 동일함). 일반적으로 허용되는 표준 속도 범위는 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 보드입니다.

데이터 비트 외에도 USART는 소위 시작 및 중지 비트라고 하는 동기화 표시를 스트림에 자동으로 삽입합니다. 수신 시 이러한 추가 비트는 제거됩니다. 일반적으로 시작 및 중지 비트는 1바이트의 정보(8비트)를 분리하지만 5, 6, 7, 8 또는 9비트를 전송할 수 있는 USART 구현이 있습니다. 시작 및 중지 신호로 분리된 비트는 최소 전송입니다. USART를 사용하면 전송 중에 두 개의 정지 비트를 삽입하여 트래픽이 많은 상황에서 수신기와 송신기의 비동기화가 발생할 가능성을 줄일 수 있습니다. 수신기는 두 번째 정지 비트를 무시하고 이를 회선의 짧은 일시 중지로 처리합니다.

관례적으로 USART 입력 및 출력의 수동(데이터가 없는 경우) 상태는 논리 "1"입니다. 시작 비트는 항상 논리 "0"이므로 USART 수신기는 "1"에서 "0"으로의 전환을 기다리고 비트 기간의 절반(시작 비트 전송 중간)의 시간 간격을 계산합니다. . 이 순간 입력이 여전히 "0"이면 최소 소포 수령 프로세스가 시작됩니다. 이를 위해 수신기는 연속적으로 9비트 지속 시간(8비트 데이터의 경우)을 계산하고 각 순간의 입력 상태를 기록합니다. 처음 8개 값은 수신된 데이터이고, 마지막 값은 테스트 값(정지 비트)입니다. 정지 비트 값은 항상 “1”이며, 실제 수신된 값과 다를 경우 USART는 오류를 기록합니다.

시간 간격을 형성하기 위해 USART 송신 및 수신에는 정확한 시간 소스(클럭킹)가 있습니다. 이 소스의 정확도는 시작 펄스의 시작부터 정지 펄스의 중간까지 시간 간격을 설정할 때 오류(수신기와 송신기)의 합이 절반을 초과하지 않아야 합니다(또는 더 나은 방법으로는 최소한 Quarter) 비트 간격입니다. 8비트 메시지의 경우 0.5/9.5 = 5%(실제로는 3%를 넘지 않음) 이는 수신기 및 송신기 오류와 라인의 가능한 신호 왜곡의 합이므로 USART 클로킹 정확도에 대한 권장 허용 오차는 1.5%를 넘지 않습니다.

클록 비트는 비트스트림의 일부를 차지하므로 결과적인 UART 처리량은 연결 속도와 같지 않습니다. 예를 들어, 8비트 8-N-1 형식 전송의 경우 클록 비트는 스트림의 20%를 차지하며 115,200보드의 물리적 속도에 대해 92,160bps 또는 11,520바이트/초의 데이터 비트 전송률을 제공합니다.

패리티 검사

USART 프로토콜에는 비트 패리티 방법을 사용하여 데이터 무결성을 자동으로 모니터링하는 기능이 있습니다. 이 기능이 활성화되면 데이터의 마지막 비트("패리티 비트")는 항상 1 또는 0이므로 바이트의 1 개수는 항상 짝수입니다.

흐름 제어

예전에는 USART 장치가 너무 느려서 들어오는 데이터 스트림을 따라잡을 수 없었습니다. 이 문제를 해결하기 위해 USART 모듈에는 별도의 흐름 제어 출력과 입력이 제공되었습니다. 입력 버퍼가 가득 차면 수신 USART의 논리는 해당 출력에서 ​​금지 수준을 설정하고 송신 USART는 전송을 일시 중단했습니다. 나중에 흐름 제어가 통신 프로토콜에 할당되면서 별도의 흐름 제어 라인에 대한 필요성이 점차 사라졌습니다.

물리적 구현.

USART는 교환 프로토콜입니다. 비트 형성 방법, 바이트 전송 매개변수, 전송 속도 등을 결정합니다.

그러나 USART의 물리적 구현은 다를 수 있습니다. 예를 들어, 한 보드 내에서 데이터를 전송하려면 +5V와 0V 레벨로 신호를 전송해야 합니다. 장거리 및 장치 간에 데이터를 전송하기 위해 전류 루프(4-20mA), RS-232(COM 포트), RS-485 등과 같은 다른 물리적 전압 레벨 및 표준이 사용됩니다.

0-5V의 "컨트롤러" 레벨을 "표준" 레벨로 변환하기 위해 RS-232용 ADM202와 같은 특수 마이크로 회로가 엄청나게 많이 있습니다.

직렬 인터페이스 SPI

SPI라는 이름은 "Serial Peripheral Bus"의 약어로 외부 장치를 연결하는 버스라는 목적을 반영합니다. SPI 버스는 마스터-슬레이브 원칙에 따라 구성됩니다. 버스 마스터는 일반적으로 마이크로컨트롤러이지만 프로그래밍 가능 로직, DSP 컨트롤러 또는 ASIC일 수도 있습니다. 마스터에 연결된 장치는 슬레이브입니다. 그들의 역할은 다음을 포함한 다양한 종류의 미세 회로에 의해 수행됩니다. 저장 장치(EEPROM, 플래시 메모리, SRAM), 실시간 클록(RTC), ADC/DAC, 디지털 전위차계, 특수 컨트롤러 등

SPI 인터페이스의 주요 빌딩 블록은 동기화 및 비트스트림 입력/출력 신호가 인터페이스 신호를 형성하는 기존 시프트 레지스터입니다. 따라서 SPI 프로토콜을 데이터 전송 프로토콜이 아니라 각각 수신기와 송신기의 기능을 동시에 수행하는 두 개의 시프트 레지스터 간의 데이터 교환 프로토콜이라고 부르는 것이 더 정확합니다. SPI 버스에서 데이터를 전송하기 위한 전제 조건은 버스 동기화 신호의 생성입니다. 오직 리더만이 이 신호를 생성할 권리를 가지며 슬레이브의 작업은 전적으로 이에 달려 있습니다.

연결.

SPI 버스에는 세 가지 유형의 연결이 있으며 각 유형에는 4개의 신호가 포함됩니다. SPI 신호의 목적은 표 7.1에 설명되어 있습니다.

두 개의 마이크로 회로만 포함하는 가장 간단한 연결이 그림 7.2에 나와 있습니다. 여기서 버스 마스터는 생성된 SCLK 신호와 동기적으로 MOSI 라인을 따라 데이터를 전송하고, 슬레이브는 수신된 동기화 신호의 특정 가장자리에서 전송된 데이터 비트를 캡처합니다. 동시에 슬레이브는 데이터 패키지를 보냅니다. 사용된 슬레이브 IC가 응답 데이터 전송을 제공하지 않거나 필요하지 않은 경우 MISO 라인을 제거하여 제시된 회로를 단순화할 수 있습니다. 단방향 데이터 전송은 DAC, 디지털 전위차계, 프로그래밍 가능 증폭기 및 드라이버와 같은 칩에서 찾을 수 있습니다. 따라서 슬레이브 IC를 연결하기 위해 고려되는 옵션에는 3개 또는 4개의 통신 라인이 필요합니다.

슬레이브 IC가 데이터를 수신 및 전송하려면 클록 신호 외에도 SS 라인도 로우로 구동되어야 합니다. 그렇지 않으면 슬레이브 IC가 비활성화됩니다. 하나의 외부 IC만 사용하는 경우 슬레이브 IC의 선택 입력을 하드 로우로 구동하여 SS 라인을 제거하려는 유혹을 느낄 수 있습니다. 이 솔루션은 매우 바람직하지 않으며 오류가 발생하거나 심지어 데이터 전송이 불가능해질 수도 있습니다. 칩 선택 입력은 IC를 초기 상태로 재설정하는 역할을 하며 때로는 데이터의 첫 번째 비트 출력을 시작합니다.

여러 개의 마이크로 회로를 SPI 버스에 연결해야 하는 경우 독립(병렬) 연결(그림 7.3) 또는 캐스케이드(직렬) 연결(그림 7.4)이 사용됩니다. 독립적인 연결이 더 일반적입니다. SPI 호환 칩을 사용할 때 달성됩니다. 여기서 미세 회로 선택을 제외한 모든 신호는 병렬로 연결되며 버스 마스터는 하나 또는 다른 SS 신호를 로우 상태로 전송하여 어떤 슬레이브 IC와 데이터를 교환할지 지정합니다. 이 연결의 가장 큰 단점은 슬레이브 칩의 주소를 지정하기 위해 추가 라인이 필요하다는 것입니다(총 통신 라인 수는 3+n입니다. 여기서 n은 슬레이브 칩 수입니다).

마이크로컨트롤러 다리가 충분하지 않으면 디멀티플렉서 칩을 사용할 수 있습니다. 디멀티플렉서는 제어 핀의 코드에 따라 단일 입력 신호를 출력 신호 중 하나에 연결합니다. 그림 7.4는 디멀티플렉서의 연결 다이어그램을 보여줍니다. SS 신호는 입력에 공급되며, 마이크로 회로 중 하나를 선택해야 하는 경우 0과 같은 값을 갖습니다. Am-A0 다리에는 바이너리 코드로 필요한 미세 회로 수가 제공됩니다. 이를 통해 마이크로컨트롤러에 사용되는 다리 수를 m=log 2n으로 줄일 수 있습니다. 여기서 n은 슬레이브 칩의 수입니다. 저것들. 128개의 장치를 연결하려면 8개의 마이크로컨트롤러 핀이 필요합니다. 하나는 활성화 신호를 설정하기 위한 것이고, 7개는 켜질 칩의 번호를 설정하기 위한 것입니다. 디멀티플렉서의 연결되지 않은 다리에는 논리적 다리가 있어야 한다는 점에 유의해야 합니다. 그렇지 않으면 논리 0을 논리 1로 변환하는 신호 인버터가 사용됩니다.

캐스케이드 스위칭에는 이러한 단점이 없습니다. 여기서는 여러 칩이 하나의 큰 시프트 레지스터를 형성합니다. 이를 위해 그림 3과 같이 한 IC의 데이터 전송 출력이 다른 IC의 데이터 수신 입력에 연결됩니다. 여기서 칩 선택 입력은 병렬로 연결되므로 전체 통신 회선 수가 동일하게 유지됩니다. 단, 캐스케이드 연결의 사용은 사용된 칩의 문서에 지원이 표시된 경우에만 가능합니다. 이를 알아보려면 이러한 연결을 영어로 "daisy-chaining"이라고 한다는 것을 아는 것이 중요합니다.

전송 프로토콜

SPI 인터페이스를 통한 전송 프로토콜은 본질적으로 시프트 레지스터의 논리(그림 7.6)와 동일합니다. 이는 시프트 연산을 수행하고 이에 따라 동기화 신호의 특정 에지에서 데이터의 비트 입력 및 출력을 수행하는 것으로 구성됩니다. 전송 중 데이터 설정과 수신 중 샘플링은 항상 반대쪽 클럭 에지에서 수행됩니다. 이는 데이터가 안정적으로 설정된 후 샘플링되도록 보장하는 데 필요합니다. 전송 사이클의 첫 번째 에지가 상승 또는 하강 에지가 될 수 있다는 점을 고려하면 SPI 인터페이스 작동에 가능한 네 가지 논리 옵션이 있습니다. 이러한 옵션을 SPI 모드라고 하며 다음 두 매개변수로 설명됩니다.

· CPOL - 동기화 신호의 초기 레벨(CPOL=0인 경우 전송 주기 시작 전과 끝 후의 동기화 라인은 낮은 레벨을 갖습니다(즉, 첫 번째 에지는 상승하고 마지막 에지는 하강). 그렇지 않고 CPOL=1이면 - 높음(즉, 첫 번째 전선이 하락하고 마지막 전선이 상승함));

· CPHA - 동기화 단계; 이 매개변수는 데이터가 설치되고 검색되는 순서를 결정합니다. CPHA=0이면 클럭 사이클의 상승 에지에서 데이터가 샘플링되고 하강 에지에서 데이터가 설정됩니다. CPHA=1이면 동기화 주기의 상승 에지에서 데이터 설치가 수행되고 하강 에지에서 샘플링이 수행됩니다.

SPI 모드에 대한 정보는 그림 7.7과 7.8에 나와 있습니다.

서로 다른 SPI 모드에서 작동하는 마스터 및 슬레이브 칩은 호환되지 않으므로 슬레이브 칩을 선택하기 전에 버스 마스터가 어떤 모드를 지원하는지 명확히 하는 것이 중요합니다. 대부분의 경우 마이크로 컨트롤러에 통합된 하드웨어 SPI 모듈은 모든 모드를 선택하는 기능을 지원하므로 모든 슬레이브 SPI 칩을 여기에 연결할 수 있습니다(독립 연결 옵션에만 적용됨). 또한 모든 모드의 SPI 프로토콜은 소프트웨어로 쉽게 구현됩니다.

RS-485 인터페이스

RS-485 인터페이스(다른 이름은 EIA/TIA-485)는 가장 일반적인 물리적 통신 계층 표준 중 하나입니다. 물리 계층은 통신 채널 및 신호 전송 방법입니다(OSI 개방형 시스템 상호 연결 모델의 계층 1).

RS-485 인터페이스에 구축된 네트워크는 꼬인 쌍(두 개의 꼬인 전선)을 사용하여 연결된 트랜시버로 구성됩니다. RS-485 인터페이스는 차동(균형) 데이터 전송 원리를 기반으로 합니다. 그 본질은 두 개의 전선을 통해 하나의 신호를 전송하는 것입니다. 또한 한 와이어(조건부 A)는 원래 신호를 전달하고 다른 와이어(조건부 B)는 역 복사본을 전달합니다. 즉, 한 와이어에 "1"이 있으면 다른 와이어에는 "0"이 있고 그 반대의 경우도 마찬가지입니다. 따라서 연선의 두 전선 사이에는 항상 전위차가 있습니다. "1"에서는 양수이고 "0"에서는 음수입니다(그림 7.9).

신호를 전송하는 것은 바로 이 전위차입니다. 이 전송 방법은 공통 모드 간섭에 대한 높은 내성을 제공합니다. 공통 모드 간섭은 라인의 두 전선에 동일하게 영향을 미치는 간섭입니다. 예를 들어 통신선의 한 부분을 통과하는 전자기파는 두 전선 모두에 전위를 유도합니다. 신호가 RS-232와 같이 공통선을 기준으로 한 와이어의 전위에 의해 전송되는 경우 이 와이어의 간섭으로 인해 간섭을 잘 흡수하는 공통(접지)에 비해 신호가 왜곡될 수 있습니다. 또한 접지 전위차는 긴 공통 와이어의 저항 전체에 걸쳐 떨어지게 되어 추가적인 왜곡 원인이 됩니다. 그리고 차동 전송을 사용하면 왜곡이 발생하지 않습니다. 실제로 두 개의 와이어가 서로 가까이 있고 서로 얽혀 있으면 두 와이어의 픽업이 동일합니다. 동일하게 부하가 걸린 두 전선의 전위는 동일하게 변하는 반면, 정보를 제공하는 전위차는 변하지 않습니다.

RS485 인터페이스의 하드웨어 구현.

인터페이스의 하드웨어 구현 - 차동 입력/출력(라인에 대한) 및 디지털 포트(컨트롤러의 UART 포트에 대한)가 있는 트랜시버 칩입니다. 이 인터페이스에는 RS-422와 RS-485의 두 가지 옵션이 있습니다.

RS-422는 전이중 인터페이스입니다. 수신과 전송은 두 개의 개별 전선 쌍을 통해 이루어집니다. 각 전선 쌍에는 하나의 송신기만 있을 수 있습니다.

RS-485는 반이중 인터페이스입니다. 수신과 전송은 시간 간격을 두고 한 쌍의 전선을 통해 발생합니다. 수신 모드에서는 송신기가 꺼질 수 있으므로 네트워크에는 많은 송신기가 있을 수 있습니다(그림 7.10).

그림 7.10의 기호 설명

D (드라이버) - 송신기;
R (수신기) - 수신기;
DI(드라이버 입력) - 송신기의 디지털 입력;
RO(수신기 출력) - 수신기의 디지털 출력.
DE(드라이버 활성화) - 송신기 작동 권한
RE(수신기 활성화) - 수신기 작동 권한
A - 직접 차동 입력/출력;
B - 역 차동 입력/출력;
Y - 직접 차동 출력(RS-422);
Z - 역차동 출력(RS-422).

RS-485 트랜시버를 자세히 살펴보겠습니다. 수신기(RO)의 디지털 출력은 수신기 UART 포트(RX)에 연결됩니다. UART 송신기 포트(TX)에 대한 송신기 디지털 입력(DI). 수신기와 송신기가 차동측에 연결되어 있으므로 수신 중에는 송신기를 꺼야 하고, 송신 중에는 수신기를 꺼야 합니다. 이를 위해 수신기 권한(RE) 및 송신기 권한(DE)과 같은 제어 입력이 사용됩니다. RE 입력은 역방향이므로 DE에 연결하고 컨트롤러의 모든 포트에서 하나의 신호로 수신기와 송신기를 전환할 수 있습니다. 레벨 "0" - 수신 작업, "1" - 전송 작업(그림 7.11).

차동 입력(AB)에서 전위차(UAB)를 수신하는 수신기는 이를 출력 RO에서 디지털 신호로 변환합니다. 수신기의 감도는 다를 수 있지만 트랜시버 칩 제조업체는 신호 인식에 대해 보장된 임계값 범위를 문서에 기록합니다. 일반적으로 이러한 임계값은 ±200mV입니다. 즉, UAB > +200mV일 때 수신기는 UAB가 "1"을 감지합니다.< -200 мВ - приемник определяет "0". Если разность потенциалов в линии настолько мала, что не выходит за пороговые значения - правильное распознавание сигнала не гарантируется. Кроме того, в линии могут быть и не синфазные помехи, которые исказят столь слабый сигнал.

모든 장치는 동일한 방식으로 하나의 연선 케이블에 연결됩니다. 즉, 한 와이어에는 직접 출력(A)이, 다른 와이어에는 역 출력(B)이 연결됩니다.

라인측(RAB) 수신기 입력 임피던스는 일반적으로 12KΩ입니다. 송신기 전력은 무제한이 아니기 때문에 회선에 연결된 수신기 수에 제한이 생깁니다. RS-485 사양에 따르면 종단 저항을 고려하면 송신기는 최대 32개의 수신기를 구동할 수 있습니다. 그러나 입력 임피던스가 증가된 다수의 미세 회로가 있으므로 32개보다 훨씬 많은 장치를 라인에 연결할 수 있습니다.

RS-485 사양에 따른 최대 통신 속도는 10Mbaud/sec에 달합니다. 최대 거리는 1200m입니다. 1200m 이상의 거리에서 통신을 구성해야 하거나 송신기의 부하 용량이 허용하는 것보다 더 많은 장치를 연결해야 하는 경우 특수 중계기가 사용됩니다.

I2C 인터페이스.

이 인터페이스는 Philips가 제안한 것으로 TV 칩 간의 통신을 구성하는 데 사용되었습니다. I 2 C(Inter-Integrated Circuit의 약어)는 양방향 비동기 직렬 버스입니다. 물리적으로 I 2 C 버스는 두 개의 신호 라인으로 구성되며, 그 중 하나(SCL)는 클록 신호 전송용이고 두 번째(SDA)는 데이터 교환용입니다. 라인을 제어하기 위해 오픈 컬렉터가 있는 출력단이 사용되므로 버스 라인은 라인의 물리적 길이와 저항에 따라 1~10kOhm 저항을 통해 +5V 전원에 연결되어야 합니다. 데이터 전송 속도. 표준 모드의 연결 라인 길이는 2m에 달할 수 있으며 데이터 전송 속도는 100kbit/s입니다.

모든 버스 가입자는 "리더"와 "노예"의 두 가지 클래스로 나뉩니다. 마스터 장치는 클록 신호(SCL)를 생성합니다. 이는 독립적으로 버스에 액세스하고 정보 전송 또는 수신을 위해 모든 슬레이브 장치의 주소를 지정할 수 있습니다. 모든 슬레이브 장치는 자신의 주소를 감지하기 위해 버스를 "수신"하고 이를 인식한 후 규정된 작업을 수행합니다. 또한 여러 마스터 장치가 버스에 설치된 경우 소위 "MultiMaster" 모드가 가능합니다. 이 모드는 공통 슬레이브 장치를 공동으로 공유하거나 스스로 정보 교환을 시작할 때 마스터 역할을 하거나 다른 마스터 장치의 액세스를 기다리고 있습니다. "MultiMaster" 모드에서는 지속적인 모니터링과 충돌 인식이 필요합니다. 이런 점에서 이 모드는 구현(소프트웨어 구현을 의미)이 더 어려우며 결과적으로 실제 제품에서는 덜 자주 사용됩니다.

대기 모드의 초기 순간에 SCL 및 SDA 라인은 모두 논리적 1 상태입니다(오픈 컬렉터 출력단의 트랜지스터가 닫혀 있음). 전송 모드(그림 7.12)에서 SDA 데이터 비트는 SCL의 상승 에지에 의해 클럭됩니다. SCL 라인이 0 상태에 있을 때 SDA 라인의 정보가 변경됩니다. 슬레이브 장치는 예를 들어 다음 수신 바이트를 처리하는 동안 SCL 라인을 0 상태로 "유지"할 수 있는 반면, 마스터 장치는 정보 전송을 계속하기 전에 SCL 라인이 해제될 때까지 기다려야 합니다.

I 2 C 버스 패킷을 동기화하기 위해 "START"와 "STOP"이라는 두 가지 조건이 구별되어 정보 패킷의 시작과 끝을 제한합니다(그림 7.13). 이러한 조건을 인코딩하기 위해 SCL 라인의 단일 상태로 SDA 라인의 상태 변경이 사용되며 이는 데이터 전송시 허용되지 않습니다. "START" 조건은 SDA 라인에 하강 에지가 나타날 때 형성되고, SCL 라인이 단일 상태일 때 "STOP" 조건은 SCL 라인에 상승 에지가 나타날 때 형성됩니다. 라인은 단일 상태입니다.

데이터 전송은 첫 번째 정보 바이트의 최상위 비트를 기록하는 SCL 라인의 첫 번째 상승 에지에서 시작됩니다. 각 정보 바이트(8비트)에는 SCL 라인의 9개 클록 주기가 포함됩니다. 9번째 사이클에서 수신 장치는 데이터 수신을 나타내는 하강 에지인 승인(ACK)을 발행합니다. 마스터와 슬레이브 모두의 모든 버스 가입자는 서로 다른 시간에 송신기와 수신기가 될 수 있으며 모드에 따라 ACK 신호를 수신하거나 발행해야 하며, 신호가 없으면 ACK 신호가 해석됩니다. 오류로.

데이터 교환 작업을 시작하기 위해 마스터 장치는 버스에서 "START" 조건을 발행합니다. "START" 조건 뒤에는 7비트 장치 주소(비트 1...7)와 1비트 읽기-쓰기 작업 플래그로 구성된 슬레이브 장치의 주소(그림 7.14)가 있는 바이트가 옵니다. R/W”(비트 0). R/W 비트는 교환 방향을 결정합니다. 0은 마스터에서 슬레이브로의 데이터 전송을 의미하고(그림 7.14a), 1은 슬레이브에서 읽는 것을 의미합니다(그림 7.14b). I 2 C 버스의 모든 비트는 높은 것에서 낮은 것의 순서로 전송됩니다. 즉, 7번째 비트가 먼저 전송되고 0번째 비트가 마지막에 전송됩니다. 주소 뒤에는 하나 이상의 정보 바이트(R/W 플래그에 의해 지정된 방향)가 올 수 있으며, 그 비트는 SCL 버스의 마스터에 의해 클럭됩니다.

읽기 작업을 수행할 때 호스트는 다음 바이트를 읽으려면 읽은 바이트에 대해 ACK를 보내야 하며, 패킷 읽기가 끝나려고 하면 ACK를 보내지 않아야 합니다(그림 7.14b 참조).

한 전송 주기에서 슬레이브 장치의 주소를 여러 번 재개할 수 있습니다. 즉, 이전 "STOP" 조건 없이 반복된 "START" 조건을 전송하는 것이 허용됩니다(그림 7.14c).

I 2 C 인터페이스를 통해 작동하는 메모리 칩의 일부 기능과 데이터를 교환하는 절차에 주목할 필요가 있습니다. 첫째, 이러한 미세 회로의 비휘발성 데이터 메모리는 메모리 페이지로 나누어지므로 바이트가 기록되면 먼저 전체 페이지가 미세 회로의 내부 RAM에 복사되어 원하는 셀이 변경됩니다. 그 후에는 이전 페이지가 지워지고 그 자리에 새 페이지가 작성됩니다. 또 다른 특징은 슬레이브 주소의 최상위 4비트가 항상 1010과 같아야 한다는 것입니다. 이 요구 사항은 Philips 자체에서 규제합니다.

1-Wire 버스는 통신과 전력 공급을 위해 하나의 도체만 사용합니다. 통신 모드는 비동기식 및 반이중 방식이며 마스터-슬레이브 패턴을 엄격하게 따릅니다. 하나 이상의 슬레이브 장치를 동일한 버스에 동시에 연결할 수 있습니다. 하나의 버스에는 하나의 마스터 장치만 연결할 수 있습니다.

버스의 유휴 상태는 풀업 저항에 의해 생성되는 하이 레벨에 해당합니다. 풀업 저항의 값은 슬레이브 IC 설명서에 나와 있습니다. 버스에 연결된 모든 칩은 낮은 레벨을 생성할 수 있어야 합니다. 마이크로컨트롤러 출력이 세 가지 상태를 지원하지 않는 경우 오픈 콜렉터 또는 오픈 드레인 출력이 있는 드라이버를 제공해야 합니다.

1-Wire 버스를 통한 신호 전송은 60μs 기간의 타임 슬롯으로 나누어집니다. 시간 슬롯당 1비트의 데이터만 전송됩니다. 슬레이브 장치는 정격 시간 지연과 상당한 차이가 있을 수 있습니다. 그러나 이를 위해서는 시간 기반이 다른 부하 직원과의 올바른 의사소통을 보장하기 위해 리더의 보다 정확한 타이밍이 필요합니다.

기본 버스 신호.

마스터는 비트 수준에서 각 통신을 시작합니다. 이는 방향에 관계없이 모든 비트의 전송이 마스터에 의해 시작되어야 함을 의미합니다. 이는 다른 모든 장치의 로직을 동기화하는 버스를 낮게 설정함으로써 달성됩니다. 1-Wire 버스를 통한 통신에는 5가지 주요 명령이 있습니다. “Write log. 1”, “로그를 작성하세요. 0', '읽기', '재설정' 및 '현재 상태'입니다.

신호 “로그를 작성하세요. 1"

신호 “로그를 작성하세요. 1”이 그림에 나와 있습니다. 7.15. 마스터는 1~15 µs의 낮은 레벨을 설정합니다. 그 후에는 남은 시간 동안 버스를 비워줍니다.

쌀. 7.15 – 신호 “로그를 작성하세요. 1"

신호 “로그를 작성하세요. 0"

신호 “로그를 작성하세요. 0”은 그림 7.16에 나와 있습니다. 마스터는 최소 60 µs, 최대 120 µs 동안 낮은 레벨을 생성합니다.

그림 7.16 - 신호 “로그 쓰기. 0"

신호 읽기

"읽기" 신호는 그림 1에 나와 있습니다. 7.17. 마스터는 1~15 µs의 낮은 레벨을 설정합니다. 그런 다음 슬레이브는 로그를 전송하려는 경우 버스를 로우로 유지합니다. 0. 로그 전송이 필요한 경우. 1, 그러면 단순히 라인을 해제합니다. 버스 스캔은 버스가 낮아지고 15μs 이내에 수행되어야 합니다. 마스터 측에서 볼 때 "Read" 신호는 본질적으로 "Write log" 신호입니다. 1". 슬레이브의 실제 내부 상태는 "기록 로그" 신호에 의해 결정됩니다. 1' 또는 '읽기'.

그림 7.17 - "읽기" 신호

재설정/존재 신호

"재설정" 및 "존재" 신호는 그림 7.18에 나와 있습니다. 펄스 시간 간격이 다르다는 점에 유의하십시오. 마스터는 8개의 타임 슬롯(480 µs) 동안 로우로 풀링된 다음 버스를 해제합니다. 이렇게 장기간 낮은 상태를 유지하는 것을 "리셋" 신호라고 합니다.

버스에 슬레이브가 있는 경우 마스터가 버스를 해제한 후 60μs 이내에 최소 60μs의 낮은 레벨을 설정해야 합니다. 이 응답을 "존재"라고 합니다. 그러한 신호가 감지되지 않으면 마스터는 버스에 연결된 장치가 없으며 더 이상 통신이 불가능하다고 가정해야 합니다.

USB(Universal Serial Bus)는 외부 장치를 개인용 컴퓨터에 빠르게 연결한 후 필요한 소프트웨어를 찾아 설치하기 위해 개발되었습니다. 저전력 장치는 인터페이스를 통해 직접 전원이 공급됩니다.

USB 표준은 네트워크에 마스터(호스트) 장치가 하나만 존재함을 의미합니다. 또한 이 표준은 네트워크에서 최대 127개의 슬레이브 장치를 지원합니다. 마스터 장치와 슬레이브 장치를 구별하기 위해 다양한 유형의 커넥터가 개발되었습니다(그림 7.19). 마스터용 A형과 슬레이브용 B형. 5V 전압은 마스터 커넥터인 A형 커넥터에만 존재하는 것으로 인정됩니다. 나머지 장치는 이 장치에서 직접 전원을 공급받습니다.

USB 표준은 4개의 차폐선을 사용하며 그 중 2개는 전원(+5v 및 GND)을 전송합니다(그림 7.19 및 표 7.2). 나머지 두 개는 트위스트 페어 차동 데이터 신호를 나타냅니다. 사용된 인코딩 방식 NRZI(Non Return to Zero Invert) 마스터 및 슬레이브 클럭을 동기화하기 위해 동기화 필드를 사용하여 데이터 전송을 위한 것입니다.

USB 2.0 표준에는 OTG(On-The-Go) 표준이 도입되었습니다. 이는 호스트 협상 프로토콜을 도입하여 두 개의 USB 장치가 누가 마스터 역할을 할지 합의할 수 있게 해줍니다. 이는 휴대폰과 개인용 컴퓨터 등 단일 지점 간 연결로 제한됩니다.

USB는 동적으로 로드 및 언로드된 드라이버와의 "핫"(플러그 앤 플레이) 연결을 지원합니다. 사용자는 간단히 장치를 연결하여 버스에 연결하면 됩니다. 호스트는 연결을 감지하고 새로 삽입된 장치를 폴링하고 적절한 드라이버를 로드하여 로딩 순간을 화면에 모래시계로 표시합니다(USB 장치용 드라이버가 시스템에 이미 설치된 경우). 최종 사용자는 종료 또는 종료에 대해 신경 쓰지 않습니다. IRQ(인터럽트) 및 포트 주소, 컴퓨터 재부팅(재부팅 필요 없음)에 관한 내용은 아닙니다. 사용자가 USB 장치 사용을 마친 후 간단히 장치를 제거하거나 케이블을 뽑으면 호스트가 장치가 없음을 감지하고 자동으로 드라이버를 언로드합니다.

SB 버전 1.1은 두 가지 속도, 즉 12Mbits/s 속도의 최대 속도 모드와 1.5Mbits/s 속도의 저속 모드를 지원합니다. 1.5Mbits/s 모드는 속도가 느리고 EMI(간섭)에 덜 민감하므로 페라이트 비드 비용이 절감되고 부품 품질에 대한 요구 사항도 줄어듭니다.

전속 버스 케이블은 연선 케이블로 실드로 보호되며 저속 작동에도 사용할 수 있습니다. 최소 속도로만 작동하는 케이블(예: 마우스 연결)은 차폐되지 않은 케이블일 수 있습니다.

USB 2.0 표준에는 480Mbits/s의 데이터 전송 속도를 갖춘 고속 모드가 도입되었습니다.

데이터 전송.

인터페이스를 통한 모든 데이터 전송은 호스트에 의해 시작됩니다. 데이터는 패킷 형태로 전송됩니다. USB 인터페이스는 여러 유형의 패킷을 사용합니다.

A) 서명 패키지 (토큰 패키지) 데이터 전송 유형 및 방향, 장치 주소 및 끝점의 일련 번호를 설명합니다(CT는 USB 장치의 주소 지정이 가능한 부분입니다). 기능 패키지는 여러 유형으로 제공됩니다. 안에, 밖으로, SOF, 설정;

나) 데이터 패키지 (데이터 패킷)에는 전송된 데이터가 포함되어 있습니다.

B) 승인 패키지 (악수 패킷)은 데이터 전송 결과를 보고하기 위한 것입니다. 조정 패키지에는 여러 유형이 있습니다. ACK, N.A.K., 마구간.

USB를 통한 데이터 전송은 다음과 같이 수행됩니다.

토큰이라고 불리는 첫 번째 패킷은 전송되는 데이터 유형, 전송 작업(읽기 또는 쓰기), 장치 주소 및 엔드포인트를 설명하기 위해 마스터 장치에 의해 생성됩니다. 일반적으로 다음으로 전송되는 것은 유용한 정보를 전달하는 데이터 패킷이고, 그 다음에는 데이터나 토큰이 성공적으로 수신되었거나 엔드포인트가 정지되었거나 데이터를 수락할 수 없음을 나타내는 핸드셰이킹 패킷이 이어집니다.

USB 표준의 엔드포인트는 데이터의 소스이자 싱크입니다. 모든 장치는 끝점 0을 지원해야 합니다. 이는 열거(연결된 장치 유형을 결정하기 위한 핸들 요청) 동안 그리고 장치가 버스에서 계속 작동하는 동안 모든 제어 및 상태 요청을 수락하는 끝점입니다.

1부터 번호가 매겨진 엔드포인트는 사용자 정보를 전송하는 데 사용됩니다. 몇 가지 예를 살펴보겠습니다.

장치 드라이버는 마스터 장치 끝점 EP1로 전송합니다. 왜냐하면 이 장치가 마스터이고 데이터는 OUT 버퍼 EP1로 들어갑니다. 이 경우 데이터를 전송할 준비가 되었음을 나타내는 OUT 토큰이 전송됩니다. 이 토큰을 받은 슬레이브 장치는 OUT 버퍼에서 데이터를 읽을 수 있습니다.

슬레이브 장치가 마스터로 데이터를 전송해야 하는 경우 이를 IN 버퍼에 배치합니다. 이 버퍼는 마스터가 엔드포인트에서 데이터를 요청하는 IN 토큰을 보낼 때까지 데이터를 보유합니다. 모든 엔드포인트 버퍼는 마스터를 기준으로 이름이 지정됩니다. 슬레이브 장치의 출력 버퍼를 IN이라고 합니다. 이는 마스터 장치의 입력 버퍼입니다.

한 끝점에서 다른 끝점으로의 데이터 전송은 스트림을 통해 수행됩니다. 흐름 – 호스트와 엔드포인트 간의 논리적 연결입니다.

스트림에는 전송 유형(제어, 벌크, Iso 또는 인터럽트), 데이터 흐름 방향 및 최대 패킷/버퍼 크기와 같은 매개변수 세트도 있습니다.

예를 들어 기본 스트림은 전송 유형 제어가 포함된 IN 끝점 0과 OUT 끝점 0으로 구성된 양방향 스트림입니다.

USB는 두 가지 유형의 파이프를 정의합니다.

A) 스트림 파이프미리 정의된 USB 형식이 없으므로 스트림 파이프를 통해 모든 유형의 데이터를 보내고 다른 쪽 끝에서 데이터를 복구할 수 있습니다. 데이터 스트림은 순차적이며 미리 결정된 방향(IN 또는 OUT)을 갖습니다. 스트림 파이프는 대량, 등시성 및 인터럽트 전송 유형을 지원합니다. 스트림 파이프는 호스트나 장치에서 제어할 수 있습니다.

B) 메시지 파이프미리 정의된 USB 형식이 있습니다. 이는 호스트에서 전송된 요청에 의해 시작되며 호스트에 의해 제어됩니다. 데이터는 요청에 지정된 원하는 방향으로 전송됩니다. 따라서 메시지 파이프를 사용하면 데이터를 양방향으로 전송할 수 있지만 제어 전송만 지원됩니다.

USB 표준은 네 가지 유형의 데이터 전송을 설명합니다.

가) 컨트롤 포워딩 (제어 전송)은 장치 구성 및 기타 장치별 목적에 사용됩니다.

나) 스트리밍 (대량 전송)은 상대적으로 많은 양의 정보를 전송하는 데 사용됩니다.

나) 인터럽트 전달 (반복적인 전송)은 상대적으로 적은 양의 정보를 전송하는 데 사용되며 적시에 전송하는 것이 중요합니다. 다른 유형의 전송에 비해 기간이 제한되어 있고 우선순위가 더 높습니다.

D) 등시성 전달 (등시성 전송)을 실시간 스트리밍이라고도 합니다. 이러한 전송을 통해 전송되는 정보에는 생성, 전송 및 수신 중에 실시간 규모가 필요합니다.

스트리밍 전송 전송 중 오류를 감지하고 정보를 다시 요청하여 호스트와 기능 간의 오류 없는 데이터 전송을 보장하는 것이 특징입니다. 호스트가 함수로부터 데이터를 수신할 준비가 되면 함수에 플래그 패킷을 보냅니다. 안에-비닐 봉투. 이에 대한 응답으로 데이터 전송 단계의 기능은 데이터 패킷을 호스트로 전송합니다.

SPI Arduino에서는 Arduino 보드와 연결된 장치 간에 데이터를 교환하는 주요 프로토콜 중 하나입니다. I2C 및 UART와 함께 이 프로토콜은 다양한 유형의 주변 장치에 자주 사용되므로 Arduino 엔지니어에게는 SPI 작동 원리에 대한 지식이 필요합니다. 이 기사에서는 SPI 센서와 화면을 Arduino에 연결하는 기본 원리, 상호 작용 방식 및 방법을 간략하게 살펴보겠습니다.

SPI는 마이크로 컨트롤러(마스터)와 주변 장치(슬레이브) 간에 널리 사용되는 데이터 전송 프로토콜입니다. 우리 프로젝트에서는 Arduino 보드가 마스터로 가장 자주 사용됩니다. SPI 인터페이스는 Motorola에서 개발하고 사용했지만 시간이 지나면서 업계 표준이 되었습니다. 이 인터페이스를 사용할 때의 가장 큰 장점은 빠른 속도와 하나의 데이터 버스에 여러 장치를 연결할 수 있다는 것입니다.

SPI 핀 및 핀

SPI Arduino 인터페이스를 통한 통신은 서로 가까이 위치한 여러 장치 간에 발생합니다. Arduino 보드에는 SPI를 위한 별도의 핀이 장착되어 있습니다. 페어링은 4개의 연락처를 사용하여 이루어집니다.

  • MOSI – 정보는 이 회선을 통해 마스터에서 슬레이브로 전송됩니다.
  • MISO – 슬레이브에서 마스터로 정보를 전송하는 데 사용됩니다.
  • SCLK - 동기식 데이터 전송을 위한 클럭 펄스 생성.
  • SS – 슬레이브 장치 선택.

SPI 장치의 상호 작용

SS 출력이 낮아지면 장치 상호작용이 시작됩니다.

작업을 시작하기 전에 다음을 결정해야 합니다.

  • 이동은 높음 또는 낮음 중 어느 비트에서 시작해야 합니까? 순서는 PI.setBitOrder() 함수를 사용하여 조정됩니다.
  • 클럭 펄스가 없을 때 SCK 라인이 있어야 하는 레벨을 결정합니다. SPI.setDataMode() 함수로 조정 가능합니다.
  • 데이터 전송 속도를 선택하세요. SPI.setClockDivider() 함수에 의해 결정됩니다.

다음 단계는 정보가 어떤 모드로 전송될지 결정하는 것입니다. 모드 선택은 클럭 펄스의 극성 및 위상과 같은 표시기에 의해 결정됩니다. 레벨이 낮으면 0이 기록되고 높음 - 1이 기록됩니다. 총 4가지 모드가 있습니다.

  • 모드 0 – SPI_MODE0: 극성(CPOL) 0, 위상(CPHA) 0.
  • 모드 1: 극성 0, 위상 1.
  • 모드 2: 극성 1, 위상 0.
  • 모드 3: 극성 1, 위상 1.

처음에 Arduino는 가장 중요한 비트부터 데이터를 전송하도록 설계되었지만 시작하기 전에 문서에서 이를 명확히 해야 합니다. 사진의 모드를 시연할 수 있습니다.

SPI 인터페이스에는 독립형과 계단식이라는 두 가지 연결 유형이 있습니다. 첫 번째 경우에는 연결 시 마스터가 각 슬레이브의 주소를 개별적으로 지정하고, 두 번째 경우에는 연결이 하나씩 발생합니다. 종속.

SPI를 Arduino에 연결하기

각 Arduino 모델에는 자체 SPI 핀이 있습니다. 이러한 결론은 다음과 같습니다.

  • Uno: MOSI는 핀 11 또는 ICSP-4, MISO – 12 또는 ICSP-1, SCK – 13 또는 ICSP-3, SS(슬레이브) – 10에 해당합니다.
  • Mega1280 또는 Mega2560: MOSI – 51 또는 ICSP-4, MISO – 50 또는 ICSP-1, SCK – 52 또는 ICSP-3, SS(슬레이브) – 53.
  • 레오나르도: MOSI – ICSP-4, MISO – ICSP-1, SCK – ICSP-3.
  • 기한: MOSI – ICSP-4, MISO –ICSP-1, SCK –ICSP-3, SS(마스터) – 4, 10, 52.

최신 Arduino Due 컨트롤러는 사용자 기능을 확장하고 다른 마이크로 컨트롤러보다 더 많은 작업을 구현할 수 있도록 해줍니다. 예를 들어 슬레이브 장치를 자동으로 제어하고 다양한 구성(클럭 속도, 모드 등)을 자동으로 선택할 수 있습니다.

Arduino SPI 라이브러리

Arduino에서 작업하기 위해 SPI를 구현하는 별도의 라이브러리가 생성되었습니다. 코드를 시작하기 전에 #include를 추가해야 합니다. 라이브러리를 활성화합니다.

주요 기능:

  • start() 및 end() – 작업을 켜고 끕니다. 초기화 중에 SCLK, MOSI 및 SS 라인은 출력에서 ​​구성되어 낮은 레벨을 SCLK, MOSI로 보내고 높은 레벨을 SS로 보냅니다. end() 함수는 라인 레벨을 변경하지 않으며 Arduino 보드의 인터페이스와 관련된 블록을 끄는 데 필요합니다.
  • setBitOrder(order) – 정보 비트 전송 순서 설정(MSBFIRST – 최상위 비트 우선 순위, LSBFIRST – 최하위 비트 우선 순위).
  • setClockDivider(divider) – 주 주파수 클럭 분배기를 설정합니다. 2, 4, 8, 16, 32, 64 및 128의 제수를 설정할 수 있습니다. 이는 다음과 같이 작성됩니다 - SPI_CLOCK_DIVn, 여기서 n은 선택된 제수입니다.
  • setDataMode(mode) – 네 가지 작동 모드 중 하나를 선택합니다.
  • 전송(값) – 마스터 장치에서 바이트를 전송하고 슬레이브 장치에서 수신된 바이트를 반환합니다.
  • ShiftIn(miso_pin, sclk_pin, bit_order) 및 ShiftOut(mosi_pin, sclk_pin, order, value) – 데이터 수신 및 전송은 모든 디지털 핀에 연결할 수 있지만 그 전에 직접 구성해야 합니다.

SPI의 장점과 단점

SPI 인터페이스의 장점:

  • 8비트에 국한되지 않는 대용량 데이터 전송 기능.
  • 소프트웨어를 구현하기 쉽습니다.
  • 하드웨어 구현의 단순성.
  • 병렬 인터페이스보다 필요한 핀 수가 적습니다.
  • 장치의 속도만이 최대 클록 주파수를 제한합니다.

결점:

  • I2C에 비해 핀 수가 많습니다.
  • 슬레이브는 정보의 흐름을 제어할 수 없습니다.
  • 표준 오류 감지 프로토콜이 부족합니다.
  • 인터페이스를 구현하는 다양한 방법.
  • 정보 수신 확인이 부족합니다.

압력 센서가 있는 프로젝트에서 Arduino SPI를 사용하는 예

프로젝트를 구현하려면 Arduino, 압력 센서, 브레드보드 및 전선이 필요합니다. 센서 연결의 예가 그림에 나와 있습니다.

SCP1000 센서를 사용하면 압력, 온도 등의 매개변수를 인식하고 이 값을 SPI를 통해 전송할 수 있습니다.

프로그램 스케치의 기본 요소

먼저 setup()을 이용하여 센서 레지스터를 코드에 등록합니다. 여러 값이 장치에서 반환됩니다. 하나는 수신된 압력에 대해 19비트로, 다른 하나는 온도에 대해 16비트로 반환됩니다. 그 후 두 개의 온도 바이트를 읽고 두 단계로 압력을 읽습니다. 먼저 프로그램은 가장 중요한 3개의 비트를 가져온 다음 다음 16비트를 가져온 다음 비트 시프트를 사용하여 이 두 값을 하나로 결합합니다. 실제 압력은 19자리 값을 4로 나눈 값입니다.

const int 압력 = 0x1F; // 압력 결정의 첫 번째 단계(3개의 최상위 비트가 감지됨)

const int PRESSURE_LSB = 0x20; // 압력에 대해 16비트를 정의하는 두 번째 단계

const int 온도 = 0x21; //온도용 16비트

온도 데이터를 읽고 이를 섭씨로 변환하려면 다음 코드 요소가 사용됩니다.

int tempData = readRegister(0x21, 2);

float realTemp = (float)tempData / 20.0; // 실제 온도 값을 섭씨로 결정하려면 결과 숫자를 20으로 나누어야 합니다.

Serial.print(“온도

Serial.print(realTemp);

압력 비트 읽기 및 결합:

바이트 압력_데이터_높음 = readRegister(0x1F, 1);

압력_데이터_높음 &= 0b00000111;

unsigned int Pressure_data_low = readRegister(0x20, 2);

긴 압력 = ((압력_데이터_높음<< 16) | pressure_data_low) / 4; //определение давления в Паскалях.

SPI에 대한 간략한 결론

SPI 실드와 센서는 Arduino 프로젝트에서 흔히 발견되므로 이 프로토콜이 어떻게 작동하는지 알아야 합니다. 원칙적으로 SPI 장치 연결에는 복잡한 것이 없습니다. 가장 중요한 것은 와이어를 올바르게 연결하고 표준 라이브러리 방법을 올바른 순서로 사용하는 것입니다. SD 카드나 OLED 화면과 같은 일부 장치의 경우 원칙적으로 대안이 없습니다.

안녕하세요! 오늘의 기사는 Arduino 프로그래밍 과정을 마스터하는 데 도움이 될 작은 이론적 여담입니다. SPI 인터페이스에 대해 이야기하겠습니다. 그것이 무엇인지, 무엇과 함께 먹는지에 대해 이 기사에서 알아내려고 노력할 것입니다.

우선, 정의는. SPI(직렬 주변 장치 인터페이스 - 직렬 주변 장치 인터페이스)은 컨트롤러와 다양한 주변기기 간의 통신을 위해 설계된 직렬 동기 데이터 전송 표준입니다. 이 인터페이스는 간단하고 편리합니다. SPI 작업을 위한 특수 라이브러리가 Arduino용으로 작성되었습니다.

통신은 "마스터-슬레이브" 원칙을 기반으로 합니다. 컨트롤러는 일반적으로 마스터 장치입니다. 시스템에 연결된 다른 모든 장치는 슬레이브입니다. 마스터 장치의 데이터는 데이터 버스를 통해 선택된 슬레이브 중 하나로 전송되거나 그 반대로 마스터 클럭 신호를 사용하여 슬레이브 장치에서 마스터로 동기적으로 전송됩니다.

SPI 데이터 버스 핀아웃 4개의 라인으로 구성됩니다: MOSI, MISO, CS 및 SCLK:

  • 모시(마스터 출력 슬레이브 입력 - 마스터 출력, 슬레이브 입력) 또는 단순히 시.– 마스터 장치에서 슬레이브 장치로 데이터 전송이 발생합니다.
  • 미소(마스터 입력 슬레이브 출력 - 마스터 입력, 슬레이브 출력) 또는 단순히 그래서– 슬레이브 장치에서 마스터 장치로 데이터 전송이 발생합니다.
  • C.S.(칩 선택 - 칩 선택) 또는 봄 여름 시즌(슬레이브 선택 - 슬레이브 선택) – 슬레이브 장치 선택.
  • SCLK(직렬 시계) 또는 단순히 SCK– 마스터에서 슬레이브로 클럭 신호를 전송합니다.

마스터에서 슬레이브로 데이터를 전송하려면 마스터가 통신하려는 슬레이브의 CS 라인에서 신호 레벨을 낮게 설정해야 합니다. 그런 다음 비트는 MOSI 라인을 통해 전송됩니다. 데이터 전송을 중지하기 위해 리더는 CS 라인을 "해제"하여 높은 신호 레벨을 설정합니다.

여러 슬레이브 장치를 SPI 데이터 버스에 연결하려면 각 슬레이브 장치마다 고유한 개별 CS 라인이 있어야 합니다. 이 작업이 완료되면 마스터 장치는 교대로 라인을 "당겨" 슬레이브 장치 간에 전환할 수 있습니다. 여러 슬레이브를 병렬 또는 직렬 등 다양한 방법으로 연결할 수 있습니다.

SPI 데이터 버스를 통한 슬레이브 장치의 병렬 연결

여러 슬레이브 장치의 병렬 연결의 특징은 공통 라인 SCLK, MOSI 및 MISO가 통신을 생성하는 데 사용된다는 것입니다. 이 경우 각 슬레이브 장치에는 자체 SS(CS) 라인이 있습니다. 마스터 장치는 해당 SSn 라인(여기서 n – 1,2...)에서 낮은 신호 레벨을 생성하여 데이터 교환을 설정할 "현재 슬레이브"를 결정합니다.

SPI 인터페이스를 통해 n개의 슬레이브 장치를 컨트롤러에 연결하려면 해당 장치를 이 목적으로 할당해야 합니다. n+3마이크로 컨트롤러 핀.

슬레이브 장치를 SPI 버스에 직렬 연결

슬레이브 장치의 직렬 연결은 공통 라인 SCLK와 SS를 사용하며 한쪽의 출력이 다른 쪽의 입력으로 연결됩니다. 마스터의 MOSI 라인은 첫 번째 슬레이브에 연결되고 MISO 라인은 마지막 슬레이브에 연결됩니다. 마스터 장치의 관점에서 이 연결을 살펴보면 하나의 슬레이브 장치가 SPI 데이터 버스를 통해 연결됩니다.

이러한 유형의 연결의 이점에 주목해야 합니다. 이 목적을 위해 마이크로 컨트롤러의 4개 핀만 사용하여 n번째 장치를 연결할 수 있습니다.

지금은 그게 전부입니다. 계속해서...

오늘 우리는 타이어에 대해 알아가기 시작합니다. SPI(직렬 주변기기 인터페이스).

이 버스는 전자공학에 매우 널리 사용됩니다. 동기식 및 전이중 방식으로 매우 편리하므로 센서, 컨트롤러, 드라이버 및 기타 장치와 같은 다양한 디지털 장치 간의 통신을 위해 많은 회로에 사용됩니다.

우리가 알아야 할 또 다른 중요한 요소는 이 버스가 컨트롤러의 하드웨어로 구성되어 있다는 것입니다. AVR.

또한 원하든 원하지 않든 컨트롤러가 이 인터페이스를 통해 플래시되기 때문에 처음으로 컨트롤러 플래시를 시작하자마자 오랫동안 SPI 인터페이스와 통신해 왔습니다.

그래서 저는 이 타이어에 대해 더 잘 알고 싶습니다.

Atmega8 컨트롤러에 대한 기술 문서를 열고 이 컨트롤러의 핀아웃이 표시된 페이지를 열고 핀 16~19가 SPI 버스 핀이 있는 위치를 확인하세요.

이제 이러한 결과에 대해 좀 더 자세히 알아보겠습니다.

SS(칩 선택)— 이것은 장치 선택 다리입니다. 이 핀의 슬레이브 장치가 낮은 레벨로 설정되면 이 장치는 SPI 버스를 통해 응답하고 정보를 교환하지만, 높은 레벨이면 그렇지 않습니다.

MOSI(마스터 출력 슬레이브 입력)- 마스터 장치의 출력 핀이자 슬레이브 장치의 입력 핀입니다.

MISO(마스터 입력 슬레이브 출력)- 반대로 슬레이브의 출력, 마스터의 입력이 됩니다.

SCK— 동기화 다리. 이 버스에서 정보 교환에 참여하는 모든 장치에는 특정 주파수의 클럭 펄스가 제공됩니다.

다음은 Atmega8 컨트롤러의 SPI 버스 구현 다이어그램입니다.

다른 버스와 마찬가지로 특정 정보를 저장하는 레지스터가 많이 있습니다.

우리는 SHIFT REGISTER에 관심이 있으며 이를 통해 정보가 교환됩니다. 설정에 따라 동기화 핀에 특정 에지가 하강 또는 상승하는 경우 슬레이브 및 마스터 장치의 레지스터는 모든 정보가 아닌 단 1비트만 정보를 교환합니다. 이러한 레지스터는 왼쪽으로 이동하고 각 레지스터의 최상위 비트는 관련 장치의 동일한 레지스터의 최하위 비트로 이동합니다. 즉, 슬레이브는 MOSI 핀을 통해 가장 중요한 비트를 리더에게 전송하고, 리더는 이를 왼쪽 시프트로 인해 비워진 하위 비트에 기록하고, 슬레이브는 MISO를 통해 대체된 상위 비트를 전송합니다. 리더의 하위 비트에 고정합니다. 이것이 교환이 진행되는 방식입니다. 즉, 8개의 전체 클록 주기 안에 바이트를 완전히 교환합니다.

1바이트 정보 중 8비트가 모두 전송되자마자 특정 레지스터가 이 프로세스가 완료되었음을 알려줍니다. 또는 오히려 특정 레지스터의 특정 비트입니다.

또한 블록 다이어그램에는 입력이 클럭 펄스를 수신한 다음 특정 값으로 나누어 체인을 통해 SCK 핀으로 전송되고 거기에서 핀의 슬레이브 장치로 공급되는 분배기를 볼 수 있습니다. 같은 이름. 이를 통해 장치의 동기화된 작동이 보장됩니다. 클럭 주파수는 교환에 참여하는 모든 장치가 지원하는 가장 낮은 주파수에서 선택됩니다.

주어진 회로에 두 개 이상의 장치가 있을 수 있기 때문에 복수형이라고 말합니다. 장치에 주소가 없는 경우 이를 보장하는 방법을 이제 알려 드리겠습니다.

여러 장치 간에 정보를 교환하는 방법에는 여러 가지가 있습니다. 즉, 하나의 마스터 장치에 여러 개의 슬레이브가 있는 경우입니다. 그 중 가장 일반적인 두 가지를 살펴보겠습니다.

첫 번째 방법은 방사형입니다(이미지를 확대하려면 그림을 클릭하세요).

여기서 마스터는 SS 핀의 논리 0을 켜서 특정 장치로 데이터를 보냅니다. 이 방법을 사용하면 하나의 장치만 선택할 수 있으며 컨트롤러 포트에 여러 개의 빈 핀도 필요합니다.

또 다른 흥미로운 방법이 있습니다 - 링 또는 캐스케이드(이미지를 확대하려면 사진을 클릭하십시오)

여기서 우리는 선택 다리가 모두 평행하고 교환이 원을 그리며 진행되는 것을 볼 수 있습니다. 따라서 전송 범위가 증가하므로 속도는 감소하지만 포트 레그는 저장됩니다.

우리는 프로젝트에서 특정 장치를 사용할 때 다음 강의에서 이 모든 것을 더 자세히 연구할 것입니다.

글쎄요, 버스를 통한 데이터 전송 회로에 있는 것 같습니다. SPI우리는 그것을 알아 냈습니다.

이제 AVR 컨트롤러의 하드웨어 레지스터 수준에서 이 프로세스를 제어하는 ​​방법을 알아 보겠습니다.

페이지 위의 블록 다이어그램에서 이러한 레지스터를 볼 수 있습니다.

Atmega8에는 SPI 버스 서비스를 위해 다음과 같은 레지스터가 있습니다.

SPDR(SPI 데이터 레지스터)- 데이터 레지스터, 블록 다이어그램에서는 DATA BUFFER입니다. 슬레이브 장치로의 후속 전송을 위해 이 레지스터에 바이트를 입력하고, 이 레지스터에서 슬레이브 장치에서 나온 정보의 바이트를 읽습니다. 또한 컨트롤러가 마스터 장치가 될 필요도 없습니다. 이어서 두 개의 컨트롤러로 구성된 회로를 조립할 것이며 그 중 하나는 슬레이브가 될 것입니다. 따라서 송신 및 수신을 위한 바이트가 위치하는 것은 이 레지스터에 있습니다.

SPCR(SPI 제어 레지스터)- 제어 레지스터

이 레지스터에는 다음 비트가 포함됩니다.

SPIE(SPI 인터럽트 활성화)- 인터럽트를 활성화하는 비트입니다.

SPE(SPI 활성화)— SPI 버스를 활성화하는 비트입니다.

DORD(데이터 순서)— 비트가 전송되는 순서를 설정하는 비트로, 1로 설정되면 최하위 비트가 먼저 전송되고, 0으로 설정되면 최상위 비트가 전송됩니다.

MSTR(마스터/슬레이브 선택)— 장치를 마스터 또는 슬레이브로 지정하는 비트입니다. 이 비트가 1로 설정되면 장치가 마스터가 됩니다.

CPOL(클럭 극성)— 동기화 극성은 대기 모드가 시작될 동기화 펄스의 에지에서 결정됩니다.

이 비트가 1이면 상승 에지가 있는 대기 모드가 되고, 0이면 하강 에지가 있는 대기 모드가 됩니다.

CPHA(클럭 단계)— 클럭 위상, 즉 비트가 전송될 에지를 담당하는 비트입니다.

CPOL 및 CPHA 설치에 따른 데이터 전송 다이어그램을 살펴 보겠습니다.

이것은 매우 흥미로운 의존성입니다. 때때로 우리는 장치의 기술적 특성에서 장치가 SPI 0:0 및 SPI 1:1 모드에서 작동할 수 있다는 것을 볼 수 있으며, 이것이 바로 이러한 비트 설정과 관련된 것입니다.

SPR1, SPR0(SPI 클록 속도 선택)- 동기화 주파수 분배기의 값을 담당하는 비트입니다. 비트와 함께 작동합니다. SPI2X상태 레지스터에 위치합니다. 제어 레지스터의 8비트로는 모든 설정에 충분하지 않고 상태 레지스터에 사용 가능한 비트가 많기 때문에 제어용 비트이기도 합니다.

SPSR(SPI 상태 레지스터)- 상태 레지스터

SPI2X(이중 SPI 속도 비트)- 제어 레지스터의 SPR1 및 SPR0 비트와 함께 작동하여 속도를 두 배로 늘리는 비트입니다.

이 세 비트에 대한 주파수의 의존성을 살펴 보겠습니다.

SPIF(SPI 인터럽트 플래그)— 인터럽트 플래그. 이 비트가 1로 설정되기를 기다리고 있습니다. 우리가 바이트를 받을 때. 다른 장치의 바이트가 버퍼에 완전히 나타나는 즉시 이 플래그가 설정됩니다. 이 플래그는 인터럽트를 활성화하는 비트가 설정되고 전역 인터럽트가 활성화된 경우에만 작동합니다.

WCOL(충돌 플래그 쓰기)— 데이터 전송 중에 비트 충돌이 있거나 데이터 전송 중에 데이터 레지스터에 쓰려고 시도하면 충돌 또는 충돌 플래그가 설정됩니다.

자, 이제 우리는 SPI 인터페이스에 조금 익숙해졌다고 말할 수 있습니다.

비디오 튜토리얼 보기(사진을 클릭하세요)

게시물 조회수: 6,294

10Ω ~ 1MOhm 등급);

  • 전선 연결(예를 들어 이것은 좋은 세트입니다)
  • Arduino IDE 개발 환경을 갖춘 개인용 컴퓨터.
  • 1 시리얼 설명 SPI 인터페이스

    SPI - 직렬 주변 장치 인터페이스 또는 "직렬 주변 장치 인터페이스"페어링을 위한 동기식 데이터 전송 프로토콜입니다. 마스터 장치와 함께 주변기기(슬레이브). 마스터 장치는 마이크로컨트롤러인 경우가 많습니다. 장치 간 통신은 4선을 통해 이루어지므로 SPI를 "4선 인터페이스"라고도 합니다. 타이어는 다음과 같습니다.

    4가지 데이터 전송 모드가 있습니다( SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), 클럭 펄스의 극성 조합으로 인해 발생합니다(HIGH 또는 LOW 레벨에서 작동함). 클록 극성, CPOL및 클럭 펄스의 위상(클럭 펄스의 상승 또는 하강 에지에서 동기화), 클록 위상, CPHA.

    그림은 이 표를 설명합니다.

    SPI 인터페이스는 슬레이브 장치 연결을 위한 여러 옵션을 제공합니다. 독립적인그리고 종속. SPI 버스에 독립적으로 연결된 경우 마스터 장치는 각 슬레이브 장치에 개별적으로 액세스합니다. 캐스케이드 연결을 사용하면 슬레이브 장치가 캐스케이드처럼 하나씩 작동합니다.


    SPI 인터페이스를 통한 작동을 위한 장치 연결 유형: 독립형 및 캐스케이드형

    2 SPI 인터페이스 구현 Arduino 가족 보드에서

    Arduino에서 SPI 인터페이스 버스는 특정 포트에 있습니다. 각 보드에는 고유한 핀 할당이 있습니다. 편의상 결론을 중복하여 별도의 책자에 올려 놓았습니다. ICSP 커넥터(회로 직렬 프로그래밍에서는 직렬 프로토콜을 사용하여 회로에 포함된 장치를 프로그래밍합니다.) ICSP 커넥터에는 슬레이브 선택 핀(SS)이 없습니다. Arduino가 네트워크의 마스터 장치로 사용될 것이라고 가정합니다. 그러나 필요한 경우 Arduino의 모든 디지털 핀을 SS로 할당할 수 있습니다.

    그림은 Arduino UNO 및 Nano의 SPI 버스에 대한 핀의 표준 대응을 보여줍니다.


    3 업무용 도서관 SPI 인터페이스 포함

    SPI 프로토콜을 구현하는 Arduino용 특수 라이브러리가 작성되었습니다. 다음과 같이 연결됩니다. 프로그램 시작 부분에 추가합니다. #include SPI.h.

    SPI 프로토콜 사용을 시작하려면 설정을 지정한 다음 절차를 사용하여 프로토콜을 초기화해야 합니다. SPI.beginTransaction(). 하나의 명령으로 이 작업을 수행할 수 있습니다. SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0))

    이는 SPI 프로토콜을 14MHz의 주파수로 초기화하고 SPI_MODE0 모드에서 MSB(최상위 비트)부터 데이터 전송이 발생한다는 것을 의미합니다.

    초기화 후 해당 SS 핀을 상태로 이동하여 슬레이브 장치를 선택합니다. 낮은.

    그런 다음 명령을 사용하여 데이터를 슬레이브 장치로 전송합니다. SPI.transfer().

    이전 후 SS를 주정부로 반환합니다. 높은.


    프로토콜 작업은 다음 명령으로 완료됩니다. SPI.endTransaction().

    다른 장치가 다른 설정을 사용하여 데이터 전송을 시작하려고 시도하는 경우 문제를 방지하려면 SPI.beginTransaction() 및 SPI.endTransaction() 명령 사이의 전송 시간을 최소화하는 것이 좋습니다.

    4 시프트 레지스터 연결아두이노에

    SPI 인터페이스의 실제 적용을 고려해 봅시다. SPI 버스를 통해 8비트 시프트 레지스터를 제어하여 LED를 켜겠습니다. 아두이노에 연결해보자 시프트 레지스터 74HC595. 제한 저항을 통해 8개의 레지스터 출력 각각에 공칭 값이 220Ω인 LED를 연결합니다. 다이어그램이 그림에 나와 있습니다.


    5 시프트 레지스터 제어를 위한 스케치 SPI 인터페이스를 통해

    이렇게 스케치를 작성해 보겠습니다.

    #포함하다 const int pinSelect = 8; // 선택 핀 등록 무효 설정() ( SPI.begin(); // SPI 인터페이스 초기화 pinMode(pinSelect, OUTPUT); // digitalWrite(핀선택, LOW); // 슬레이브 장치 선택(레지스터) SPI.transfer(0); // 레지스터의 내용을 지웁니다. digitalWrite(pinSelect, HIGH); // 전송 끝 Serial.begin(9600); } 무효 루프() ( for (int i=0; i )

    먼저 SPI 라이브러리를 연결하고 SPI 인터페이스를 초기화하겠습니다. 핀 8을 SS 슬레이브 선택 핀으로 정의해 보겠습니다. 값 "0"을 전송하여 시프트 레지스터를 삭제해 보겠습니다. 직렬 포트를 초기화합니다.

    시프트 레지스터를 사용하여 특정 LED를 켜려면 입력에 8비트 숫자를 적용해야 합니다. 예를 들어, 첫 번째 LED가 켜지도록 하려면 이진수 00000001, 두 번째 LED에 00000010, 세 번째 LED에 00000100 등을 제공합니다. 이 이진수를 십진수 체계로 변환하면 1, 2, 4, 8, 16, 32, 64, 128의 수열을 형성하며 0에서 7까지 2의 거듭제곱입니다.

    이에 따라 주기에 고리() LED 수에 따라 0에서 7까지 다시 계산됩니다. 기능 pow(기본, 정도)루프 카운터의 거듭제곱만큼 2를 올립니다. 마이크로컨트롤러는 "double" 유형의 숫자에서는 매우 정확하게 작동하지 않으므로 반올림 기능을 사용하여 결과를 정수로 변환합니다. 둥근(). 그리고 결과 숫자를 시프트 레지스터로 전송합니다. 명확성을 위해 직렬 포트 모니터는 이 작업 중에 얻은 값을 표시합니다. 장치는 방전을 통해 "실행"됩니다. LED는 파동으로 켜집니다.

    6 "런닝 웨이브" LED에서

    LED가 하나씩 켜지고 우리는 빛의 "파동"이 흐르는 것을 관찰합니다. LED는 SPI 인터페이스를 통해 연결된 시프트 레지스터를 사용하여 제어됩니다. 결과적으로 8개의 LED를 제어하는 ​​데 Arduino 핀 3개만 사용됩니다. LED를 Arduino의 디지털 포트에 직접 연결하는 경우 각 LED에 대해 별도의 포트를 사용해야 합니다.

    우리는 SPI 버스와 함께 작동하는 Arduino의 가장 간단한 예를 연구했습니다. 별도의 기사에서 독립적이고 계단식으로 연결된 여러 시프트 레지스터의 작동에 대해 자세히 고려할 것입니다.