2571 |
kaklik |
1 |
/* |
|
|
2 |
DS250x add-only programmable memory reader w/SKIP ROM. |
|
|
3 |
|
|
|
4 |
The DS250x is a 512/1024bit add-only PROM(you can add data but cannot change the old one) that's used mainly for device identification purposes |
|
|
5 |
like serial number, mfgr data, unique identifiers, etc. It uses the Maxim 1-wire bus. |
|
|
6 |
|
|
|
7 |
This sketch will use the SKIP ROM function that skips the 1-Wire search phase since we only have one device connected in the bus on digital pin 6. |
|
|
8 |
If more than one device is connected to the bus, it will fail. |
|
|
9 |
Sketch will not verify if device connected is from the DS250x family since the skip rom function effectively skips the family-id byte readout. |
|
|
10 |
thus it is possible to run this sketch with any Maxim OneWire device in which case the command CRC will most likely fail. |
|
|
11 |
Sketch will only read the first page of memory(32bits) starting from the lower address(0000h), if more than 1 device is present, then use the sketch with search functions. |
|
|
12 |
Remember to put a 4.7K pullup resistor between pin 6 and +Vcc |
|
|
13 |
|
|
|
14 |
To change the range or ammount of data to read, simply change the data array size, LSB/MSB addresses and for loop iterations |
|
|
15 |
|
|
|
16 |
This example code is in the public domain and is provided AS-IS. |
|
|
17 |
|
|
|
18 |
Built with Arduino 0022 and PJRC OneWire 2.0 library http://www.pjrc.com/teensy/td_libs_OneWire.html |
|
|
19 |
|
|
|
20 |
created by Guillermo Lovato <glovato@gmail.com> |
|
|
21 |
march/2011 |
|
|
22 |
|
|
|
23 |
*/ |
|
|
24 |
|
|
|
25 |
#include <OneWire.h> |
|
|
26 |
OneWire ds(6); // OneWire bus on digital pin 6 |
|
|
27 |
void setup() { |
|
|
28 |
Serial.begin (9600); |
|
|
29 |
} |
|
|
30 |
|
|
|
31 |
void loop() { |
|
|
32 |
byte i; // This is for the for loops |
|
|
33 |
boolean present; // device present var |
|
|
34 |
byte data[32]; // container for the data from device |
|
|
35 |
byte leemem[3] = { // array with the commands to initiate a read, DS250x devices expect 3 bytes to start a read: command,LSB&MSB adresses |
|
|
36 |
0xF0 , 0x00 , 0x00 }; // 0xF0 is the Read Data command, followed by 00h 00h as starting address(the beginning, 0000h) |
|
|
37 |
byte ccrc; // Variable to store the command CRC |
|
|
38 |
byte ccrc_calc; |
|
|
39 |
|
|
|
40 |
present = ds.reset(); // OneWire bus reset, always needed to start operation on the bus, returns a 1/TRUE if there's a device present. |
|
|
41 |
ds.skip(); // Skip ROM search |
|
|
42 |
|
|
|
43 |
if (present == TRUE){ // We only try to read the data if there's a device present |
|
|
44 |
Serial.println("DS250x device present"); |
|
|
45 |
ds.write(leemem[0],1); // Read data command, leave ghost power on |
|
|
46 |
ds.write(leemem[1],1); // LSB starting address, leave ghost power on |
|
|
47 |
ds.write(leemem[2],1); // MSB starting address, leave ghost power on |
|
|
48 |
|
|
|
49 |
ccrc = ds.read(); // DS250x generates a CRC for the command we sent, we assign a read slot and store it's value |
|
|
50 |
ccrc_calc = OneWire::crc8(leemem, 3); // We calculate the CRC of the commands we sent using the library function and store it |
|
|
51 |
|
|
|
52 |
if ( ccrc_calc != ccrc) { // Then we compare it to the value the ds250x calculated, if it fails, we print debug messages and abort |
|
|
53 |
Serial.println("Invalid command CRC!"); |
|
|
54 |
Serial.print("Calculated CRC:"); |
|
|
55 |
Serial.println(ccrc_calc,HEX); // HEX makes it easier to observe and compare |
|
|
56 |
Serial.print("DS250x readback CRC:"); |
|
|
57 |
Serial.println(ccrc,HEX); |
|
|
58 |
return; // Since CRC failed, we abort the rest of the loop and start over |
|
|
59 |
} |
|
|
60 |
Serial.println("Data is: "); // For the printout of the data |
|
|
61 |
for ( i = 0; i < 32; i++) { // Now it's time to read the PROM data itself, each page is 32 bytes so we need 32 read commands |
|
|
62 |
data[i] = ds.read(); // we store each read byte to a different position in the data array |
|
|
63 |
Serial.print(data[i]); // printout in ASCII |
|
|
64 |
Serial.print(" "); // blank space |
|
|
65 |
} |
|
|
66 |
Serial.println(); |
|
|
67 |
delay(5000); // Delay so we don't saturate the serial output |
|
|
68 |
} |
|
|
69 |
else { // Nothing is connected in the bus |
|
|
70 |
Serial.println("Nothing connected"); |
|
|
71 |
delay(3000); |
|
|
72 |
} |
|
|
73 |
} |
|
|
74 |
|
|
|
75 |
|
|
|
76 |
|
|
|
77 |
|
|
|
78 |
|
|
|
79 |
|
|
|
80 |
|
|
|
81 |
|
|
|
82 |
|
|
|
83 |
|
|
|
84 |
|
|
|
85 |
|
|
|
86 |
|
|
|
87 |
|
|
|
88 |
|
|
|
89 |
|
|
|
90 |
|