- I2C 통신 프로토콜이란?
- I2C 통신은 어떻게 작동합니까?
- I2C 통신은 어디에서 사용합니까?
- XC8 컴파일러를 사용하는 PIC16F877a가있는 I2C
- I2C 헤더 파일을 사용한 프로그래밍 :
- Proteus 시뮬레이션 :
PIC 마이크로 컨트롤러는 임베디드 프로젝트를 위해 마이크로 칩이 제공하는 강력한 플랫폼이며, 그 다재다능한 특성으로 인해 많은 애플리케이션에 대한 방법을 찾고 단계는 계속 진행 중입니다. PIC 튜토리얼을 따라왔다면 이미 기초부터 시작하여 PIC 마이크로 컨트롤러에 대한 광범위한 튜토리얼을 다루었 음을 알 수있을 것입니다. 지금부터 우리는 커뮤니케이션 포털과 같은 더 흥미로운 것에 들어갈 수있는 기본 사항을 다루었습니다.
방대한 임베디드 애플리케이션 시스템에서 어떤 마이크로 컨트롤러도 자체적으로 모든 활동을 수행 할 수 없습니다. 어떤 단계에서는 정보를 공유하기 위해 다른 장치 와 통신해야합니다. 이러한 정보를 공유하기위한 다양한 유형의 통신 프로토콜 이 있지만 가장 많이 사용되는 프로토콜 은 USART, IIC, SPI 및 CAN 입니다. 각 통신 프로토콜에는 고유 한 장점과 단점이 있습니다. 이 튜토리얼에서 배울 것이기 때문에 지금 은 IIC 부분 에 집중하겠습니다.
I2C 통신 프로토콜이란?
IIC라는 용어는“ Inter Integrated Circuits ”를 의미합니다. 일반적으로 I2C 또는 I 제곱 C로 표시되거나 일부 장소에서는 2 선 인터페이스 프로토콜 (TWI)로 표시되지만 모두 동일한 의미입니다. I2C는 동기식 통신 프로토콜입니다. 즉, 정보를 공유하는 두 장치 모두 공통 클럭 신호를 공유해야합니다. 정보를 공유하기위한 전선이 두 개 뿐이며 그중 하나는 콕 신호에 사용되고 다른 하나는 데이터 송수신에 사용됩니다.
I2C 통신은 어떻게 작동합니까?
I2C 통신은 Phillips에 의해 처음 도입되었습니다. 앞서 말했듯이 두 개의 와이어가 있으며이 두 개의 와이어는 두 장치에 연결됩니다. 여기서 한 장치를 마스터 라고 하고 다른 장치를 슬레이브 라고합니다. 통신은 마스터와 슬레이브 사이에서 항상 발생해야합니다. I2C 통신의 장점은 하나 이상의 슬레이브를 마스터에 연결할 수 있다는 것입니다.
완전한 통신은 직렬 클럭 (SCL)과 직렬 데이터 (SDA)라는 두 개의 와이어를 통해 이루어집니다.
직렬 클럭 (SCL): 마스터에서 생성 된 클럭 신호를 슬레이브와 공유합니다 .
직렬 데이터 (SDA): 마스터와 슬레이브간에 데이터를 전송합니다.
주어진 시간에 마스터 만 통신을 시작할 수 있습니다. 버스에 하나 이상의 슬레이브가 있기 때문에 마스터는 다른 주소를 사용하여 각 슬레이브를 참조해야합니다. 주소가 지정되면 특정 주소를 가진 고약 만 정보로 응답하고 나머지는 계속 종료합니다. 이렇게하면 동일한 버스를 사용하여 여러 장치와 통신 할 수 있습니다.
I2C 통신은 어디에서 사용합니까?
I2C 통신은 근거리 통신 에만 사용됩니다. 그것은 스마트하게 만들기 위해 동기화 된 클럭 펄스를 가지고 있기 때문에 확실히 어느 정도 신뢰할 수 있습니다. 이 프로토콜은 주로 마스터에 정보를 전송해야하는 센서 또는 기타 장치와 통신하는 데 사용됩니다. 마이크로 컨트롤러가 최소한의 전선 만 사용하여 다른 많은 슬레이브 모듈과 통신해야 할 때 매우 편리합니다. 장거리 통신을 원하는 경우 RS232를 사용하고보다 안정적인 통신을 원하는 경우 SPI 프로토콜을 시도해야합니다.
XC8 컴파일러를 사용하는 PIC16F877a가있는 I2C
충분히 소개 했으니 I2C 통신을 수행하기 위해 마이크로 컨트롤러를 사용하는 방법에 대해 알아 보겠습니다. 시작하기 전에이 튜토리얼은 XC8 컴파일러를 사용하는 PIC16F877a의 I2C에 대해서만 설명 합니다. 프로세스는 다른 마이크로 컨트롤러에서도 동일하지만 약간의 변경이 필요할 수 있습니다. 또한 PIC18F 시리즈와 같은 고급 마이크로 컨트롤러의 경우 컴파일러 자체에 I2C 기능을 사용하기 위해 일부 라이브러리가 내장되어있을 수 있지만 PIC16F877A의 경우 이와 같은 것이 없으므로 자체적으로 빌드 해 보겠습니다. 여기에 설명 된 라이브러리는 PIC16F877A가 다른 I2C 장치와 통신하는 데 사용할 수있는 다운로드 용 헤더 파일로 하단에 제공됩니다.
언제나 그렇듯이 무엇이든 시작하기에 가장 좋은 곳은 데이터 시트입니다. 데이터 시트에서 I2C에 대한 자세한 내용을 찾아 구성해야하는 레지스터를 확인하십시오. 데이터 시트가 이미 당신을 위해 그것을 수행했기 때문에 나는 자세히 설명하지 않을 것입니다. 더 아래에서 헤더 파일에있는 다양한 기능과 프로그램에서의 책임에 대해 설명하겠습니다.
무효 I2C_Initialize ()
초기화 기능은 우리가 I2C 프로토콜을 사용할 것임을 마이크로 컨트롤러에 알리는 데 사용됩니다. 이는 SSPCON 및 SSPCON2 레지스터에 필요한 비트를 설정하여 수행 할 수 있습니다. 첫 번째 단계는 IIC 핀을 입력 핀으로 선언하는 것입니다. 여기서 핀 RC3 및 RC4는 I2C 통신에 사용되어야하므로이를 입력 핀으로 선언합니다. 다음으로 MSSP 제어 레지스터 인 SSPCON과 SSPCON2를 설정해야합니다. 클럭 주파수가 FOSC / (4 * (SSPADD + 1)) 인 IIC 마스터 모드에서 PIC를 작동하고 있습니다. 특정 레지스터가 그렇게 설정되는 이유를 이해하려면 아래 주석 행에 언급 된 데이터 시트의 페이지 번호를 참조하십시오.
따라서 다음으로 클럭 주파수를 설정 해야 합니다. 다른 애플리케이션에 대한 클럭 주파수는 다를 수 있으므로 사용자로부터 변수 feq_k를 통해 선택 하고이를 공식에 사용하여 SSPADD 레지스터를 설정합니다.
void I2C_Initialize (const unsigned long feq_K) // IIC를 마스터로 시작 { TRISC3 = 1; TRISC4 = 1; // SDA 및 SCL 핀을 입력 핀으로 설정 SSPCON = 0b00101000; // pg84 / 234 SSPCON2 = 0b00000000; // pg85 / 234 SSPADD = (_XTAL_FREQ / (4 * feq_K * 100))-1; // 클럭 속도 설정 pg99 / 234 SSPSTAT = 0b00000000; // pg83 / 234 }
무효 I2C_Hold ()
다음으로 중요한 기능은 현재 I2C 작업이 완료 될 때까지 장치의 실행을 유지하는 데 사용되는 I2C_hold 기능입니다. 새로운 작업을 시작하기 전에 I2C 작업을 보류해야하는지 확인해야합니다. 이것은 레지스터 SSPSTAT 및 SSPCON2를 확인하여 수행 할 수 있습니다. SSPSTAT에는 I2C 버스의 상태에 대한 정보가 포함됩니다.
프로그램은 "and"및 "or"연산자를 포함하므로 약간 복잡해 보일 수 있습니다. 당신이 그것을 깰 때
SSPSTAT 및 0b00000100 SSPCON2 및 0b00011111
이는 SSPSTAT의 두 번째 비트가 0이고 유사하게 0에서 4까지의 비트가 SSPCON2에서 0 임을 확인한다는 것을 의미합니다. 그런 다음이 모든 것을 결합하여 결과가 0인지 확인합니다. 결과가 0이면 프로그램은 while 루프 에서 사용되기 때문에 0이 될 때까지 유지됩니다.
void I2C_Hold () { while ((SSPCON2 & 0b00011111)-(SSPSTAT & 0b00000100)); // 레지스터에서 이것을 확인하여 IIC가 진행 중이 아닌지 확인 }
무효 I2C_Begin () 및 무효 I2C_End ()
I2C 버스를 사용하여 데이터를 쓰거나 읽을 때마다 I2C 연결을 시작하고 종료해야합니다. I2C 통신을 시작하려면 SEN 비트를 설정하고 통신을 종료하려면 PEN 상태 비트를 설정해야합니다. 이러한 비트를 토글하기 전에 위에서 설명한대로 I2C_Hold 기능을 사용하여 I2C 버스가 사용 중인지 확인해야합니다.
무효 I2C_Begin () { I2C_Hold (); // 프로그램이 I2C가 사용 중임을 유지 SEN = 1; // IIC 시작 pg85 / 234 } void I2C_End () { I2C_Hold (); // 프로그램이 I2C가 사용 중임을 유지 PEN = 1; // IIC 종료 pg85 / 234 }
무효 I2C_Write ()
쓰기 기능은 마스터 모듈에서 salve 모듈로 데이터 를 보내는 데 사용됩니다. 이 기능은 일반적으로 I2C 시작 기능 이후에 사용되며 그 뒤에는 I2C 종료 기능이 이어집니다. IIC 버스에 기록해야하는 데이터는 가변 데이터를 통해 전달됩니다. 이 데이터는 SSPBUF 버퍼 레지스터에로드되어 I2C 버스를 통해 전송됩니다.
일반적으로 데이터를 쓰기 전에 주소가 기록되므로 쓰기 기능을 두 번 사용해야합니다. 한 번은 주소를 설정하고 다른 한 번은 실제 데이터를 보내야합니다.
void I2C_Write (부호없는 데이터) { I2C_Hold (); // 프로그램은 I2C가 사용 중입니다 . SSPBUF = 데이터; // pg82 / 234 }
서명되지 않은 짧은 I2C_Read ()
우리가 알아야 할 마지막 함수는 I2C_Read 함수입니다. 이 기능은 현재 I2C 버스에있는 데이터를 읽는 데 사용됩니다. 슬레이브에게 어떤 값을 버스에 쓰도록 요청한 후에 사용됩니다. 수신 된 값은 SSPBUF에 있으며 해당 값을 작업을 위해 어떤 변수로든 전송할 수 있습니다.
I2C 통신 중에 마스터가 요청한 데이터를 전송 한 후 슬레이브는 승인 비트 인 다른 비트를 전송합니다.이 비트는 통신이 성공했는지 확인하기 위해 마스터가 확인해야합니다. 승인을 위해 ACKDT 비트를 확인한 후 ACKEN 비트를 설정하여 활성화해야합니다.
unsigned short I2C_Read (unsigned short ack) { 서명되지 않은 짧은 수신; I2C_Hold (); RCEN = 1; I2C_Hold (); 들어오는 = SSPBUF; // SSPBUF에 저장된 데이터 가져 오기 I2C_Hold (); ACKDT = (ack)? 0: 1; // ACK 비트가 수신되었는지 확인 ACKEN = 1; // 페이지 85/234 return incoming; }
즉, 이러한 기능은 I2C 통신을 설정하고 장치에서 데이터를 쓰거나 읽는 데 충분해야합니다. 또한 I2C 통신이 수행 할 수있는 다른 많은 기능이 있지만 단순성을 위해 여기서는 설명하지 않습니다. 당신은 항상 데이터 시트를 참조하여 완전한 작동을 알 수 있습니다.
PIC16F877A I2C 통신을위한 헤더 파일이 포함 된 전체 코드는 링크에서 다운로드 할 수 있습니다.
I2C 헤더 파일을 사용한 프로그래밍:
이제 I2C 통신이 작동하는 방식과이를 위해 생성 된 헤더 파일을 사용하는 방법을 배웠으므로 이제 헤더 파일을 사용하고 I2C 라인에 값을 쓰는 간단한 프로그램을 만들어 보겠습니다. 그런 다음이 프로그램을 시뮬레이션하고 이러한 값이 버스에 기록되는지 확인합니다.
항상 그렇듯이 프로그램은 아래와 같이 구성 비트를 설정하고 클럭 주파수를 20MHz로 설정하는 것으로 시작됩니다.
#pragma config FOSC = HS // 오실레이터 선택 비트 (HS 오실레이터) #pragma config WDTE = OFF // 워치 독 타이머 활성화 비트 (WDT 비활성화 됨) #pragma config PWRTE = ON // 파워 업 타이머 활성화 비트 (PWRT 활성화 됨) # pragma config BOREN = ON // 저전압 리셋 활성화 비트 (BOR 활성화) #pragma config LVP = OFF // 저전압 (단일 전원) 인-서킷 직렬 프로그래밍 활성화 비트 (RB3는 디지털 I / O, HV 켜기 프로그래밍에 MCLR을 사용해야 함) #pragma config CPD = OFF // 데이터 EEPROM 메모리 코드 보호 비트 (데이터 EEPROM 코드 보호 해제) #pragma config WRT = OFF // 플래시 프로그램 메모리 쓰기 활성화 비트 (쓰기 방지 해제, 모든 프로그램 메모리 EECON 제어에 의해 기록 될 수 있음) #pragma config CP = OFF // 플래시 프로그램 메모리 코드 보호 비트 (코드 보호 해제) #define _XTAL_FREQ 20000000
다음 단계는 방금 논의한 헤더 파일 을 추가하는 것입니다. 헤더 파일의 이름은 PIC16F877a_I2C.h 이며 위에서 논의한 링크에서 다운로드 할 수 있습니다. 헤더 파일이 프로젝트 목록의 헤더 파일에 추가되었는지 확인하십시오. 프로젝트 파일 구조는 다음과 같아야합니다.
헤더 파일이 프로젝트 파일에 추가 되었는지 확인한 후 기본 C 파일에 헤더 파일을 포함합니다.
#포함
while 루프 내에서 I2C 통신을 시작 하여 I2C 버스에 임의의 값을 적은 다음 I2C 통신을 종료합니다. 내가 선택한 임의의 값은 D0, 88 및 FF입니다. 원하는 값을 입력 할 수 있습니다. 그러나 시뮬레이션에서 확인할 것이므로 그 값을 기억하십시오.
while (1) { I2C_Begin (); I2C_Write (0xD0); I2C_Write (0x88); I2C_Write (0xFF); I2C_End (); __delay_ms (1000); }
전체 프로그램은 페이지 하단에서 찾을 수 있습니다, 당신은 그것을 사용하거나 여기에서 프로그램의 전체 zip 파일을 다운로드 할 수 있습니다. 프로그램을 컴파일 한 후 시뮬레이션을 준비하십시오.
Proteus 시뮬레이션:
Proteus에는 I2C 버스에서 데이터를 읽는 데 사용할 수있는 I2C 디버거라는 멋진 도구가 있으므로이를 사용하여 회로를 구축하고 데이터가 성공적으로 기록되는지 확인하겠습니다. 전체 회로도 가 아래에 나와 있습니다.
마이크로 컨트롤러를 두 번 클릭하여 프로그램에서 생성 한 16 진수 파일을로드합니다. 그런 다음 프로그램을 시뮬레이션하십시오. I2C 버스에 대한 모든 정보를 표시하는 창이 팝업됩니다. 프로그램 창은 아래와 같습니다.
작성중인 데이터를 자세히 살펴보면 프로그램에서 작성한 데이터와 동일하다는 것을 알 수 있습니다. 값은 D0, 88 및 FF입니다. 값은 1 초마다 기록되므로 시간도 아래와 같이 업데이트됩니다. 파란색 화살표는 마스터에서 슬레이브로 쓰여 졌음을 나타내며 그렇지 않은 경우 반대 방향을 가리 킵니다. 전송되는 데이터에 대한 자세한 내용은 다음과 같습니다.
이것은 I2C가 할 수있는 일을 간단히 보여줄뿐 아니라 여러 장치에 데이터를 읽고 쓸 수도 있습니다. I2C 프로토콜과 함께 작동하는 다양한 모듈을 인터페이스하여 향후 튜토리얼에서 I2C에 대해 자세히 다룰 것입니다.
프로젝트를 이해하고 유용한 것을 배웠기를 바랍니다. 의심스러운 점이 있으면 아래 댓글 섹션에 게시하거나 기술 지원을 위해 포럼을 사용하십시오.
완전한 코드 는 다음과 같습니다. 여기에서 모든 코드가 포함 된 헤더 파일을 다운로드 할 수 있습니다.