5. 통신 프로그래밍

손지웅·2025년 5월 20일

Embedded Software

목록 보기
5/7

통신

  • 임베디드 시스템과 통신 : 프로세서와 다른 디바이스들이 데이터를 교환화기 위해서는 통신 인터페이스가 필요하다. 예를 들어 GPS, IMU, 카메라 센서, AXLM ..

  • 통신 방법

  • 전용 통신제어 칩을 통하여 데이터 전송 프로토콜 이용, 데이터를 비트스트림으로 변환하여 연결

  • 데이터 통신을 위해서는 에러처리, 주소지정, 데이터 요청, 메시지 포맷, 우선순위 등의 기능을 사용한다.

  • 통신의 유형

  • 완전이중화, 반이중화 : 양 쪽에서 "동시에" 데이터를 주고받을 수 있는지. 전화기 vs 무전기

  • 동기형, 비동기형 : 동기형은 클럭에 맞추어 데이터를 주고받고, 비동기형은 타이밍에 상관없이 송수신 ( 콜백 함수 사용 등 )

  • P2P, Bus : 두 장치 통신 vs 여러 장치가 한 버스에 연결되어 한번에 한 장치만 데이터 송수신

    임베디드 시스템의 대표적인 통신 인터페이스

  • UART 직렬포트 통신 - RS232

  • SPI

  • I2C

  • Can Bus

RS-232

  • 예전 PC의 COM 포트
  • Tx, Rx 데이터 직렬 라인 사용
  • 노이즈에 강한 특성으로, 외부 디바이스 간 데이터 통신에 사용
  • 클럭이 없는 비동기형
  • 송수신측은 비트전송속도 즉 Buad Rate를 일치시켜야 한다.
  • 전송속도는 300bps ~ 115200bps
  • 전송신호의 구성 : start bit, data bit, stop bit
  • 전압 : 3V보다 크면 1, -3V보다 작으면 0
  • 일반 디지털 IC들과의 연결을 위하여 RS232 전압을 3.3V로 변환하는 칩을 사용해야 한다.
  • UART는 RS-232 통신을 지원하는 하드웨어이다.
  • 군용시스템, 계측기기에서 여젼히 사용 중

RS-232 통신 신호의 형식

  • 문자 P를 전송하기 위해 생성된 직렬 데이터 포맷 : start bit + data bit(7bit size) + stop bit
  • 정해진 buad rate에 맞춰 직렬 비트 신호가 전송되고, 수신측에선 정해진 buad rate와 동일하게 포트를 설정하여 데이터를 복구
  • 시작은 start bit으로 판단, 종료는 데이터 비트수와 parity bit 이후의 stop bit으로 판단한다.

Serial Peripheral Interface SPI

직렬 주변장치 인터페이스, 여러 전자부품이 MCU와 짧은 거리에서 빠르게 통신할 때 사용

마스터 : CPU
슬레이브 : 여러 주변 장치

  • 모토로라가 1980년대에 개발한 동기형 직렬 통신 방식
  • 쉬프트 레지스터의 입출력처럼 동작
  • clcok, shift-in, shift-out, chip enable(마스터가 여러 슬레이브 중 누구와 통신할 지 선택하는 신호)
  • 전송속도 1~20 Mbps, 온보드 통신에 사용
  • Chip enable : 각 슬레이브 디바이스들의 tri-state driver(선택된 슬레이브에게만 신호를 내보나고, 나머지는 하이 임피던스 형태로)를 구동
  • 두개의 설정 모드
  • 한 개의 shift register(데이터를 한 비트씩 이동시키거나 저장하는 디지털 회로)와 모든 chip enable이 연결된 형태 : 여러 슬레이브가 직렬로 연결 -> 마스터는 한 번에 여러 슬레이브에 신호를 보냄
  • 각각의 chip enable을 갖는 독립적인 shift register 형태 : 마스터가 슬레이브 선택하여 통신
  • A/D, D/A Convertor을 사용하는 센싱, 구동기 디바이스에서 많이 사용

SPI Configurations


1. 마스터의 데이터 출력 -> 첫번째 슬레이브의 입력으로 -> 첫번째 슬레이브의 출력 -> 두 번째 슬레이브의 입력 ..
즉 모든 슬레이브가 한 줄로 연결되어 이동
주로 Shift Register 방식의 장치에서 사용

  1. 1대1 연결 -> 마스터가 각 슬레이브마다 독립적인 Chip Select 신호를 보낸다. 데이터 선은 모든 슬레이브에 공통으로 연결되지만, 마스터가 원하는 슬레이브 하나만 선택해서 통신할 수 있다. 병렬 연결

