본문 바로가기
임베디드

[오제이 튜브의 임베디드 강의] 25강. 어디서도 안 알려주는 프로토콜의 원리!

by 덤더리덤떰 2025. 1. 28.

1. 1-Wire 통신

  • 이 통신의 최대 장점 : 두 선만으로 전원 공급 + 양방향 통신 가능 (∵ 선 가닥 수 ∝ 비용)
  • 두 가지 방식 존재 : Normal Power Mode / Parasite Power Mode

1-1. 1-Wire 통신의 모드 

 

  • Normal Power Mode : GND(그라운드) + DQ(신호) + Vdd(전원) 선들로 이루어짐 => 우리가 사용하는 모드 
  • 5v 전원이 공급 + 4.7k 저항과 함께 신호들이 joint됨
  • 이때, 우리는 Arduino Digital Input이 아닌 STM32F103 칩으로 INPUT이 들어감
  • 결국 MAIN 칩도 그라운드로 같이 연결되는 구조 

 

 

 

 

 

 

 

 

 


 

  • Parasite Power Mode : 기생하는 파워 모드 
  • 5v 전원 공급 받아서 데이터 선으로만 가고 있음
  • 그라운드와 vdd는 묶여서 그라운드로 
  • 따라서, 데이터 선을 통해 전원과 신호 모두 받는 구조 

 

 

 

 

 

 

 

 


1-2. 위 구조를 보면 떠오르는 것들 

  • 장거리에 힘들겠다 (노이즈에 약하겠다)
    => 신호선이 하나만 있고 이 신호선을 통해 데이터를 주고 받는 구조
    => but, 데이터를 보낼 때 GPIO로 Low/High로 바꾸어서 보내기때문에 어느정도 일정한 전압 이하이면 0 , 아니라면 1로 분류하는 방식을 사용하는 구조임 (ex. RS232 : 대표적인 노이즈에 약한 통신 방식
  • 주소 체계 방식 이용하겠군
    => RS485의모드 버스가 대표적으로 주소 체계 사용 
    => 모든 DS18B20이 하나의 물리적인 선으로 이어져있기 때문에 chip이 데이터를 보내면 모든 장치들이 다 듣게 됨  
    => 모든 장치들이 정기적인 신호로 chip에 답변하면 chip은 정기적으로 충돌이 난 신호를 받기에 올바른 값을 받을 수 없어서 주소 체계 방식 이용 
  • 빠른 속도는 불가능하겠군 (시간 Base로 동작)
    => 신호 선만 Input에 연결되어 있으므로 클럭(동기화) 기반으로 동작 x
    => 시간 base : 시간을 미리 쪼개서 시간 간격에 데이터 전송 (RS232, RS485 시리얼 통신의 대표적 방식)
  • 그래도 간단해서 많이 쓰겠는데?
    => HW 구성이 간단 
  • 혼합해서 사용하면 괜찮을듯

 

2. 프로토콜 종류 

  • 물리적인 통신 방식만 규정한 프로토콜 => SPI
  • 물리적 + SW적인 규칙까지 정한 프로토콜 => 1-wire
  • SW적인 규칙만 정의한 프로토콜 => HTTP, 모드 버스, TCP
  • 상하관계가 있는 프로토콜 (광통신 - 이더넷 - TCP - HTTP 같이 레이어가 있는 프로토콜)

3. 본격적인 1-Wire 통신 설명

  • 그라운드는 신호의 기준점(High/Low 구분)
  • A와 B 사이에 D선과 GND선이 존재하는데, A와 B 각각 존재할 수도 있지만 결국 그라운드가 묶여짐 
  • 이때, 시간 + D선을 통해 전압을 주고받으며 통신 <=> 시간 + 전압
    => 높은 전압(5v) / 낮은 전압(0v) 과 시간을 이용해 통신 

3-1. 통신 시작

  • 통신 시작을 알릴 땐 마스터가 먼저 말함 
  • 이때 Vpu는 High인 상태이고 GND는 Low인 상태 (1-wire bus : 데이터 선)
  • 따라서, 통신 시작하고 싶으면 Master가 데이터 선을 Low인 상태로 480마이크로세컨드 이상을 최소한 보내야함
    => 그럼 Slave가 시작하는구나 라고 받아들임 
    => 따라서 만약 280마이크로세컨드 보내면 통신 시작이 아님 
  • DS18B20 Slave 칩은 15-60마이크로세컨드 기다려야함
  • 그리고 나서 Slave DS18B20 칩이 "나 살아있어" 라고 Low인 상태로 60~240마이크로세컨드동안 보냄 
  • 이 신호를 Master가 읽고 나면 통신이 시작됐다는 걸 인지하면 됨. 

 

 

  • Master가 통신 시작을 알리고 Slave의 presence pulse 수신 후 아래와 같은 명령어 보낼 수 있음 
  • Slave는 ROM code(주소)를 갖는다 

3-2. 명령어 종류

: ROM/Function command 존재

  • ROM command : 장치선택 위한 명령어 
    => 1wire 통신하는 모든 장치들이 통합적으로 지키는 약속 
    => 어쨌든 장치의 주소를 부르고 명령을 내리는 동작은 모든 장치가 동일 
  • Function command : 장치에게 특정 동작 수행하기 위한 명령어
    ex) 온도센서 : 온도 정보 줘, 도어락 : 문을 열어  

