//Arduino UNO code to read the // DS28CM00R-A00+T // DS28CM00R // Security ICs / Authentication ICs I2C/SMBus Silicon Serial Number // Tested with arduino.cc 1.5.8 #include byte incomingData[9]={ 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00 }; void setup() { byte retV; Serial.begin(9600); for (int i=0; i<5; i++) { Serial.println("Boot..."); delay(500); } Wire.begin(); delay(100); Serial.println("Trying to read\n"); delay(100); retV=Wire.requestFrom(0x50, 9); Serial.print("Result: ["); Serial.print(retV,DEC); Serial.println("]"); int incomingPointer=0x00; while(Wire.available()) // slave may send less than requested { byte c = Wire.read(); // receive a byte as character if (c<0x10) {Serial.print("0");} Serial.print(c &0xFF,HEX); // print the character Serial.print("-"); incomingData[incomingPointer]=(byte)(c); incomingPointer++; } Serial.println("------------"); int deviceFamily=incomingData[0]; unsigned long serialNumber=0x00; unsigned long upperSerialNumber=0x00; byte calcChecksum=0x00; for (int i=0; i<9; i++) { Serial.print(i,DEC); Serial.print("=0x"); if (incomingData[i]<0x10) {Serial.print("0");} Serial.print(incomingData[i]&0xFF,HEX); Serial.print(","); Serial.print(incomingData[i],DEC); Serial.println(" "); } upperSerialNumber+=((unsigned long)incomingData[5])<<0; upperSerialNumber+=((unsigned long)incomingData[6])<<8; upperSerialNumber+=((unsigned long)incomingData[0])<<16; serialNumber+=((unsigned long)incomingData[1])<<0; serialNumber+=((unsigned long)incomingData[2])<<8; serialNumber+=((unsigned long)incomingData[3])<<16; serialNumber+=((unsigned long)incomingData[4])<<24; byte checkSum=incomingData[7]; Serial.println("================"); Serial.print("DeviceFamily="); Serial.print(deviceFamily,HEX); Serial.println(" "); Serial.print("Upper 32 Bit ID=0x"); Serial.print(upperSerialNumber,HEX); Serial.print(" = DEC "); Serial.print(upperSerialNumber,DEC); Serial.println(" "); Serial.print("Lower 32 Bit ID=0x"); Serial.print(serialNumber,HEX); Serial.print(" = DEC "); Serial.print(serialNumber,DEC); Serial.println(" "); calcChecksum=CRC8(incomingData,7); Serial.print("Checksum="); Serial.print(checkSum,HEX); Serial.print(" == "); Serial.print(calcChecksum,HEX); Serial.print(" "); if (checkSum==calcChecksum) Serial.print("MATCH"); else Serial.print("NO Match"); Serial.println(" "); Serial.println("Note: Upper Serial # contains deviceFamily + bits 40 to 47 + bits 32 to 39"); Serial.println("Done"); } void loop() { } //CRC-8 - based on the CRC8 formulas by Dallas/Maxim //code released under the therms of the GNU GPL 3.0 license //https://github.com/rpicopter/AvrMiniCopter-Arduino/blob/master/crc8.h byte CRC8(const byte *data, byte len) { byte crc = 0x00; while (len--) { byte extract = *data++; for (byte tempI = 8; tempI; tempI--) { byte sum = (crc ^ extract) & 0x01; crc >>= 1; if (sum) { crc ^= 0x8C; } extract >>= 1; } } return crc; }