- SPI 통신 프로토콜이란?
- SPI 프로토콜은 어떻게 작동합니까?
- I2C와 SPI 통신의 차이점
- XC8 컴파일러를 사용하는 PIC16F877A가있는 SPI :
- SPI 헤더 파일 설명 :
- 주요 프로그램 설명 :
- SPI 디버거로 PIC 시뮬레이션 :
PIC 마이크로 컨트롤러는 임베디드 프로젝트를 위해 마이크로 칩에서 제공하는 강력한 플랫폼입니다. 다재다능한 특성으로 인해 많은 응용 프로그램에 대한 방법을 찾을 수 있었지만 아직 많이 성장하지 않았습니다. PIC 튜토리얼을 따랐다면 이미 기초부터 시작 하여 PIC 마이크로 컨트롤러에 대한 광범위한 튜토리얼을 다루었 음을 알 수있을 것 입니다. 동일한 흐름 에서 PIC에서 사용할 수있는 통신 프로토콜 과 사용 방법을 배우고 있습니다. 우리는 이미 PIC 마이크로 컨트롤러로 I2C를 다루었습니다.
방대한 임베디드 애플리케이션 시스템에서 어떤 마이크로 컨트롤러도 자체적으로 모든 활동을 수행 할 수 없습니다. 어떤 단계에서는 정보를 공유하기 위해 다른 장치 와 통신해야합니다. 이러한 정보를 공유하기위한 다양한 유형의 통신 프로토콜 이 있지만 가장 많이 사용되는 프로토콜 은 USART, IIC, SPI 및 CAN 입니다. 각 통신 프로토콜에는 고유 한 장점과 단점이 있습니다. 이 튜토리얼에서 배울 것이기 때문에 지금 은 SPI 프로토콜 에 집중하겠습니다.
SPI 통신 프로토콜이란?
SPI 라는 용어 는“ 직렬 주변 장치 인터페이스 ”를 의미합니다. 두 마이크로 컨트롤러간에 데이터를 전송하거나 센서에서 마이크로 컨트롤러로 데이터를 읽고 쓰는 데 사용되는 일반적인 통신 프로토콜입니다. 또한 SD 카드, 시프트 레지스터, 디스플레이 컨트롤러 등과 통신하는 데 사용됩니다.
SPI 프로토콜은 어떻게 작동합니까?
SPI 통신은 동기식 통신입니다. 즉, 데이터를 교환하는 두 장치간에 공유되는 클럭 신호의 도움으로 작동합니다. 또한 별도의 버스를 이용하여 데이터를 송수신 할 수 있기 때문에 전이중 통신입니다. SPI 통신이 운영하는 5 전선이 필요합니다. 마스터와 슬레이브 간의 간단한 SPI 통신 회로는 다음과 같습니다.
통신에 필요한 5 개의 와이어는 SCK (시리얼 클럭), MOSI (마스터 아웃 슬레이브 인), MISO (마스터 인 슬레이브 아웃) 및 SS (슬레이브 선택)입니다. SPI 통신은 항상 마스터와 슬레이브 사이에서만 발생합니다. 마스터는 여러 슬레이브를 연결할 수 있습니다. 마스터는 클럭 펄스를 생성하는 역할을하며 동일한 펄스가 모든 슬레이브와 공유됩니다. 또한 모든 통신은 마스터에 의해서만 시작될 수 있습니다.
SCK 핀 (일명 SCL- 시리얼 클럭)은 마스터가 생성 한 클럭 신호를 슬레이브와 공유합니다. MOSI 핀 (일명 SDA – Serial Data Out)은 마스터에서 Salve로 데이터를 전송하는 데 사용됩니다. MISO 핀 (일명 SDI – Serial Data In)은 salve에서 마스터로 데이터를 가져 오는 데 사용됩니다. 위 그림의 화살표를 따라 데이터 / 신호의 움직임을 이해할 수도 있습니다. 마지막으로 SS 핀 (일명 CS – 칩 선택)은 마스터에 하나 이상의 슬레이브 모듈이 연결되어있을 때 사용됩니다. 필요한 슬레이브를 선택하는 데 사용할 수 있습니다. 하나 이상의 슬레이브가 SPI 통신을 위해 마스터에 연결된 샘플 회로가 아래 회로에 나와 있습니다.
I2C와 SPI 통신의 차이점
우리는 이미 PIC와의 I2C 통신을 배웠으므로 I2C의 작동 방식과 I2C를 사용하여 RTC 모듈을 인터페이스하는 데 사용할 수있는 위치에 대해 잘 알고 있어야합니다. 하지만 이제 이미 I2C가 있는데 왜 SPI 프로토콜이 필요한가요? 그 이유는 I2C 및 SPI 통신 모두 자체 방식의 장점이므로 애플리케이션에 따라 다릅니다.
I2C는 핀 수가 적고 버스에 연결된 슬레이브 수가 많을 때 매우 편리하기 때문에 I2C 통신은 SPI 통신보다 약간의 이점이 있다고 생각할 수 있습니다. 그러나 I2C의 단점은 데이터를 보내고받는 데 동일한 버스가 있으므로 비교적 느리다는 것입니다. 따라서 순전히 애플리케이션을 기반으로 프로젝트에 대한 SPI와 I2C 프로토콜 중 하나를 결정합니다.
XC8 컴파일러를 사용하는 PIC16F877A가있는 SPI:
이제 충분한 기본 사항으로 MPLABX IDE 및 XC8 컴파일러를 사용하여 PIC16F877A 마이크로 컨트롤러 에서 SPI 통신을 사용하는 방법을 알아 보겠습니다. 시작하기 전에이 튜토리얼은 XC8 컴파일러를 사용하는 PIC16F877a의 SPI에 대해서만 설명 합니다. 프로세스는 다른 마이크로 컨트롤러에서도 동일하지만 약간의 변경이 필요할 수 있습니다. 또한 PIC18F 시리즈와 같은 고급 마이크로 컨트롤러의 경우 컴파일러 자체에 SPI 기능을 사용하기 위해 내장 된 라이브러리가있을 수 있지만 PIC16F877A의 경우에는 그런 것이 없으므로 자체적으로 빌드 해 보겠습니다. 여기에 설명 된 라이브러리는 PIC16F877A가 다른 SPI 장치와 통신하는 데 사용할 수있는 다운로드 용 헤더 파일로 하단에 제공됩니다.
이 튜토리얼 에서는 SPI 통신을 사용하여 SPI 버스에서 데이터를 쓰고 읽는 작은 프로그램을 작성 합니다. 그런 다음 Proteus 시뮬레이션을 사용하여 동일한 사항을 확인합니다. SPI 레지스터와 관련된 모든 코드는 PIC16f877a_SPI.h라는 헤더 파일 내에서 작성됩니다. 이렇게하면 SPI 통신이 필요한 모든 향후 프로젝트에서이 헤더 파일을 사용할 수 있습니다. 그리고 메인 프로그램 내에서 헤더 파일의 함수를 사용합니다. 헤더 파일과 함께 전체 코드는 여기에서 다운로드 할 수 있습니다.
SPI 헤더 파일 설명:
헤더 파일 내에서 PIC16F877a에 대한 SPI 통신을 초기화해야합니다. 언제나 그렇듯이 시작하기 가장 좋은 곳은 PIC16F877A 데이터 시트입니다. PIC16F8777a에 대한 SPI 통신을 제어하는 레지스터는 SSPSTAT 및 SSPCON 레지스터입니다. 데이터 시트 74 페이지와 75 페이지에서 이에 대해 알아볼 수 있습니다.
SPI 통신을 초기화하는 동안 선택해야하는 많은 매개 변수 옵션이 있습니다. 가장 일반적으로 사용되는 옵션은 클럭 주파수가 Fosc / 4로 설정되고 중간에서 수행되고 클럭이 이상적인 상태에서 낮게 설정된다는 것입니다. 따라서 헤더 파일에도 동일한 구성을 사용하고 있으므로 각 비트를 변경하여 쉽게 변경할 수 있습니다.
SPI_Initialize_Master ()
SPI initialize Master 기능은 SPI 통신을 마스터로 시작하는 데 사용됩니다. 이 기능 내에서 각각의 핀 RC5와 RC3을 출력 핀으로 설정합니다. 그런 다음 SPI 통신을 켜기 위해 SSPTAT 및 SSPCON 레지스터를 구성합니다.
void SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // 74 / 234 페이지 SSPCON = 0b00100000; // 75 / 234 페이지 TRISC3 = 0; // 설정 슬레이브 모드 출력으로 }
SPI_Initialize_Slave ()
이 기능은 마이크로 컨트롤러가 SPI 통신을 위해 슬레이브 모드에서 작동하도록 설정하는 데 사용됩니다. 슬레이브 모드에서는 핀 RC5를 출력으로 설정하고 핀 RC3을 입력으로 설정해야합니다. SSPSTAT 및 SSPCON은 슬레이브와 마스터 모두에 대해 동일한 방식으로 설정됩니다.
무효 SPI_Initialize_Slave () { TRISC5 = 0; // SDO 핀은 출력으로 선언되어야합니다 . SSPSTAT = 0b00000000; // 74 / 234 페이지 SSPCON = 0b00100000; // 75 / 234 페이지 TRISC3 = 1; // 마스터 모드에서 아웃으로 설정 }
SPI_Write (문자 수신)
SPI 쓰기 기능은 SPI 버스에 데이터를 쓰는 데 사용됩니다. 들어오는 변수를 통해 사용자로부터 정보를 얻은 다음이를 사용하여 버퍼 레지스터로 전달합니다. SSPBUF는 연속 클럭 펄스에서 지워지고 데이터는 비트 단위로 버스로 전송됩니다.
void SPI_Write (char incoming) { SSPBUF = incoming; // 사용자에게 주어진 데이터를 버퍼에 기록 }
SPI_Ready2Read ()
SPI 읽기 준비 기능은 SPI 버스의 데이터가 완전히 수신되었는지, 읽을 수 있는지 확인하는 데 사용됩니다. SSPSTAT 레지스터에는 데이터가 완전히 수신되면 설정되는 BF라는 비트가 있으므로 설정되지 않은 경우이 비트가 설정되었는지 확인한 다음 SPI 버스에서 어떤 내용을 읽도록 설정 될 때까지 기다려야합니다.
unsigned SPI_Ready2Read () { if (SSPSTAT & 0b00000001) return 1; 그렇지 않으면 0을 반환합니다. }
SPI_Read ()
SPI 읽기는 SPI 버스에서 마이크로 컨트롤러로 데이터를 읽는 데 사용됩니다. SPI 버스에있는 데이터는 SSPBUF에 저장됩니다. 전체 데이터가 버퍼에 저장 될 때까지 기다린 다음 변수로 읽을 수 있습니다. 버퍼를 읽기 전에 SSPSTAT 레지스터의 BF 비트를 확인하여 데이터 수신이 완료되었는지 확인합니다.
char SPI_Read () // 수신 된 데이터 읽기 { while (! SSPSTATbits.BF); // BF 비트가 설정 될 때까지 유지하여 완전한 데이터를 읽었는지 확인합니다 . return (SSPBUF); // 읽은 데이터 반환 }
주요 프로그램 설명:
위 섹션에서 설명한 함수는 헤더 파일에 있으며 메인 c 파일로 호출 할 수 있습니다. 따라서 SPI 통신이 작동하는지 확인하는 작은 프로그램을 작성해 보겠습니다. SPI 버스에 데이터를 거의 쓰지 않고 proteus 시뮬레이션을 사용하여 동일한 데이터가 SPI 디버거에서 수신되는지 확인합니다.
늘 그렇듯이 구성 비트를 설정하여 프로그램을 시작하고 다음과 같이 방금 설명한 헤더 파일을 프로그램에 추가하는 것이 매우 중요합니다.
#포함
위에서 다운로드 한 zip 파일에서 프로그램을 연 경우 기본적으로 헤더 파일은 프로젝트 파일의 헤더 파일 디렉토리에 있습니다. 그렇지 않으면 프로젝트 내부에 헤더 파일을 수동으로 추가해야합니다. 일단 추가되면 프로젝트 파일은 아래와 같습니다.
메인 파일 내에서 SPI 통신을위한 마스터로 PIC 를 초기화 한 다음 무한 while 루프 내에서 임의의 3 개의 16 진수 값을 SPI 버스에 기록 하여 시뮬레이션 중에 동일한 값을 수신하는지 확인합니다.
void main () { SPI_Initialize_Master (); while (1) { SPI_Write (0X0A); __delay_ms (100); SPI_Write (0X0F); __delay_ms (100); SPI_Write (0X15); __delay_ms (100); } }
프로그램에서 사용 된 임의의 값은 0A, 0F 및 15이고 16 진수 값이므로 시뮬레이션 중에 동일하게 표시되어야합니다. 즉, 코드가 모두 완료되었습니다. 이것은 샘플 일 뿐이지 만 동일한 방법을 사용하여 다른 MCU 또는 SPI 프로토콜에서 작동하는 다른 센서 모듈과 통신 할 수 있습니다.
SPI 디버거로 PIC 시뮬레이션:
이제 프로그램이 준비되었으므로 컴파일하고 시뮬레이션을 진행할 수 있습니다. Proteus에는 SPI 디버거 라는 편리한 기능 이 있으며 SPI 버스를 통해 데이터를 모니터링하는 데 사용할 수 있습니다. 그래서 우리는 같은 것을 사용하고 아래와 같은 회로를 만듭니다.
시뮬레이션에는 SPI 장치가 하나뿐이므로 SS 핀을 사용하지 않으며 사용하지 않을 때는 위와 같이 접지해야합니다. 16 진수 파일을 PIC16F877A 마이크로 컨트롤러에로드하고 재생 버튼을 클릭하여 프로그램을 시뮬레이션하십시오. 시뮬레이션이 시작되면 아래와 같이 SPI 버스의 데이터를 표시하는 팝업 창이 나타납니다.
들어오는 데이터를 자세히 살펴보고 프로그램에서 작성한 데이터와 동일한 지 확인하겠습니다.
데이터는 우리 프로그램에서 작성한 것과 동일한 순서로 수신되며 동일한 내용이 강조 표시됩니다. SPI 프로토콜을 사용하여 두 개의 PIC 마이크로 컨트롤러와 통신 하도록 프로그램을 시뮬레이션 할 수도 있습니다. 하나의 PIC를 마스터로, 다른 하나를 슬레이브로 프로그래밍해야합니다. 이 목적을 위해 필요한 모든 헤더 파일은 이미 헤더 파일에 제공됩니다.
이것은 SPI가 수행 할 수있는 작업을 간략히 보여주는 것일 뿐이며 여러 장치에서 데이터를 읽고 쓸 수도 있습니다. SPI 프로토콜과 함께 작동하는 다양한 모듈을 인터페이스하여 다가오는 자습서에서 SPI에 대해 자세히 다룰 것입니다.
프로젝트를 이해하고 유용한 것을 배웠기를 바랍니다. 의심스러운 점이 있으면 아래 댓글 섹션에 게시하거나 기술 지원을 위해 포럼을 사용하십시오.
완전한 메인 코드는 다음과 같습니다. 여기에서 모든 코드가 포함 된 헤더 파일을 다운로드 할 수 있습니다.