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마이크로세컨드 안으로 값을 읽어야함
'임베디드' 카테고리의 다른 글
[오제이 튜브의 임베디드 강의] 27강. 온도센서 검증하기! (0) | 2025.02.05 |
---|---|
[오제이 튜브의 임베디드 강의] 26강. 다른 사람 소스 분석하는 방법! (0) | 2025.02.05 |
[오제이 튜브의 임베디드 강의] 24강. 1-Wire통신! 나름 유명했다. (온도센서) (0) | 2025.01.28 |
[오제이 튜브의 임베디드 강의] 23강. 온도센서를 붙여보자! (0) | 2025.01.26 |
[오제이 튜브의 임베디드 강의] 22강. STM32에서는 SPI기능을 제공한다구! (0) | 2025.01.26 |