- I2C 통신 프로토콜이란?
- I2C 통신은 어떻게 작동합니까?
- I2C 통신은 어디에서 사용합니까?
- Nuvoton N76E003의 I2C-하드웨어 요구 사항
- Nuvoton N76E003과 AT24LC64 인터페이스 – 회로도
- Nuvoton N76E003의 I2C 핀
- N76E003의 I2C 통신
- I2C 통신을위한 N76E003 프로그래밍
- 코드 및 출력 플래시
방대한 임베디드 애플리케이션 시스템에서 어떤 마이크로 컨트롤러도 자체적으로 모든 활동을 수행 할 수 없습니다. 어떤 단계에서는 정보를 공유하기 위해 다른 장치 와 통신해야합니다. 이러한 정보를 공유하기위한 다양한 유형의 통신 프로토콜 이 있지만 가장 많이 사용되는 프로토콜 은 USART, IIC, SPI 및 CAN 입니다. 각 통신 프로토콜에는 고유 한 장점과 단점이 있습니다. 이 튜토리얼에서 배울 것이기 때문에 지금 은 IIC 부분 에 집중하겠습니다. 여기에 처음 오신 분은 매우 기본적인 시작하기 튜토리얼에서 N76E003 마이크로 컨트롤러의 모든 주변 장치에 대해 논의한 Nuvoton 튜토리얼을 확인하십시오. 다른 마이크로 컨트롤러와 함께 I2C를 사용하는 방법을 배우려면 아래 링크를 확인하십시오.
- Arduino에서 I2C를 사용하는 방법: 두 Arduino 보드 간의 통신
- PIC 마이크로 컨트롤러 PIC16F877과의 I2C 통신
- I2C를 사용하여 16X2 LCD와 ESP32 인터페이스
- MSP430 Launchpad와 I2C 통신
- I2C를 사용하지 않고 NodeMCU와 LCD 인터페이스
- Arduino의 단일 프로그램에서 다중 통신 (I2C SPI UART)을 처리하는 방법
I2C는 Philips (현재 NXP)에서 개발 한 중요한 통신 프로토콜입니다. 이 I2C 프로토콜을 사용하여 MCU를 여러 장치와 연결하고 통신을 시작할 수 있습니다. I2C는 SDA와 SCL이라는 두 개의 와이어로만 작동합니다. 여기서 SDA는 직렬 데이터를 나타내고 SCL은 직렬 클럭을 나타냅니다. 그러나이 두 핀에는 VCC 전압 레벨에 대한 풀업 저항이 필요하며 적절한 풀업 저항이있는 경우 버스는 고유 한 주소로 127 개의 장치를 지원할 수 있습니다.
I2C 통신 프로토콜이란?
IIC라는 용어는“ Inter Integrated Circuits ”를 의미합니다. 일반적으로 I2C 또는 I 제곱 C로 표시되거나 일부 장소에서는 2 선 인터페이스 프로토콜 (TWI)로 표시되지만 모두 동일한 의미입니다. I2C는 동기식 통신 프로토콜입니다. 즉, 정보를 공유하는 두 장치 모두 공통 클럭 신호를 공유해야합니다. 정보를 공유하기위한 전선이 두 개 뿐이며, 그중 하나는 클럭 신호에 사용되고 다른 하나는 데이터 송수신에 사용됩니다.
I2C 통신은 어떻게 작동합니까?
I2C 통신은 Phillips에 의해 처음 도입되었습니다. 앞서 말했듯이 두 개의 와이어가 있으며이 두 개의 와이어는 두 장치에 연결됩니다. 여기서 한 장치를 마스터 라고 하고 다른 장치를 슬레이브 라고합니다. 통신은 항상 마스터와 슬레이브 사이에서 발생해야합니다. I2C 통신의 장점은 하나 이상의 슬레이브를 마스터에 연결할 수 있다는 것입니다.
완전한 통신은 직렬 클럭 (SCL)과 직렬 데이터 (SDA)라는 두 개의 와이어를 통해 이루어집니다.
직렬 클럭 (SCL): 마스터에서 생성 된 클럭 신호를 슬레이브와 공유합니다 .
직렬 데이터 (SDA): 마스터와 슬레이브간에 데이터를 전송합니다.
주어진 시간에 마스터 만 통신을 시작할 수 있습니다. 버스에 하나 이상의 슬레이브가 있기 때문에 마스터는 다른 주소를 사용하여 각 슬레이브를 참조해야합니다. 주소가 지정되면 해당 주소를 가진 고약 만 정보로 응답하고 나머지는 조용히합니다. 이렇게하면 동일한 버스를 사용하여 여러 장치와 통신 할 수 있습니다.
I2C 통신은 어디에서 사용합니까?
I2C 통신은 근거리 통신 에만 사용됩니다. 그것은 스마트하게 만들기 위해 동기화 된 클럭 펄스를 가지고 있기 때문에 확실히 어느 정도 신뢰할 수 있습니다. 이 프로토콜은 주로 마스터에 정보를 전송해야하는 센서 또는 기타 장치와 통신하는 데 사용됩니다. 마이크로 컨트롤러가 최소한의 전선 만 사용하여 다른 많은 슬레이브 모듈과 통신해야 할 때 매우 편리합니다. 장거리 통신을 원하신다면 RS232를 시도 하시고보다 안정적인 통신을 원하신다면 SPI 프로토콜을 시도해보십시오.
Nuvoton N76E003의 I2C-하드웨어 요구 사항
이 프로젝트의 요구 사항은 N76E003을 사용하여 I2C 통신 을 배우는 것이므로 I2C 데이터 라인과 연결되는 EEPROM을 사용합니다. 일부 데이터를 EEPROM에 저장하고 동일한 데이터를 읽고 UART 화면을 사용하여 표시합니다.
저장된 값은 UART에 인쇄되므로 모든 종류의 USB to UART 변환기가 필요합니다. N76E003에서 UART 통신을 처음 사용하는 경우 Nuvoton으로 UART에 대한 자습서를 확인할 수도 있습니다. 우리의 응용 프로그램에는 CP2102 UART to USB 변환기를 사용합니다. 위의 것 외에 다음 구성 요소도 필요합니다.
- EEPROM 24C02
- 2pcs 4.7k 저항기
말할 것도없이, 위의 구성 요소 외에 N76E003 마이크로 컨트롤러 기반 개발 보드 와 Nu-Link 프로그래머가 필요 합니다. 또한 모든 구성 요소를 연결하는 데 브레드 보드 및 연결 와이어도 필요합니다.
Nuvoton N76E003과 AT24LC64 인터페이스 – 회로도
아래 회로도에서 볼 수 있듯이 EEPROM은 2 개의 풀업 저항과 함께 I2C 라인에 연결됩니다. 맨 왼쪽에는 프로그래밍 인터페이스 연결이 표시됩니다.
AT24LC64 IC 용 브레드 보드를 사용하고 점퍼 와이어를 사용하여 IC를 누보 톤 프로그래머 보드에 연결했습니다. nu-ink 프로그래머와 함께 내 하드웨어 설정은 다음과 같습니다.
Nuvoton N76E003의 I2C 핀
N76E003의 핀 다이어그램은 아래 이미지에서 볼 수 있습니다.
보시다시피 각 핀은 사양이 다르며 각 핀은 여러 용도로 사용할 수 있습니다. 그러나 핀 1.4는 I2C SDA 핀으로 사용되며 PWM 및 기타 기능을 잃게됩니다. 그러나이 프로젝트에는 다른 기능이 필요하지 않기 때문에 문제가되지 않습니다. P1.3에서도 동일한 일이 I2C의 SCL 핀입니다.
I2C 핀은 GPIO 역할을하므로 구성해야합니다. 모든 GPIO 핀은 아래 설명 된 모드에서 구성 할 수 있습니다.
데이터 시트에 따라 PxM1.n 및 PxM2. n 은 I / O 포트의 제어 작동을 결정하는 데 사용되는 두 개의 레지스터입니다. 데이터 시트에서 I2C 기능을 사용하려면 I / O 모드를 I2C 관련 통신을위한 오픈 드레인으로 사용해야한다고 명시되어 있습니다.
N76E003의 I2C 통신
I2C 주변 장치는 I2C 기능을 지원하는 모든 마이크로 컨트롤러 장치에서 중요한 요소입니다. 다양한 유형의 다양한 마이크로 컨트롤러에는 내장 I2C 주변 장치가 함께 제공됩니다. 그러나 경우에 따라 I2C 관련 하드웨어 지원을 사용할 수없는 소프트웨어 제어를 사용하여 수동으로 I2C를 구성 할 수 있습니다 (예: 많은 8051 마이크로 컨트롤러). 그러나 nuvoton N76E003은 I2C 주변 장치를 지원합니다.
M76E003은 I2C 모드에서 마스터 송신기, 마스터 수신기, 슬레이브 송신기 및 슬레이브 수신기의 네 가지 유형의 작업을 지원합니다. 또한 I2C 라인에 대해 표준 (100kbps) 및 고속 (최대 400kbps) 속도를 지원합니다. I2C는 SCL 및 SDA 신호 라인에서 몇 가지 일반적인 규칙으로 작동합니다.
시작 및 중지 조건:
I2C 통신에서 중요한 것입니다. 데이터가 I2C 라인으로 전송되면 시작 조건에서 시작하여 중지 조건으로 끝납니다.
시작 조건은 SCL 라인이 높을 때 SDA의 높음에서 낮음으로의 전환이고, 중지 조건은 SCL 라인이 높을 때 SDA의 낮음에서 높음으로의 전환입니다. 이 두 조건은 마스터 (MCU 또는 다른 슬레이브 장치를 제어하는 모든 것)에 의해 생성됩니다. 버스 라인은 시작 조건이 시작될 때이 상태에서 사용 중이고 중지 조건이 시작되면 다시 사용 가능 상태를 유지합니다.
시작 및 중지 조건은 N76E003 데이터 시트의 신호 관점에서 훌륭하게 표시됩니다.
데이터 형식의 7 비트 주소:
N76E003은 7 비트 주소 및 데이터 형식을 지원합니다. 시작 조건이 시작된 후 마스터 장치는 데이터를 I2C 라인으로 전송해야합니다. 첫 번째 데이터는 중요한 데이터입니다. 이 데이터가 제대로 생성 또는 전송되지 않으면 연결된 장치가 식별되지 않고 더 이상 통신 할 수 없습니다.
데이터는 SLA로 표시된 7 비트 길이의 슬레이브 주소로 구성됩니다. 이 7 비트 긴 주소는 버스에 여러 장치가 연결된 경우 각 장치에 대해 고유해야합니다. 7 비트 주소 다음의 8 번째 비트는 데이터 방향 비트입니다. 즉, 8 번째 비트에 따라 마스터는 슬레이브 장치에 데이터를 쓸 것인지 슬레이브 장치에서 데이터를 읽을 것인지에 대한 정보를 슬레이브 장치에 보냅니다. 8 번째 비트는 읽기 또는 쓰기 알림이라고하는 R / W 비트입니다. 우리 모두 알고 있듯이 8 비트 정보는 128 개의 유형이 될 수 있으므로 128 개의 장치를 지원하지만 I2C는 동일한 버스에서 127 개의 장치를 지원하지만 128 개는 지원하지 않습니다. 0x00 주소는 일반 호출 주소라고하는 예약 된 주소이기 때문입니다. 마스터가 모든 장치에 정보를 보내려는 경우0x00 주소를 지정하고 각 장치는 개별 소프트웨어 구성에 따라 동일한 방식으로 재생됩니다.
따라서 데이터 전송은 다음과 같습니다.
인정:
위의 데이터 주소 이미지에서 R / W 비트가 뒤 따르는 9 번째 비트를 확인 비트라고합니다. 이 비트를 사용하면 마스터 또는 슬레이브가 SDA 라인을 로우로 당겨 데이터 송신기에 응답하기 때문에 중요한 것입니다. 승인 비트를 얻으려면 송신기가 SDA 라인을 해제해야합니다.
I2C 통신을위한 N76E003 프로그래밍
이 튜토리얼에 사용 된 전체 프로그램은이 페이지 하단에서 찾을 수 있습니다. 코드의 중요한 부분에 대한 설명은 다음과 같습니다.
핀을 오픈 드레인으로 설정하고 I2C 용으로 구성합니다.
먼저 I2C 핀 섹션 부터 시작하겠습니다. 앞에서 설명한대로 I2C SCL 및 SDA 포트를 구성하고 오픈 드레인 구성으로 설정해야합니다. 이를 위해 I2C.c 소스 파일 과 함께 I2C.h 헤더 파일 을 사용 합니다 . 코드 조각은 다음과 같습니다.
{P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} while (0)
위 코드는 P13 및 P14를 Open-Drain 핀으로 설정하고 clr_I2CPX 를 사용하여 P13 및 P14를 P1.3에서 SCL 핀으로 선택하고 P1.4에서 SDA 핀을 선택합니다.
이 I2CPX 는 I2C 제어 레지스터 I2CON 의 0 번째 비트입니다. 이 I2C_PX 가 1로 설정되면 핀은 SCL로 P0.2로, SDA로 P1.6으로 변경됩니다. 그러나 P13 및 P14를 사용합니다. 여기에서는 대체 핀이 사용되지 않습니다.
I2C 제어 레지스터 I2CON:
I2C 제어 레지스터 I2CON은 I2C 작업을 제어하는 데 사용됩니다. 첫 번째 비트는 I2C 핀 선택 비트입니다. 0으로 설정하면 I2C 핀이 P13 및 P14로 구성됩니다.
AA 비트는 승인 어설 션 플래그이며, AA 플래그가 설정되면 SCL 라인의 승인 클럭 펄스 동안 ACK가 반환됩니다. 이것이 지워지면 SCL 라인의 승인 된 클럭 펄스 동안 NACK (SDA의 하이 레벨)가 반환됩니다.
다음 비트는 I2C 상태 인터럽트 인 SI입니다. I2C 상태 인터럽트가 활성화 된 경우 사용자는 I2STAT 레지스터를 확인하여 어떤 단계가 통과되었는지 확인하고 조치를 취해야합니다.
STO는 마스터 모드에서 설정되는 STOP 플래그입니다. STO는 STOP 상태가 감지되면 하드웨어에 의해 자동으로 지워집니다.
다음 비트는 STA 비트입니다. 이 플래그가 설정되면 I2C는 버스가 비어 있으면 START 조건을 생성합니다. 버스가 사용 중이면 I2C는 STOP 조건을 기다린 후 START 조건을 생성합니다. I2C가 이미 마스터 모드이고 하나 이상의 바이트가 전송 또는 수신 된 상태에서 STA가 설정되면 I2C는 반복 된 START 조건을 생성합니다. STA는 소프트웨어에서 수동으로 지워야합니다.
마지막 I2CEN은 I2C 버스 활성화 또는 비활성화 비트입니다.
EEPROM 24C02:
이제 24C02에옵니다. N76E003의 보드 지원 패키지에는 24LC64 용 I2C 코드가 있으며 쉽게 수정할 수 있습니다. 그러나 우리는 I2C 기능을 이해하기 위해 간단한 방법을 사용할 것입니다.
누구든지 EEPROM 24C02와 세부적인 인터페이스를 사용하고 싶다면 BSP의 EEPROM 프로그램을 사용할 수 있습니다.
N76E003이 마스터가되고 EEPROM이 슬레이브가되는 I2C의 24C02 만 연결합니다. 따라서 모든 데이터를 EEPROM 주소에 쓰고 동일하게 읽습니다.
24C02 EEPROM 핀아웃은 다음과 같습니다.
A0, A1 및 A2는 세 개의 주소 선택 핀입니다. WP 핀은 쓰기 방지 핀이며 EEPROM에 쓰기를 활성화하려면 VSS와 연결해야합니다.
바이트 쓰기 기능은 아래 이미지에 나와 있습니다.
전체 쓰기주기는 시작 비트로 발생합니다. 그 후에 제어 바이트를 제출해야합니다. 제어 바이트에는 다음이 필요합니다.
시작 비트 이후에는 슬레이브 주소로 구성됩니다. 1010은 정적이고 A0, A1 및 A2는 하드웨어 연결 기반 주소입니다. 3 개의 핀이 GND 또는 VSS 전원으로 연결되면 0으로 읽습니다. 그렇지 않으면 VCC로 연결되면 1로 읽습니다. 우리의 경우 모든 A0, A1, A2는 VSS로 연결됩니다. 따라서이 모든 것이 0이됩니다.
읽기 또는 쓰기 조건에 지출합니다. 읽기 또는 쓰기 비트가있는 주소의 값은 쓰기의 경우 0xA0, 읽기의 경우 0xA1입니다. 다음은 Acknowledge 비트이며 그 후 데이터를 저장해야하는 위치에 8 비트 주소가 전송되고 마지막으로 해당 위치에 저장 될 데이터가 전송됩니다. 이러한 작업은 주 기능에서 단계별 형식으로 수행됩니다.
주요 기능 및 While 루프:
void main (void) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // 중요, prinft 함수를 사용하려면 TI = 1로 설정해야합니다. I2C_init (); while (1) {EEPROM_write (1,0x55); c = EEPROM_read (1); printf ("\ n 읽은 값은 % x", c & 0xff); }; }
주요 기능은 간단하며 주소 1의 EEPROM에 값을 지속적으로 쓰고 데이터를 읽는 것입니다. 그런 다음 데이터는 printf 함수를 사용하여 인쇄됩니다. printf는 16 진수로 값을 인쇄하고 있습니다.
EEPROM 쓰기 기능은 EEPROM 섹션에서 설명한 다음 항목으로 구성됩니다.
void EEPROM_write (unsigned char 주소, unsigned char 값) {I2C_start (); I2C_write (0xA0); I2C_write (주소); I2C_write (값); I2C_stop (); }
I2C 시작 기능은 다음과 같이 구성됩니다.
void I2C_start (void) {signed int time = timeout; set_STA; clr_SI; while ((SI == 0) && (시간> 0)) {시간-; }; }
이 기능에서 SI 상태는 미리 정의 된 타임 아웃 기간 (미리 정의 된 시간이 1000으로 설정된 I2C.h에 정의 됨)과 함께 확인됩니다. 시작 기능은 STA를 설정하고 SI를 지우는 것으로 시작됩니다.
void I2C_stop (void) {signed int time = timeout; clr_SI; set_STO; while ((STO == 1) && (시간> 0)) {시간-; }; }
Start, Stop 기능과 동일하게 사용됩니다. 정지 기능은 SI를 취소하여 다음에 STO를 설정하여 시작됩니다. 아래 기능은 I2C 읽기 기능입니다.
unsigned char I2C_read (unsigned char ack_mode) {signed int time = timeout; 부호없는 문자 값 = 0x00; set_AA; clr_SI; while ((SI == 0) && (t> 0)) {시간-; }; 값 = I2DAT; if (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; while ((SI == 0) && (t> 0)) {시간-; }; } 반환 값; }
ack_mode 및 I2C_NACK는 , 모두 I2C 헤더 파일에 각각 0과 1로 정의된다.
마찬가지로 쓰기 기능이 생성됩니다.
void I2C_write (unsigned char value) {signed int time = timeout; I2DAT = 가치; clr_STA; clr_SI; while ((SI == 0) && (시간> 0)) {시간-; }; }
코드 및 출력 플래시
코드는 0 개의 경고와 0 개의 오류를 반환했으며 Keil의 기본 플래싱 방법을 사용하여 플래싱되었습니다. 처음 사용하는 경우 코드 업로드 방법을 이해하려면 nuvoton 시작하기 자습서를 확인하세요. 코드의 컴파일 정보는 아래에서 찾을 수 있습니다.
빌드 대상 'I2C_EEPROM'컴파일 중 I2C_EEPROM.c… 컴파일 중 I2C.c… 연결 중… 프로그램 크기: data = 59.2 xdata = 0 code = 2409 ". \ Output \ I2C_EEPROM"에서 16 진수 파일 생성… ". \ Output \ I2C_EEPROM "-오류 0 개, 경고 0 개. 빌드 시간 경과: 00:00:04 Batch-Build 요약: 1 성공, 0 실패, 0 건너 뛰기-경과 시간: 00:00:04
하드웨어가 브레드 보드에 설정되고 예상대로 작동합니다. 아래 이미지에서 볼 수 있듯이 EEPROM에 값을 쓰고 메모리에서 다시 읽어 직렬 모니터에 표시 할 수있었습니다.
이 코드에서 보드가 어떻게 작동하는지에 대한 완전한 데모는 아래의 비디오를 확인하십시오. 튜토리얼을 즐겼고 궁금한 점이 있으면 유용한 것을 배우 셨기를 바랍니다. 아래 댓글 섹션에 남겨주세요. 포럼을 사용하여 다른 기술 질문을 게시 할 수도 있습니다.