[Tinyos-help] Connecting PCF8563 RTC to Iris
Andres Vahter
andres.vahter at gmail.com
Fri Jul 31 06:38:29 PDT 2009
I got little furher.
Now I know that 7 bit address must be used. Instead of 0xA2, 0x51 must
be used. I2C component shifts it to left and adds R/W bit.
module NodeC {
uses interface Boot;
uses interface Resource;
uses interface I2CPacket<TI2CBasicAddr> as I2C;
................
uint8_t i2cState=0;
uint8_t buffer[17];
................
event void Boot.booted() {
call Resource.request(); // RTC i2c
}
event void Resource.granted() {
buffer[0] = 0x00; // word address 0, next bytes are data, memory
address is auto incremented
buffer[1] = 0x00; // 00 control/status1, no test modes or POR
override
buffer[2] = 0x00; // 01 control/status2, no alarm/timer flags and
interrupts
buffer[3] = 0x02; // 02 setting seconds clear the voltage low
detector
buffer[4] = 0x05; // 03 setting minutes
buffer[5] = 0x14; // 04 setting hours
buffer[6] = 0x03; // 05 setting date
buffer[7] = 0x06; // 06 setting day of week
buffer[8] = 0x04; // 07 setting century and months
buffer[9] = 0x09; // 08 setting years
buffer[10] = 0x80; // 09 setting minute alarm
buffer[11] = 0x80; // 0A setting hour alarm
buffer[12] = 0x80; // 0B setting day alarm
buffer[13] = 0x80; // 0C setting weekday alarm
buffer[14] = 0x83; // 0D setting weekday alarm
buffer[15] = 0x00; // 0E timer control
buffer[16] = 0x00; // 0F timer
i2cState = 0;
call I2C.write(I2C_START | I2C_STOP, 0x51, 17, buffer); // 0xA2 >> 1
}
async event void I2C.writeDone(error_t error, uint16_t addr, uint8_t
length, uint8_t* data) {
// page 16 fig 15.
if(i2cState == 0){
buffer[0] = 0x02; // seconds - register address
i2cState = 1;
call I2C.write(I2C_START, 0x51, 1, &buffer[0])
}
else if(i2cState == 1){
buffer[0] = 0x00; // not needed - how to send no data?
i2cState = 2;
call I2C.read(I2C_START | I2C_STOP, 0x51, 1, &buffer[0])
}
}
async event void I2C.readDone(error_t error, uint16_t addr, uint8_t
length, uint8_t* data) {
uint16_t val;
val = data[3];
..................
}
I have a question about I2C.readDone *data value. What it contains?
It doesn't return only requested register value?
I can see that data[3] contains seconds, data[4] minutes etc - it
contains the same values what I initalized in Resource.granted() event .
Why it is so, why doesn't it contain just what I have requested?
Actually I think my reading logic is faulty.
According to http://www.datasheetcatalog.com/datasheets_pdf/P/C/F/8/PCF8563.shtml
page 16 fig 15. master must send no data after slave read address.
Can I do it with I2CPacket.read? As I can see it can not send no data
to slave read address.
Read sequence ( page 16 fig 15 ):
START | SLAVE ADDRESS Write(0xA2) || ack || WORD ADDRESS || ack ||
SLAVE ADDRESS Read (0xA3) || ack || DATA | STOP
How do to that reading part - should I use lower level I2C components
or is it possible to do it with I2CPacket?
Andres Vahter
More information about the Tinyos-help
mailing list