본문 바로가기
개발해보겡/통신

1-wire통신(OneWire) 개념 및 라이브러리

by 취미야취미 2022. 10. 3.
728x90
반응형


1-wrie통신 방식

HAL Library
TM Library 
동시에 사용 못함 -> 변환해야함

https://github.com/nimaltd/ds18b20
변환한 Git 주소

Maxim 1-wire 버스를 사용하면 핀 하나만으로 통신할 수 있음

신호선으로 전원까지 공급할 수 있음

1-wire bus는 선 한개로 데이터의 송/수신을 하므로, 

1-wire bus방식의 IC와 연결하는 MCU는 GPIO핀의 입력/출력 모드를 번갈아 사용



Prescaler (10000 -1)
Counter Period (800 -1)
-> 10000 클럭당 1카운터씩 최대 800까지 1싸이클
0~779 까지 1초 

1-Wire 통신 제대로 알아보자
Dallas Semiconductor Corp.

어디다 사용할까?
굳이 왜 사용할까?

- 딱 두선으로 전원 공급과 양방향 통신 가능

Normal Power Mode 3가닥
GND, DO, VCC

Parasite Power Mode 2가닥
GND와 VDD가 묶여있음

위 구조를 보면 떠오르는 것들
1. 장거리는 힘들겠다 (노이즈에 약하겠군 - rs232)
2. 주소 체계 방식을 쓰겠군
3. 빠른 속도는 불가능(TimeBase로 동작)
4. 그대로 간단해서 많이 쓰겠다
5. 혼합해서 사용하면 괜찮을 듯 

프로토콜의 종류
1. 물리적인 통신 방식만을 규정한 프로토콜
SPI, 

2. 물리적인 + 소프트웨어적인 규칙까지 정한 프로토콜
OneWire

3. 소프트웨어적인 규칙만 정의한 프로토콜
http, Modbus, tcp

4. 레이어가 있는 프로토콜
http - tcp - ethernet

통신 시작
Master 480us minimum Low
waits 15~60us
presence pulse 60~240us 
-> Onewire reset source 

명령어 종류
마스터가, 통신 시작을 알리고,
presence pulse 수신한 후에 
아래와 같은 명령어를 보낼 수 있음

슬레이브는 ROM code(주소)==address를 갖는다.

ROM command: 장치를 선택하기 위한 명령어
Function command: 장치에게 특정 동작을 수행하기 위한 명령어

Serch ROM: 0xF0
1-wire bus에 연결된 모든 slave장치들의 ROM code를 읽는다.

어떻게 찾아내지? 3가지 스텝 반복

1 한 bit를 읽는다
2. 비트의 보수를 읽는다
3. (경우의 수에 의한) 0 또는 1을 write한다

시작
1. 리셋 펄스를 보냄
2. Slave 디바이스 응답
(presence 펄스를 동시에 보내서)
3. 써치 커맨드를 보낸다.
4. 비트를 읽는다.

찾아내기
ROM1, ROM2, ROM3, ROM4
0xF0 명령 날림
1bit를 읽음 
Master에서는 0과 1을 0으로 읽음 (둘 다 low로 시간차를 가짐)
보수로 1bit를 같이 보냄
우선적으로 0으로 응답함 


Match ROM: 0x55
Match ROM command를 보낸 뒤
64비트 ROM code를 보낸다
이 64bits ROM code에 맞는 slave장치에 접근하기 위해 이 command를 사용
나머지 slave장치들을 reset pulse를 기다림 

Skip ROM: 0xCC
모든 slave 장치에게 동시에 command를 보낼 때 사용

Ararm search: 0xEC
slave 장치의 alarm flag이 set상태인지 확인할 때 사용

Function 명령어
종종 프로토콜에 따라서
Function까지 정의된 경우가 있음

DS18B20의 메모리는 scratchpad라고 부른다
메모리는 우리가 생각하는 물리적인 메모리가 아닌 경우가 ㄶ음

Convert T: 0x44
온도의 변화시작
신호선으로 전원을 공급받는 경우
이 command를 보낸 뒤 신호선을 high상태로 올려서 온도를 변환하는 동안 전원을 공급해야 함

외부 전원일 경우

진행(0) 완료(1) 응답이 옴 

[온도의 변환시간]
93.75ms(9비트) - 750ms(12비트)
-> 빠를수가 없다 

Write scarchpad: 0x4E
3바이트의 데이터를 장치의 scratchpad에 쓴다

Read scratchpad: 0xBE
Scratchpad의 값을 읽어온다

Copy scratchpad: 0x48
Scratchpad의 값을 EEPROM으로 저장함
신호선으로 전원을 공급하는 경우
command를 보낸 뒤 신호선을 10us동안 high상태를 유지

Recall E^2:0xB8
현재 Alarm쓰레드 홀드 값(TH, TL)
configuration data를 EEPROM에서 불러와서
scratchpad 2, 3, 4바이트에 기록
쓰레스 홀드값 = 기준값 
-> 넘어가면 알람 

Read Power supply:0xB4
전원 공급 확인 
VDD핀 or 신호선 

 데이터 주고 받는 방법
한 slot에 한 비트를 보냄
Slot의 시간 간격은 1마이크로 초 이상

0을 전송할 때는 60~120마이크로초 low
1은 1마이크로 동안 low

시간에 따라서 0,1 구분
Slave는 15~60us 사이에 샘플링 후 값 읽기

Slave는 마스터가 1us 이상 신호선을 low로 내려야 전송 가능

Slave가 0을 표현할 때 15us 동안만 low로 내릴 수 있음
때문에 마스터는 15us안으로 값을 읽어야 함

-> 소스를 보자 

반응형