-
Notifications
You must be signed in to change notification settings - Fork 2
Smart iButton (TM1990A, DS1990A, RW1990)
Kai tik master įrenginys aptinka slave įrenginio būvimo signalą (angl. presence pulse) galima vykdyti bet kurią iš keturių ROM komandų. Visos ROM komandos yra 8 bitų.
Ši komanda suteikia galimybę nuskaityti slave įrenginio 8 bitų kodą, 48 bitų serijinį numerį ir 8 bitų CRC kontrolinę sumą (CRC suma gali būti ir neteisinga), apskaičiuojamą iš 8 bitų įrenginio kodo ir 48 bitų serijinio numerio (pvz. 01 0B 73 04 00 00 00 E8, kur 01 - įrenginio kodas, 0B 73 04 00 00 00 - serijinis numeris, o E8 - CRC kontrolinė suma apskaičiuota pagal 01 0B 73 04 00 00 00). Šią komandą galima naudoti tik tada kai yra prijungtas tik vienas slave įrenginys, antraip įvyks duomenų kolizija kai visi prijungti slave įrenginiai tuo pačiu metu bandys perduoti informaciją.
TODO
#include <OneWire.h>
#define pin 12
OneWire ibutton (pin);
byte addr[8];
void setup(){
Serial.begin(115200);
}
void loop(){
if (!ibutton.search(addr)){
ibutton.reset_search();
delay(200);
return;
}
Serial.print(millis() / 1000);
Serial.print("> ");
for (byte x = 0; x<8; x++){
Serial.print(addr[x], HEX);
Serial.print(" ");
}
byte crc;
crc = ibutton.crc8(addr, 7);
Serial.print("CRC: ");
Serial.println(crc, HEX);
if (Serial.read() == 'w'){
ibutton.skip(); ibutton.reset(); ibutton.write(0x33);
Serial.print(" ID before write:");
for (byte x=0; x<8; x++){
Serial.print(' ');
Serial.print(ibutton.read(), HEX);
}
ibutton.skip();
ibutton.reset();
ibutton.write(0xD1);
// send logical 0
digitalWrite(10, LOW); pinMode(10, OUTPUT); delayMicroseconds(60);
pinMode(10, INPUT); digitalWrite(10, HIGH); delay(10);
Serial.print('\n');
Serial.print(" Writing iButton ID:\n ");
byte newID[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
ibutton.skip();
ibutton.reset();
ibutton.write(0xD5);
for (byte x = 0; x<8; x++){
writeByte(newID[x]);
Serial.print('*');
}
Serial.print('\n');
ibutton.reset();
ibutton.write(0xD1);
// send logical 1
digitalWrite(10, LOW); pinMode(10, OUTPUT); delayMicroseconds(10);
pinMode(10, INPUT); digitalWrite(10, HIGH); delay(10);
}
}
int writeByte(byte data){
for (byte data_bit=0; data_bit<8; data_bit++) {
if (data & 1) {
digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
delayMicroseconds(60);
pinMode(pin, INPUT); digitalWrite(pin, HIGH);
delay(10);
} else {
digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
pinMode(pin, INPUT); digitalWrite(pin, HIGH);
delay(10);
}
data = data >> 1;
}
return 0;
}
http://www.datastat.com/sysadminjournal/maximcrc.cgi
http://electromost.com/news/protokol_dlja_ehlektronnykh_kljuchej_rw1990/2011-04-24-35