1. 통신의 기본 개념
1.1 통신 정의
임베디드 시스템에서의 통신은 두 개 이상의 장치 간 데이터 교환을 의미합니다.
1.2 통신 유형
비동기 vs 동기 통신
| 종류 |
특징 |
예시 |
| 비동기 |
클록 신호 없이 시작/중지 비트 사용 |
UART, RS-232 |
| 동기 |
동일한 클록 신호를 통해 동기화 |
SPI, I2C |
직렬 vs 병렬 통신
| 종류 |
특징 |
장단점 |
예시 |
| 직렬 |
비트 단위로 순차 전송 |
장점: 핀 수 절약, 안정성 단점: 속도 저하 |
UART, I2C |
| 병렬 |
여러 비트 동시 전송 |
장점: 빠른 속도 단점: 핀 수 증가, 노이즈 |
8086 버스 |
단방향/반양방향/전양방향
| 종류 |
특징 |
예시 |
| 단방향 |
일방향 전송만 가능 |
방송, TV |
| 반양방향 |
양방향 but 시간 분할 |
무전기, RS-485 |
| 전양방향 |
동시에 양방향 통신 |
전화, UART |
1.3 전기 규격
TTL 레벨
- 논리 0: 0V
- 논리 1: 3.3V 또는 5V
- 짧은 전송 거리 (1m 미만)
RS-232
- 논리 0: +3V ~ +15V
- 논리 1: -3V ~ -15V
- 최대 전송 거리: 15m
- 포인트 투 포인트
RS-485
- 차동 신호 전송
- 논리 0: A-B < -0.2V
- 논리 1: A-B > +0.2V
- 최대 전송 거리: 1200m
- 멀티 드롭 지원
차동 전송
- 두 개의 반대 위상 신호 사용
- 강력한 잡음 저감 효과
2. 하드웨어 구성 요소
2.1 USB-TTL 모듈
┌─────────────────────┐
│ USB 인터페이스 │
│ (USB Type-B) │
└─────────┬───────────┘
▼
┌─────────────────────┐
│ CH340G │
│ (USB-TTL 변환) │
└─────────┬───────────┘
▼
┌─────────────────────┐
│ UART1_TX/RX │
│ (TTL 레벨) │
└─────────┬───────────┘
▼
┌─────────────────────┐
│ i.MX6ULL SOC │
└─────────────────────┘
2.2 주요 구성 요소 설명
- CH340 칩: USB 신호를 UART 신호로 변환.
- DCDC 전원 모듈: 안정적인 전압 유지.
3. 소프트웨어 구현
3.1 클록 초기화
// UART1 클록 설정
void init_uart_clock(void) {
// 기준 클록 80MHz, 1분주
CCM->CSCDR1 &= ~(0x3F << 0); // 설정 초기화
CCM->CSCDR1 |= (1 << 0); // 1분주 적용
}
3.2 핀 설정
void configure_uart_pins(void) {
// UART1_TX 설정
IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX, 0);
IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX, 0x10B0);
// UART1_RX 설정
IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX, 0);
IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX, 0x10B0);
}
3.3 등록자 설정
(1) 송신 등록자 (UARTx_URXD)
- 읽기 전용.
- RX_DATA[7:0]: 수신된 데이터 저장.
(2) 수신 등록자 (UARTx_UTXD)
- 쓰기 가능.
- 데이터를 작성하면 자동으로 송신 시작.
(3) 제어 등록자 1 (UARTx_UCR1)
- UARTEN: 전체 UART 활성화 (1=활성).
(4) 제어 등록자 2 (UARTx_UCR2)
- TXEN: 송신기 활성화.
- RXEN: 수신기 활성화.
- WS: 데이터 길이 선택 (0=8비트, 1=7비트).
(5) FIFO 제어 등록자 (UARTx_UFCR)
3.4 UART 함수 구현
(1) 문자 송신
void transmit_char(unsigned char data) {
while (!(UART1->USR2 & (1 << 3))); // 송신 완료 대기
UART1->UTXD = data; // 데이터 송신
}
void transmit_string(const char *str) {
while (*str) {
transmit_char(*str++);
}
transmit_char('\n'); // 줄 바꿈 추가
}
(2) 문자 수신
unsigned char receive_char(void) {
while (!(UART1->USR2 & (1 << 0))); // 데이터 도착 대기
return UART1->URXD & 0xFF; // 데이터 반환
}
3.5 표준 입출력 연동
- 에러 처리 함수 추가
void raise(int signal) {
// 비어있는 함수
}
- Makefile 수정
libpath = -lgcc -L/usr/local/arm/gcc-linaro/lib/gcc/arm-linux-gnueabihf/4.9.4
incdirs = bsp imx6ull stdio/include
srcdirs = bsp project stdio/lib
$(ld) -Timx6ull.lds -o$(target).elf $^ $(libpath)
$(cc) -Wall -Wa,-mimplicit-it=thumb -nostdlib -fno-builtin -c $(include) -o $@ $<