Inter IC 버스

  • 필립스사에서 1980년대 제안
  • 직렬 클럭을 공유하는 동기형 방식 (Serial Clock Line)
  • 100Kbps 표준모드, 10bps 저속모드 온보드 직렬통신
  • 7 bit address, 1 bit Read/Write, 8 Data bits
  • 많은 소형 센서 장치에서 사용

8비트 데이터를 전송하는 경우

마스터가 S 신호 이후에 address bit을 보냄 -> R/W bit 보냄 -> ACK 신호 받은 후, 데이터를 보냄

Controller Area Network

  • 자동차 전장 부품간의 통신을 위해 개발된 직렬 버스 네트워크
  • 마이크로 컨트롤러들 간 고속 데이터 전송에 사용
  • 메시지는 버스 상 모든 노드에 broadcast. 노드 간의 연결은 CANH, CANL등의 2 라인
  • 버스의 TTL 신호를 CAN 신호로 변환하기 위해 Transceiver가 필요
  • 최대 1Mpbs

차량용 CAN network 특징

  • 저비용 : 연결선이 간단
  • 중앙통제형 : 버스에 노드들이 전부 연결됨. 즉 특정 노드에서 모든 노드들을 감시할 수 있음
  • 견고성 : 특정 노드에 고장이 발생해도 통신에 문제가 없음 -> EMI 노이즈에서도 강한 특성
  • 효율성 : 메시지 우선순위를 부여할 수 있음

CAN 버스 통신 방식

  • CAN HIGH, CAN LOW 2개의 선을 연결하는 Differential Network 형태
  • 메시지가 없는 경우 둘 다 2.5V의 전압
  • 메시지가 있는 경우 High는 1.25, Low는 3.75의 전압을 가져서 전압차이가 2.5V가 됨.

OBD II

on borad diagnostics port

  • 핸들 좌측 하단에 위치하는데 해당 포트에 접속하여 차량 내부 문제 진단 가능

CAN data frame format

STM32F429xx에서 UART 제어

STM32F429xx의 UART 구성

UART : MCU와 외부 장치 간의 통신 회로

  • UART, USART라는 이름으로 GPIO포트의 여러가지 추가 기능 중 하나로 설정이 가능

  • GPIO의 모든 핀들은 16개의 Alternate Function을 설정할 수 있다.

  • USART 비동기식 직렬 데이터 포맷을 사용하는 외부 장치 간에 완전이중화 방식으로 데이터를 교환하는 통신

  • 완전이중화 : 데이터를 양방향으로 동시에 주받을 수 있음

  • NRZ : 데이터의 1과 0을 신호로 표현 즉 값은 값이 계속 연속되어도 신호가 중간에 바뀌지 않음

  • buad rate 설정가능

  • 데이터 길이 - 한 번에 8비트 또는 9비트 데이터 전송 가능

  • STOP BIT 한개 또는 두개로 설정 가능

  • 동기식 모드에서는 마스터가 클럭 신호를 출력함

  • Transfer Dectection Flags : 데이터가 다 전송되었는지, 수신 버퍼가 비었는지 상태를 알려주는 플래그

  • 패리티 오류 검출을 위한 비트 있음

  • Error Detection Flags : 에러 검출을 위한 플레그 4개

  • 여러 종류의 인터럽트 지원하는 플레그 10개

GPIO Multiplexting

  • 각 I/O 핀들은 AF0 - AF15 까지 총 16개의 Alternate function 들에 연결될 수 있다.
  • GPIOx_AFRL ( pin 0-7 ) , GPIO_ARFH ( pin 8-15 ). 각 핀마다 4비트씩 할당되어 어떤 AF로 쓸 지 정할 수 있음.
  • 리셋시에는 모두 AF0에 연결
  1. MODER 설정 -> 해당 핀의 모드를 Alternate Function로 설정

  2. OTYPER, PUPDR, OSPEEDR : 출력 타입(푸쉬풀, 오픈드레인), 풀업풀다운 저항, 출력 속도 설정

  3. AFRH/AFRL 설정

    • PA2, PA3를 USART2로 쓰고 싶다면
    • PA2, PA3의 MODER을 Alternate Function으로
    • OTYPER, PUPDR, OSPEEDR도 적절히 설정
    • AFRL에서 PA2, PA3를 AF7로 설정(USART2는 AF7)

  • AFRL 레지스터 이용 -> 하위 8비트 선택. 즉 8개의 핀에 대해 각각 4비트로 32개의 입력 선택

GPIO 포트의 Alternate function 연결

-> GPIO포트의 핀을 통하여 AF의 input output 연결

USART 문자의 길이 설정

USART_CR1 레지스터의 M 비트를 설정하여 8비트 또는 9비트 길이의 문자를 선택

