static void OneWireHigh() {
drv_gpio_output_en(GPIO_TEMP, true);
drv_gpio_input_en(GPIO_TEMP, false);
drv_gpio_write(GPIO_TEMP, 1);
}
static void OneWireRelease() {
drv_gpio_output_en(GPIO_TEMP, true);
drv_gpio_input_en(GPIO_TEMP, false);
drv_gpio_write(GPIO_TEMP, 0);
}
static u8 OneWireRead() {
drv_gpio_output_en(GPIO_TEMP, false);
drv_gpio_input_en(GPIO_TEMP, true);
return drv_gpio_read(GPIO_TEMP);
}
static u8 OneWireReset() {
OneWireRelease();
WaitUs(480);
OneWireHigh();
WaitUs(70);
u8 OW = OneWireRead();
WaitUs(410);
OneWireHigh();
return OW;
}
static void OneWireWriteBit(u8 b){
if(b){
OneWireRelease();
WaitUs(6);
OneWireHigh();
WaitUs(64);
}
else{
OneWireRelease();
WaitUs(60);
OneWireHigh();
WaitUs(10);
}
}
static u8 OneWireReadBit(){
OneWireRelease();
WaitUs(6);
OneWireHigh();
WaitUs(9);
u8 out = OneWireRead();
WaitUs(55);
return out;
}
static void OneWireWriteByte(u8 b){
for(u8 i = 0; i < 8; i++){
OneWireWriteBit(b & 0x01);
b = b >> 1;
}
}
static u8 OneWireReadByte(void){
u8 out = 0;
for(u8 i = 0; i < 8; i++){
out = out >> 1;
if(OneWireReadBit() & 0x01)
out = out | 0x80;
}
return out;
}
u16 OneWireTemp() {
u8 reset = OneWireReset();
printf("1 return WireReset: %d\r\n", reset);
OneWireWriteByte(0xCC);
OneWireWriteByte(0x44);
while(!OneWireRead());
reset = OneWireReset();
printf("2 return WireReset: %d\r\n", reset);
OneWireWriteByte(0xCC);
OneWireWriteByte(0xBE);
u8 LSB = OneWireReadByte();
u8 MSB = OneWireReadByte();
reset = OneWireReset();
printf("3 return WireReset: %d, LSB: %d, MSB: %d\r\n", reset, LSB, MSB);
u16 data = MSB;
u16 temperature = (data << 8) | LSB;
return temperature;
}
void OneWireInit() {
drv_gpio_up_down_resistor(GPIO_TEMP, PM_PIN_PULLUP_10K);
drv_gpio_irq_dis(GPIO_TEMP);
OneWireRelease();
}