Skip to content

Smart iButton (TM1990A, DS1990A, RW1990)

blahlt edited this page Jul 26, 2017 · 2 revisions

ROM komandos

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ų.

Read ROM [0x33]

Š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ą.

Match ROM [0x55]

TODO

RW1990 perrašymas su Arduino

#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;
}

Reader / Writer

reader / writer

Links

http://www.datastat.com/sysadminjournal/maximcrc.cgi
http://electromost.com/news/protokol_dlja_ehlektronnykh_kljuchej_rw1990/2011-04-24-35

Clone this wiki locally