송신기 설정

  • 송신기 활성화 비트 TE(transmitter enable)가 세트되면, TDR(transmit data register) 레지스터에 기록된 데이터가 쉬프트 레지스터를 거쳐 Tx핀에 전송된다.
  • STOP 비트 설정 : CR2 레지스터의 비트 12,13을 이용하여 1 stop bit, 2 stop bit 로 설정
[프로그램]
   │
   │ 1. TDR에 데이터 기록
   ▼
[TDR 레지스터] ──► [쉬프트 레지스터] ──► [Tx핀]
   │               │                  │
   │ 2. TE=1이면    │ 3. 데이터가        │ 4. 실제로
   │   송신 시작     │    한 비트씩 이동   │    외부로 전송

송신 절차

문자 단위의 데이터 송신 절차. 반드시 해당 순서대로 레지스터를 설정할 것
1. USRART 활성화 UE(Usart enable) 비트를 1로
2. 데이터 길이 설정
3. stop 비트 개수 설정. 1개 또는 2개. USART_CR2 레지스터에서 설정
4. DMA(direct memory access) 설정 가능 . 여러 데이터를 연속으로 보낼 때
5. baud rate 설정. USART_BRR
6. 송신기 활성화 ( TE 비트 설정 ). USART_CR1의 비트를 1로
7. 송신 -> USART_DR 레지스터에 보낼 데이터를 씀 . 그러면 TXE가 자동으로 클리어. TC(transmission Complete) flag가 1이 될 때까지 기다림

USART 켜기 → 2) 데이터 길이/Stop Bit/속도 등 설정 → 3) 송신기 켜기 → 4) 데이터 쓰기 → 5) 마지막 데이터가 다 나갈 때까지 기다리기

TXE 비트의 활용 Transmit Data Register Empty

  • TXE 비트는 데이터를 Tx Data register에 쓸 때, 하드웨어적으로 0으로 세팅된다.
  • TXE가 1로 세트된다 -> 데이터가 TDR에서 쉬프트 레지스터로 이동하여 전송이 시작됨. 즉 TDR이 비었고, USART_DR 레지스터에서 출력 데이터를 기록할 수 있다는 뜻
  • TXEIE 비트가 1로 세트 -> 인터럽트 생성 가능

데이터의 송신

  • 마지막 데이터 바이트가 송신되고 TXE가 세팅된 후, USART를 비활성화 하기 전에 TC=1 되는지 기다려야함.

  • USART_SR (status register) 레지스터부터 읽기 작업을 하는 경우 TC = 1

  • USART_DR (Data register) 레지스터에 쓰기 작업을 하는 경우 -> TC = 1

    데이터의 수신

  1. USART_CR1 즉 UE 비트 1로 설정

  2. 데이터 길이 설정 -> USART_CR1dml M비트로 8인지 9인지 설정

  3. STOP bit 개수 설정 -> USRT_CR2

  4. DMA 설정 -> USART_CR3

  5. buad rate 설정

  6. RE 활성화.

    문자의 수신

    문자가 수신되면

  7. RXNE 비트가 1이 된다. Read Data register Not Empty. 즉 읽을 값이 있음

  8. 쉬프트 레지스터 내용이 RDR 레지스터로 전송

  9. RXNEIE = 1 이면 인터럽트 발생 ? 이건 제어 비트이다. RXNE가 1일때, RXNEIE도 1이면 인터럽트
    IE는 interrupt enable

  10. error flag 설정 가능

  11. RXNE 비트가 0이 되는 경우, 즉 값이 비는 경우는 소프트웨어가 해당 값을 읽어간 경우

    USART Status Register

  • USART 포트의 상태 저장

    CR1 레지스터

  • 송수신 모드 설정

    USART_BRR 레지스터

  • 송수신 속도 결정

    Buad Rate 결정법

fck = 8 이고, USARTDIV = 416.6875 ( 정수부분 M=416, 소숫점 부분 F=1/16 ) , OVER8=0 -> 원하는 buadrate 1200bps 일때
공식에 대입하면 상위비트는 정수부분 416이고 하위비트는 소수부분 0.6875* 16 = 11이 4비트로 저장된다.

예제

USART_BRR 레지스터(baudrate 설정 레지스터) 값에서, USARDIV(내부 클럭을 얼마나 나눠서 쓸지) 값을 어떻게 구하는가 ?

USART_DIV는 실제 나누는 값 즉 소수점 값
USART_BRR에는 정수부와 소수부를 나누어 레지스터에 저장.
이때 두 값 차이를 연산해보자.

DIV값이 주어졌다면, 정수부 그대로 쓰고 소수부 * 16해서 계산. 가장 가까운 16진수값으로
해서 만약 정수부 0x19, 소수부 0xA면 그대로 0x19A 쓰면 됨

정수부와 소수부가 주어졌다면, 소수부에 16곱해서 더하면 됨.

0개의 댓글