i.MX6ULL 시리얼 통신 개발 및 기본 원리

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)
  • RFDIV: 참조 클록 분주 값 설정.

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 표준 입출력 연동

  1. 에러 처리 함수 추가
void raise(int signal) {
    // 비어있는 함수
}
  1. 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 $@ $<

태그: i.MX6ULL UART EmbeddedSystems

8월 15일 07:28에 게시됨