(1) ROM 명령어 

  •  "Search ROM: 0xF0" //1-wire bus에 연결된 모든 Slave 장치들의 ROM code(주소) 읽는다
    => 이 명령을 통해 내가 구성한 보드에 연결된 장치들이 뭐가 있는지 + 주소가 무엇인지 확인하는 명령어 
  • "Match ROM: 0x55" //0x55는 모든 장치들이 들음
    => Match ROM command 보낸 뒤 64비트의 ROM code 보냄
    => 이 64bit ROM code에 맞는 slave 장치에 접근하기 위해 이 command 사용
    => 나머지 Slave 장치들은 reset pulse 기다림 
  • "Skip ROM: 0xCC" //모든 slave 장치에게 동시에 command 보낼 때 사용 
  • "Alarm search: 0xEC" //Slave 장치의 alarm flag이 set 상태인지 확인할 때 사용

 

(2) Function 명령어

: 센서의 기능이 다르므로 당연히 제조사마다 다름 

: 종종 프로토콜에 따라 Function까지 정의된 경우 존재
=> 그럴 경우 예외가 있을 경우 곤란하고 복잡 ex)  표준 

: DS18B20의 메모리는 scratchpad라고 부름(어떤 특정 정보가 모여있는 공간)
=> 메모리는 우리가 생각하는 물리적 메모리가 아닌 경우가 많다 


  • "Convert T: 0x44" //온도 변환 시작으로, 신호선으로 전원 공급 받는 경우 이 cmd 보낸 뒤 신호선을 high상태로 올려서 온도 변환하는 동안 전원 공급해야함 
    [온도 변환시간(온도 변환 명령 내리고 온도 받아오는 데 걸리는 시간)] 93.75ms(9비트) - 750ms(12비트) 
    cf. 100ms~750ms : 시간이 매우 오래 걸리는 거임
  • "Write scratchpad: 0x4E" //3byte 데이터를 장치의 scratchpad에 쓴다
    => ROM cmd 통해 칩 선택하고 addr 보낸 후 이 명령어 보낸 후 3Byte 데이터를 scratchpad에 쓴다 
  • "Read scratchpad: 0xBE" //GPIO를 output으로 설정해서 다 데이터 보낸 후 바로 Input모드로 바꿔서 Scratchpad의 값 읽어들임
  • "Copy scratchpad: 0x48" //Scratchpad의 값을 EEPROM으로 저장 (EEPROM에 저장할 때 전원이 필요)
    => 이때 신호선으로 전원을 공급하는 경우 cmd 보낸 뒤 신호선을 10마이크로세컨드 동안 high 상태 유지
  • "Recall E^2: 0xB8" //현재 Alarm 쓰레드 홀드 값(TH,TL)과 configuration data값이 뭔지 EEPROM에서 불러와서 Scratchpad에 2,3,4바이트 기록 
    cf. 쓰레드 홀드 값 : 기준값을 넘어서면 Alarm 발생 
  • "Read power supply: 0xB4" // 전원 공급 출처 확인 (vdd핀 or 신호선)  

 3-3. 데이터 주고 받는 방법

  • 1 slot에 1bit 보냄
    (이때, slot 시간 간격은 1마이크로세컨드 이상)
  • 0을 전송할때는 GPIO를 60~120 마이크로세컨드동안 low
  • 1을 전송할때는 GPIO를 1마이크로세컨드동안 low
    => 시간에 따라서 0/1 구분
  • Slave는 15~60마이크로세컨드 안에 그 1bit를 읽어와야함 
  • Slave는 마스터가 1마이크로세컨드 이상 신호선을 low로 내려야 전송 가능 
  • Slave가 0을 표현할 때 15마이크로세컨드 동안만 low로 내릴 수 있음
  • 때문에 마스터는 15마이크로세컨드 안으로 값을 읽어야함