ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로토콜
    카테고리 없음 2025. 5. 24. 15:01

    앞서 공부했던 1Wire 통신은 한 가닥의 선으로 데이터를 양방향 통신이 가능하며, 여기에 GND(접지선)를

    포함해 두 가닥이 필요하다.

    1Wire 통신은 두 가지 방법이 존재하는데,

    첫번째는 Normal Power Mode라해서 GND, Vdd(전원), DQ(데이터선)으로 구성되어 있다.

    두 번째는 parasite power mode라해서 데이터 선에 5V의 전원을 공급받고, 신호도 공급받는 패러사이트 모드이다.

     

    이러한 1Wire 구조는 신호선이 하나기때문에 장거리 통신은 힘들 수 있다.

    일정 전압 이상이면 1, 이하면 0으로 취급하는 통신 방식을 쓰는데 위와 같은 대표적인 예가 RS232이다.

    RS232는 노이즈에 약한 통신 방식중 하나이다.

    대신 위 체계는 GPIO가 명령을 하면 저 3개가 한번에 들을 수 있다. 여기서 주소 체계를 사용함으로써 3개중 누구한테 말했는지 구분할 수 있다.

    통신 할때는 클럭 기반 또는 타임베이스 기반으로 통신할 수 있는데,

    클럭 기반은 기존에 했던 방법처럼 고정적인 클럭이 있고, High 또는 Low로 데이터를 구분하여 보낸다.

    타임베이스는 시간을 미리 쪼개놓고 시간 간격에 데이터를 보내는 것이다. (보드 레이트 9600 등, 클럭선 x)

    만약 이 두가지를 사용하지않으면 만약 1이라는 데이터를 보낼때 111을 보낸건지 1111을 보낸건지, 1을 보낸건지 구분할 수 없다.

    1Wire은 하나의 신호선으로 데이터를 주고받기 때문에 타임 베이스를 기반으로 작동한다.

    프로토콜의 종류

    1. 물리적인 통신 방식만을 규정한 프로토콜

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

    3. 소프트웨어적인 규칙만 정의한 프로토콜 (http, 모드버스, tcp)

    4. 레이어가 있는 프로토콜

    마스터가 먼저 말하는데 GND를 기준으로 Low인 상태이다. RESET PULSE는 시작한다는 의미로, 최소한 480마이크로세컨드를 Low로 보내라는 것이다. == 시작을 알리고싶으면 Low로 떨어트려야한다. 그러고 15~60ms정도 DS18B20칩을 기다리면 DS18B20 슬레이브 칩이 presence pulse라는 신호를 보내준다.(60 ~ 240ms시간 동안)

    실제로 위에서 보여줬던 그림과 코드가 같다. Low로 떨어트리고, Delay(480)를 기다린다. 그 다음 Delay(20)를 기다리고, 인풋 읽어낸다. 마스터가 통신 시작을 알리고, Presence Pulse 수신 후에 명령어를 보낼 수 있다.

    앞서 설명한것처럼 슬레이브는 ROM code(주소)를 갖는다. 

     

    명령어 종류

    ROM command : 장치를 선택하기 위한 명령어
         - Search ROM : 0xF0, 1-wire bus에 연결된 모든 slave 장치들의 ROM code를 읽는다.
                - 위 명령어는 내가 구성한 보드에 연결된 장치들이 어떤것인지, 주소가 무엇인지 알아내는 명령어이다.

         - Match ROM : 0x55, Match ROM command를 보낸 뒤, 64비트의 ROM code를 보낸다. 이 64비트 ROM code에 맞는
            slave장치에 접근하기 위해 이 명령어를 사용하며, 나머지 slave 장치들은 reset pulse를 기다린다. 

         - Skip ROM : 0xCC, 모든 slave 장치에게 동시에 명령을 보낼 때 사용한다.

         - Alarm search : 0xEC, slave장치의 alarm flag이 set상태인지 확인할때 사용한다.

    정리하자면, 내가 주소를 모를때는 Search ROM을 통해 주소를 알아내고, Match ROM을 통해 특정 주소에 명령을 한다.

    모든 주소에 명령을 하려면 Skip ROM 명령을 하면된다.

     

    DS18B20의 메모리는 Scratch Pad Memory(SPM)라고 부른다. SPM은 기본적으로 전원을 끄면 날라가는 휘발성 메모리이다. 단,

    아래에서 비휘발성으로 저장할 수 있는 명령어를 설명할 것이다.

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

         - Convert T : 0x44, 온도의 변환 시작 명령어
              - 신호선으로 전원을 공급받는 경우, 이 명령어를 보낸 뒤 신호선을 high 상태로 올려서 온도를 변환하는 동안 전원을 공급해야 한다.

              - 온도 변환 시간 : 93.75ms (9비트) - 750ms(12비트)

         - Write scratchpad : 0x4E

              - 3바이트의 데이터를 장치의 scratchpad에 쓴다.

         - Read scratchpad : 0xBE

              - Scratchpad의 값을 읽어온다.

         - Copy scratchpad : 0x48

              - Scratchpad의 값을 EEPROM으로 옮겨서 저장한다. -> 전원을 꺼도 사라지지 않는다.

              - 신호선으로 전원을 공급하는 경우, 이 명령어를 보낸 뒤 신호선을 10us동안 high상태를 유지해야 한다.

         - Read power supply : 0xB4

              - 전원 공급 출처 확인 및, VDD핀 or 신호선

    데이터를 주고 받는 방법

    - 한 slot에 한 비트를 보낸다. slot의 시간 간격은 1마이크로 초 이상이다.

    - 전압이 Low로 60 ~ 120us 이상 유지되면 0을 의미하고, 1마이크로 동안만 딱 Low로 있다가 High로 올라오면 1이다.

    - 기존 전압에 따라 High, Low를 나누는 것이 아닌, 시간에 따라 0과 1을 구분한다.

    - 마스터가 신호를 보내고, 슬레이브는 15 ~ 60us 안에 1bit를 읽어내야한다.

    - 슬레이브는 마스터가 1us이상 신호선을 Low로 내려야 전송 가능하다.

    - 슬레이브가 0을 표현할 때 15us 동안만 Low로 내릴 수 있다.

    - 마스터는 15us안으로 값을 읽어야한다.

     

    Rom Search 실제 동작 과정

    1. 한 Bit를 읽는다.

    2. 비트의 보수를 읽는다.

    3. (경우의 수에 의한) 0또는 1을 Write 한다.

    ROM1 00110101... ~64
    ROM2 10101010... ~64
    ROM3 11110101... ~64
    ROM4 00010001... ~64

    먼저 ROM은 주소를 나타내고, 1Wire 방식에서 주소체계는 64비트이다.

    마스터가 처음에 1bit를 읽을 때 ROM1은 0, ROM2는 1, ROM3은 1, ROM4는 0을 보낸다.

    자기 주소의 첫번째 비트를 보내는 것이다. 0 1 1 0이 와도, 마스터 입장에서는 그냥 0으로 읽힌다. 그 이유는 Low가 더 길게 유지되기 때문이다. 그 다음 0 1 1 0을 보수로 취하면 1 0 0 1이 된다. 다음으로 경우의 수를 따져보자.

    경우의 수

    bit ~bit 의미 설명
    0 0 충돌 발생 어떤 장치는 0, 어떤 장치는 1을 가졌다는 뜻 (분기점 발생)
    0 1 모두 0 모든 장치가 이 위치의 비트로 0을 가짐
    1 0 모두 1 모든 장치가 이 위치의 비트로 1을 가짐
    1 1 불가능 어떤 장치도 응답하지 않음 → 장치 없음

    마스터는 ROM 주소의 각 비트를 두 번씩 읽는다.

    1. 첫 번째: 해당 비트의 값

    2. 두번째: 해당 비트의 보수

    0 1 1 0은 값이 섞여있기때문에 마스터가 수신할때 0 0 (충돌 발생)으로 읽는다.

    분기 발생, 마스터는 임의로 0또는 1을 선택하는데 0을 선택하면 ROM1, ROM4만 남는다.

    두 번째 비트는 ROM1: 0, ROM4: 0이기때문에 충돌이 없다.

    세 번째 비트는 ROM1: 1, ROM4: 0이기때문에 충돌이 발생하고, 0을 선택하면 ROM4만 남는다.

    이렇게 충돌이 발생한 분기에서 0과 1을 구분하면서 주소를 찾아낸다.

     

Designed by Tistory.