static void selectdevbyidx(int idx) { if(idx < numowdevices) { resetbus(); xferbyte(OW_MATCH_ROM); for( int idloop = 0; idloop < 8; idloop++ ) { // Send ROM device ID xferbyte(owdeviceids[idx][idloop]); } } }
int OneWire_PerformTemperatureConversion(void) { uint8_t scratch[9]; if(resetbus()) { xferbyte(OW_SKIP_ROM); // All devices on the bus are addressed here xferbyte(OW_CONVERT_T); setpin1(); BusyWait8(94000<<3); // For 9-bit resolution for( int i = 0; i < numowdevices; i++ ) { selectdevbyidx(i); xferbyte(OW_READ_SCRATCHPAD); for(uint32_t iter=0; iter<2; iter++) { // Only read two bytes scratch[iter] = xferbyte(0xff); //printf("%02x ",scratch[iter]); } int16_t tmp = scratch[1]<<8 | scratch[0]; devreadout[i] = tmp; } } else { BusyWait8(94000<<3); // Maintain timing if no sensors are found for the time being } return numowdevices; }
static int32_t OneWire_Work(void) { static uint8_t mystate = 0; uint8_t scratch[9]; int32_t retval = 0; if (mystate == 0) { uint32_t save = VIC_DisableIRQ(); if (resetbus()) { xferbyte(OW_SKIP_ROM); // All devices on the bus are addressed here xferbyte(OW_CONVERT_T); setpin1(); //retval = TICKS_MS(94); // For 9-bit resolution retval = TICKS_MS(100); // TC interface needs max 100ms to be ready mystate++; } VIC_RestoreIRQ( save ); } else if (mystate == 1) { for (int i = 0; i < numowdevices; i++) { uint32_t save = VIC_DisableIRQ(); selectdevbyidx(i); xferbyte(OW_READ_SCRATCHPAD); for (uint32_t iter = 0; iter < 4; iter++) { // Read four bytes scratch[iter] = xferbyte(0xff); } VIC_RestoreIRQ(save); int16_t tmp = scratch[1]<<8 | scratch[0]; devreadout[i] = tmp; tmp = scratch[3]<<8 | scratch[2]; extrareadout[i] = tmp; } mystate = 0; } else { retval = -1; } return retval; }
//-------------------------------------------------------------------------- // Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing // search state. // Return TRUE : device found, ROM number in ROM_NO buffer // FALSE : device not found, end of search // static int OWSearch() { int id_bit_number; int last_zero, rom_byte_number, search_result; int id_bit, cmp_id_bit; uint8_t rom_byte_mask, search_direction; // initialize for search id_bit_number = 1; last_zero = 0; rom_byte_number = 0; rom_byte_mask = 1; search_result = 0; crc8 = 0; // if the last call was not the last one if (!LastDeviceFlag) { // 1-Wire reset if (!resetbus()) { // No devices found // reset the search LastDiscrepancy = 0; LastDeviceFlag = false; LastFamilyDiscrepancy = 0; return false; } // issue the search command xferbyte( OW_SEARCH_ROM ); // loop to do the search do { // read a bit and its complement id_bit = xferbit( true ); cmp_id_bit = xferbit( true ); // check for no devices on 1-wire if ((id_bit == 1) && (cmp_id_bit == 1)) break; else { // all devices coupled have 0 or 1 if (id_bit != cmp_id_bit) search_direction = id_bit; // bit write value for search else { // if this discrepancy if before the Last Discrepancy // on a previous next then pick the same as last time if (id_bit_number < LastDiscrepancy) search_direction = ((ROM_NO[rom_byte_number] & rom_byte_mask) > 0); else // if equal to last pick 1, if not then pick 0 search_direction = (id_bit_number == LastDiscrepancy); // if 0 was picked then record its position in LastZero if (search_direction == 0) { last_zero = id_bit_number; // check for Last discrepancy in family if (last_zero < 9) LastFamilyDiscrepancy = last_zero; } } // set or clear the bit in the ROM byte rom_byte_number // with mask rom_byte_mask if (search_direction == 1) ROM_NO[rom_byte_number] |= rom_byte_mask; else ROM_NO[rom_byte_number] &= ~rom_byte_mask; // serial number search direction write bit xferbit(search_direction); // increment the byte counter id_bit_number // and shift the mask rom_byte_mask id_bit_number++; rom_byte_mask <<= 1; // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask if (rom_byte_mask == 0) { docrc8(ROM_NO[rom_byte_number]); // accumulate the CRC rom_byte_number++; rom_byte_mask = 1; } } } while(rom_byte_number < 8); // loop until through all ROM bytes 0-7 // if the search was successful then if (!((id_bit_number < 65) || (crc8 != 0))) { // search successful so set LastDiscrepancy,LastDeviceFlag,search_result LastDiscrepancy = last_zero; // check for last device if (LastDiscrepancy == 0) LastDeviceFlag = true; search_result = true; } } // if no device found then reset counters so next 'search' will be like a first if (!search_result || !ROM_NO[0]) { LastDiscrepancy = 0; LastDeviceFlag = false; LastFamilyDiscrepancy = 0; search_result = false; } return search_result; }