- //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 <Wire.h>
- 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;
- }
DS28CM00R Serial ID
Posted by Anonymous on Thu 5th Nov 2015 21:46
raw | new post
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.