Rom search : 0xF0
주소를 어떻게 찾지?
1. 한 bit 를 읽음
2. 비트의 보수를 읽음
3. 0 or 1 Write
>
시작
1. 리셋펄스
2. slave 응답
3. 써치 커맨드 , 0xF0
4. 비트를 읽음
찾아내기
ROM1 00110101---64
ROM2 10101010---64
ROM3 11110101
ROM4 00010001
1. slave : MSB 들을 동시에 보냄 0 1 1 0
master : 0 으로 인식
// 0 : 60~120 μs , 1: 1μs > 겹침 > 결국 60~120 인 0 으로 읽음
2. 보수를 보냄 > 1 0 01
> 똑같이 0 으로 인식
3. 경우의수
00 : slave 들이 0, 1 섞여있음 // 장치가 여러개임을 인식 > check
01 : " 다 0 임 > 보수를 취하면 1 // 둘다 0 일 수도있지만 하나만 0일지 확실하지 않음
10 : "" 다 1임
11 : 연결된 장치가 없음 // 말이안됨
4. slave가 경우의수 bit 송신
M) 00 수신 > check ( 장치가 걸러짐)
M) 0 송신 > S) MSB가 1 이면 자동 탈락( ROM2,ROM3)
> 경우의수 01 을 송신 (ROM1, ROM4 MSB가 0 0 이므로)
M) 01 수신 > (MSB-1 bit) 다 0 이구나 파악 check X (걸러지는 장치 없음) > M) 0 안보냄
> 00 송신 (MSB -2 bit)
M) 00 수신 > check ( 장치가 걸러짐)
M) 0 송신 > ROM4만 남음 > 10 00 01 01..... 이렇게 64bit 찾은 주소 저장
5. 나머지 찾기
마지막 check 지점 ( 분기점 ) > M) 1을 보냄 > ROM1만 남음
첫번재 check 지점 > 1을 보냄 > 00 check ( MSB -1 )
> 0 을보냄 > ROM2만 남음
> 분기점 back > 1을 보냄 > ROM3만 남음
칩 관련소스 , one-wire에 대한 소스
Ds18b20_Init();
OneWire_Init(&OneWire,_DS18B20_GPIO ,_DS18B20_PIN);
// 구조체 설정 및 신호를 HIGH > LOW >"HIGH" 셋팅
OneWireDevices = OneWire_First(&OneWire);
>
uint8_t OneWire_First(OneWire_t* OneWireStruct) {
/* Reset search values */
OneWire_ResetSearch(OneWireStruct);
// 초기 리셋 한번 해주고
/* Start with searching */
return OneWire_Search(OneWireStruct, ONEWIRE_CMD_SEARCHROM);
} // 장치 하나를 search
typedef struct {
GPIO_TypeDef* GPIOx; /*!< GPIOx port to be used for I/O functions */
uint16_t GPIO_Pin; /*!< GPIO Pin to be used for I/O functions */
uint8_t LastDiscrepancy; /*!< Search private */
uint8_t LastFamilyDiscrepancy; /*!< Search private */
uint8_t LastDeviceFlag; /*!< Search private */
uint8_t ROM_NO[8]; /*!< 8-bytes address of last search device */
} OneWire_t;
이 구조체에 찾아낸걸 ROM_NO[8]; //64 bit 에 저장
>> 나머지 장치들은??
OneWireDevices = OneWire_First(&OneWire);
while (OneWireDevices) // 장치가 있다면
{
Ds18b20Delay(100);
TempSensorCount++; // count ++
OneWire_GetFullROM(&OneWire, ds18b20[TempSensorCount-1].Address);
// address에 저장
// _DS18B20_MAX_SENSORS == 1 // 센서 1개
OneWireDevices = OneWire_Next(&OneWire);
}
uint8_t OneWire_Next(OneWire_t* OneWireStruct) {
/* Leave the search state alone */
return OneWire_Search(OneWireStruct, ONEWIRE_CMD_SEARCHROM);
}
다음장치를 OneWireDevices 에 저장후 다시 while 문 반복,,
do{
if(TempSensorCount>0){
break;
}
Ds18b20TryToFind--;
}while(Ds18b20TryToFind>0);
// do while 문
// count 가 1보다 크다 : 즉 장치 찾으면 break로 while 빠져나옴
// Ds18b20TryToFind=5 > 5번정도 찾기 시도해보고 없으면
if(Ds18b20TryToFind==0)
return false;
// 그래도 못찾으면 false > 함수 종료
for (uint8_t i = 0; i < TempSensorCount; i++)
{
Ds18b20Delay(50);
DS18B20_SetResolution(&OneWire, ds18b20[i].Address, DS18B20_Resolution_12bits);
// 온도정밀도 , 사진참조
Ds18b20Delay(50);
DS18B20_DisableAlarmTemperature(&OneWire, ds18b20[i].Address);
// 온도 알림
}
장치갯수 만큼 for문