ROM Command : One-Wire를 이용하는 장치들이 공통적으로 사용하는 명령어
Function Command : 각 장치마다 가지고 있는 특색을 제어하는 명령어
모든 slave 장치에게 동시에 명령을 보낼 때 사용
"DS18B20_Start"는 *ROM을 통해 장치 한개만 명령을 보낼 수 있지만, "DS18B20_StartALL"은 "Skip ROM"을 통해 전체 장치에게 명령을 동시에 보낸다.
DS18B20에는 ROM CODE에는 0x28값인 패밀리 코드가 포함되어 있다. 즉 0x28을 포함하지 않는다면 if문을 수행하고, 0x28을 포함한다면 if문을 통과한다. (이건 좀 추상적인거 같네 무슨 말일까)
1) OneWire_Reset(OneWire) --> 장치 작동 신호 준비
2) OneWire_SelectWithPointer --> DS18B20_Read(OneWire_t OneWire, uint8_t ROM, float *destination); 장치가 4개인 경우, i++를 수행하여 ROM의 주소를 돌아가면서 저장한다.
그리고 OneWire_SelectWithPointer안에는 MATCHROM(0X55)가 있고 주소를 내가 선택한 slave를 작동시킨다.
3) OneWire_WriteByte --> 온도 정보는 SCRATCHPAD에 존재하므로 그 정보를 읽어들이겠다는 뜻이다.
1) SCRATCHPAD에 저장된 온도 정보를 가져오는데 총 8번 수행해야 한다.
1) 오류가 있는지 없는지 검사하는 단계이다. (모드버스에 강의있음)
uint16_t temperature;
temperature = data[0] | (data[1] << 8);
/* Get sensor resolution */
resolution = ((data[4] & 0x60) >> 5) + 9;
/* Store temperature integer digits and decimal digits */
digit = temperature >> 4;
digit |= ((temperature >> 8) & 0x7) << 4;
/* Store decimal digits */
switch (resolution)
{
case 9:
decimal = (temperature >> 3) & 0x01;
decimal *= (float)DS18B20_DECIMAL_STEPS_9BIT;
break;
case 10:
decimal = (temperature >> 2) & 0x03;
decimal *= (float)DS18B20_DECIMAL_STEPS_10BIT;
break;
case 11:
decimal = (temperature >> 1) & 0x07;
decimal *= (float)DS18B20_DECIMAL_STEPS_11BIT;
break;
case 12:
decimal = temperature & 0x0F;
decimal *= (float)DS18B20_DECIMAL_STEPS_12BIT;
break;
default:
decimal = 0xFF;
digit = 0;
}
/* Check for negative part */
decimal = digit + decimal;
if (minus)
decimal = 0 - decimal;
/* Set to pointer */
*destination = decimal;
/* Return 1, temperature valid */
return true;
Q : temperature를 왜 16bit로 지정해놨을까?
A : 만약 8bit로 지정하면 왼쪽으로 8bit로 밀경우 0이 되므로, 왼쪽으로 밀어도 영향이 없는 16bit로 지정한 것이다.