uint32_t OneWire_Init( void ) { printf("\n%s called",__FUNCTION__); printf("\nScanning 1-wire bus..."); tempidx = -1; // Assume we don't find a temperature sensor for( int i = 0; i < sizeof(tcidmapping); i++ ) { tcidmapping[i] = -1; // Assume we don't find any thermocouple interfaces } int rslt = OWFirst(); numowdevices = 0; while (rslt && numowdevices < MAX_OW_DEVICES) { memcpy(owdeviceids[numowdevices], ROM_NO, sizeof(ROM_NO)); numowdevices++; rslt = OWNext(); } if(numowdevices) { for( int iter = 0; iter < numowdevices; iter++ ) { printf("\n Found "); for( int idloop = 7; idloop >= 0; idloop-- ) { printf("%02x", owdeviceids[iter][idloop]); } uint8_t family = owdeviceids[iter][0]; if(family == OW_FAMILY_TEMP) { selectdevbyidx(iter); xferbyte(OW_WRITE_SCRATCHPAD); xferbyte(0x00); xferbyte(0x00); xferbyte(0x1f); // Reduce resolution to 0.5C to keep conversion time reasonable tempidx = iter; // Keep track of where we saw the last/only temperature sensor printf(" [Temperature sensor]"); } else if(family == OW_FAMILY_TC) { selectdevbyidx(iter); xferbyte(OW_READ_SCRATCHPAD); xferbyte(0xff); xferbyte(0xff); xferbyte(0xff); xferbyte(0xff); uint8_t tcid = xferbyte(0xff) & 0x0f; tcidmapping[tcid] = iter; // Keep track of the ID mapping printf(" [Thermocouple interface, ID %x]",tcid); } } } else { printf(" No devices found!"); } return numowdevices; }
uint8_t doSlave(uint8_t* message) { uint8_t i; uint8_t cmd = message[0]; uint8_t datalen = 0; uint8_t retval = 0; debugPrint("command=%x\r\n", cmd); if (cmd == 0x10) { } else if (cmd == 0x11) { message[2] = OWFirst() ? 1 : 0; datalen = 1; } else if (cmd == 0x12) { message[2] = OWNext() ? 1 : 0; datalen = 1; } else if (cmd == 0x13) { datalen = 8; for (i = 0; i < 8; i++) { message[i + 2] = getROM_NO(i); } } else if (cmd == 0x16) { OWTargetSetup(0x00); } else if (cmd == 0x19) { message[2] = OWReadByte(); datalen = 1; } else if (cmd == 0x1B) { uint8_t len; uint8_t* _buf; len = message[1]; _buf = message + 2; retval = OWBlock(_buf, len) ? 0x00 : 0xFF; memcpy(message + 2, _buf, len); datalen = len; } else if (cmd == 0x1C) { message[2] = OWReset(); datalen = 1; } else if (cmd == 0x1D) { // OWWriteByte(message[1]); uint8_t len; uint8_t* _buf; len = message[1]; _buf = message + 2; retval = OWBlock(_buf, len) ? 0x00 : 0xFF; memcpy(message + 2, _buf, len); datalen = len; } else if (cmd == 0x1E) { // OWLevel(MODE_NORMAL); } else if (cmd == 0x1F) { OWTargetSetup(message[1]); } else if (cmd == 0x20) { OWFamilySkipSetup(); } else if (cmd == 0x21) { uint8_t address[8]; memcpy(address, message + 2, 8); message[2] = OWSearchROM(address); datalen = 1; } else if (cmd == 0x22) { uint8_t address[8]; memcpy(address, message + 2, 8); message[2] = OWMatchROM(address); datalen = 1; } else { retval = 0xFF; } message[0] = retval; if (retval == 0xFF) { datalen = 0; } message[1] = datalen; return datalen; }
uint32_t OneWire_Init(void) { printf("\n%s called", __FUNCTION__); Sched_SetWorkfunc(ONEWIRE_WORK, OneWire_Work); printf("\nScanning 1-wire bus..."); tempidx = -1; // Assume we don't find a temperature sensor for (int i = 0; i < sizeof(tcidmapping); i++) { tcidmapping[i] = -1; // Assume we don't find any thermocouple interfaces } uint32_t save = VIC_DisableIRQ(); int rslt = OWFirst(); VIC_RestoreIRQ( save ); numowdevices = 0; while (rslt && numowdevices < MAX_OW_DEVICES) { memcpy(owdeviceids[numowdevices], ROM_NO, sizeof(ROM_NO)); numowdevices++; save = VIC_DisableIRQ(); rslt = OWNext(); VIC_RestoreIRQ( save ); } if (numowdevices) { for (int iter = 0; iter < numowdevices; iter++) { printf("\n Found "); for (int idloop = 7; idloop >= 0; idloop--) { printf("%02x", owdeviceids[iter][idloop]); } uint8_t family = owdeviceids[iter][0]; if (family == OW_FAMILY_TEMP1 || family == OW_FAMILY_TEMP2 || family == OW_FAMILY_TEMP3) { const char* sensorname = "UNKNOWN"; if (family == OW_FAMILY_TEMP1) { sensorname = "DS1822"; } else if (family == OW_FAMILY_TEMP2) { sensorname = "DS18B20"; } else if (family == OW_FAMILY_TEMP3) { sensorname = "DS18S20"; } save = VIC_DisableIRQ(); selectdevbyidx(iter); xferbyte(OW_WRITE_SCRATCHPAD); xferbyte(0x00); xferbyte(0x00); xferbyte(0x1f); // Reduce resolution to 0.5C to keep conversion time reasonable VIC_RestoreIRQ(save); tempidx = iter; // Keep track of where we saw the last/only temperature sensor printf(" [%s Temperature sensor]", sensorname); } else if (family == OW_FAMILY_TC) { save = VIC_DisableIRQ(); selectdevbyidx(iter); xferbyte(OW_READ_SCRATCHPAD); xferbyte(0xff); xferbyte(0xff); xferbyte(0xff); xferbyte(0xff); uint8_t tcid = xferbyte(0xff) & 0x0f; VIC_RestoreIRQ( save ); tcidmapping[tcid] = iter; // Keep track of the ID mapping printf(" [Thermocouple interface, ID %x]",tcid); } } } else { printf(" No devices found!"); } if (numowdevices) { Sched_SetState(ONEWIRE_WORK, 2, 0); // Enable OneWire task if there's at least one device } return numowdevices; }
//-------------------------------------------------------------------------- // TEST BUILD MAIN // int main(void) { int rslt,i,cnt; double temp; char buf[12]; // find ALL devices printf("\nFIND ALL\n"); cnt = 0; rslt = OWFirst(); while (rslt) { // print device found for (i = 7; i >= 0; i--) printf("%02X", ROM_NO[i]); printf(" %d\n",++cnt); rslt = OWNext(); } // find only 0x10 printf("\nFIND ONLY 0x10\n"); cnt = 0; OWTargetSetup(0x10); while (OWNext()) { // check for incorrect type if (ROM_NO[0] != 0x10) break; // print device found for (i = 7; i >= 0; i--) printf("%02X", ROM_NO[i]); printf(" %d\n",++cnt); } if (cnt == 1) { DS1820_startConversion(); uint8_t spdata[10]; sleep10(7); DS1820_readScratchPad(spdata); temp = DS1820_getTemperature(spdata); temp = temp*9.0/5.0 +32.0; printf("TEMP(F) = %s\n\n",dtostrf(temp,7,2,(char *)buf)); } // find all but 0x04, 0x1A, 0x23, and 0x01 printf("\nFIND ALL EXCEPT 0x10, 0x04, 0x0A, 0x1A, 0x23, 0x01\n"); cnt = 0; rslt = OWFirst(); while (rslt) { // check for incorrect type if ((ROM_NO[0] == 0x04) || (ROM_NO[0] == 0x1A) || (ROM_NO[0] == 0x01) || (ROM_NO[0] == 0x23) || (ROM_NO[0] == 0x0A) || (ROM_NO[0] == 0x10)) OWFamilySkipSetup(); else { // print device found for (i = 7; i >= 0; i--) printf("%02X", ROM_NO[i]); printf(" %d\n",++cnt); } rslt = OWNext(); } //////////////////////////////////////////////////////////////////////////////////////////////// // find ALL DS2438 double voltage = 0.0; int myDS2438 = 0; uint8_t DS2438deviceNumber[8]; double bigT = -1.; int micro10voltage = 0; printf("\nFind all DS2438; Read Temperature and Voltage\n"); for (rslt=OWFirstType(0x26); rslt; rslt=OWNextType(0x26)) { // print device found for (i = 7; i >= 0; i--) printf("%02X", ROM_NO[i]); printf("\n"); // Save the first ROM if (myDS2438 == 0) { myDS2438++; for (i = 0; i < 8; i++) { DS2438deviceNumber[i] = ROM_NO[i]; } } if (myDS2438 > 0) { // (default) Read Vdd SetupAtoD(0x0F, DS2438deviceNumber); bigT = Get_Temperature(DS2438deviceNumber); printf("TEMP = %s\n\n",dtostrf(bigT,7,3,(char *)buf)); voltage = ReadAtoD(DS2438deviceNumber); printf("VDD = %s\n",dtostrf(voltage,6,2,(char *)buf)); } if (myDS2438 > 0) { // (default) Read Vad SetupAtoD(0x07, DS2438deviceNumber); voltage = ReadAtoD(DS2438deviceNumber); micro10voltage = getDS2438Voltage(DS2438deviceNumber); printf("VAD = %s\n",dtostrf(voltage,6,2,(char *)buf)); printf("Micro V = %d\n", micro10voltage); } } sleep(1); return 0 ; }