해결된 질문
작성
·
71
·
수정됨
0
if (bit)
{
/* Set line low */
ONEWIRE_LOW(OneWireStruct);
ONEWIRE_OUTPUT(OneWireStruct);
ONEWIRE_DELAY(10);
/* Bit high */
ONEWIRE_INPUT(OneWireStruct);
/* Wait for 55 us and release the line */
ONEWIRE_DELAY(55);
ONEWIRE_INPUT(OneWireStruct);
}
위는 OneWire_WriteBit의 한 부분으로 이 부분에서 LOW로 만들어서 output모드로 만든 다음에 10us만큼 딜레이를 줘서 input 모드로 만들어서 버스를 high로 만드는 것이라고 이해했습니다. 그런데 이 이후에 딜레이를 55us 만큼 준 다음에 다시 input 모드로 만드는 이유는 무엇인가요?
inline uint8_t OneWire_ReadBit(OneWire_t* OneWireStruct)
{
uint8_t bit = 0;
/* Line low */
ONEWIRE_LOW(OneWireStruct);
ONEWIRE_OUTPUT(OneWireStruct);
ONEWIRE_DELAY(2);
/* Release line */
ONEWIRE_INPUT(OneWireStruct);
ONEWIRE_DELAY(10);
/* Read line value */
if (HAL_GPIO_ReadPin(OneWireStruct->GPIOx, OneWireStruct->GPIO_Pin)) {
/* Bit is HIGH */
bit = 1;
}
/* Wait 50us to complete 60us period */
ONEWIRE_DELAY(50);
/* Return bit value */
return bit;
}
그리고 OneWire_ReadBit에서 input모드로 바꾸는 것이 버스를 high로 만든다는 것을 주석으로 짐작한거라서 정확히 바꾼 이유를 잘 모르겠습니다. input모드가 디폴트 모드인건가요?
답변 1
1
위는 OneWire_WriteBit의 한 부분으로 이 부분에서 LOW로 만들어서 output모드로 만든 다음에 10us만큼 딜레이를 줘서 input 모드로 만들어서 버스를 high로 만드는 것이라고 이해했습니다. 그런데 이 이후에 딜레이를 55us 만큼 준 다음에 다시 input 모드로 만드는 이유는 무엇인가요?
일단, oneWire 프로토콜은 선 한가닥만 씁니다.
그래서, 내가 데이터를 전송한 후에는, 항상 input 모드로 내가 다른 데이터를 받을 수 있는 상태로 돌아가야 합니다. 그래서 input 모드로 돌아가는 거예요. 안 그러면 상대방이 데이터를 보내도 되는지 아닌지 알 수가 없어서요. 그리고, 딜레이 55us를 주는 이유는 약속입니다. 최소한 이시간의 쉬는 시간을 갖는것이 onewWire 통신의 약속입니다.
그리고 OneWire_ReadBit에서 input모드로 바꾸는 것이 버스를 high로 만든다는 것을 주석으로 짐작한거라서 정확히 바꾼 이유를 잘 모르겠습니다. input모드가 디폴트 모드인건가요?
이 질문도 위와 같이 대답할 수 있겠네요..
아무튼 궁금하신게, 왜 input 모드가 디폴트 인가 인데,
정말 간단한 이유 입니다.
말할 수 있는 방법이, 물리적으로 선 한 가닥이기 때문에, 말이 끝나면, 나 이제 말 끝났어.
하면서 input 모드로 돌아가서 듣는 준비를 하는 것 입니다.
답변이 너무 늦어서 죄송합니다.
알려주셔서 감사합니다!