[Tinyos-help] Connecting PCF8563 RTC to Iris
Andres Vahter
andres.vahter at gmail.com
Wed Jul 29 05:22:47 PDT 2009
Hi,
I'm tryng to connect PCF8563 real time clock to Iris using I2C. http://www.datasheetcatalog.com/datasheets_pdf/P/C/F/8/PCF8563.shtml
I'm not sure how to read and write time values.
Here is a tutorial how to do it with bus pirate: http://hackaday.com/2009/06/26/parts-i2c-real-time-clock-calendar-pcf8563/
And here is another example from http://www.nxp.com/acrobat_download/applicationnotes/AN_pcf8563-73-83-93_real_time_clock.pdf
Setting the clock is a straight forward procedure, setting first the
mode and
then the actual time: e.g Friday, July 16 1999, 2’45 pm
Binary Hex,addr,comments
generate I2C-bus start condition
1 0 1 0 0 0 1 W A2 slave address
0 0 0 0 0 0 0 0 00 word address 0, next bytes are data
0 0 0 0 0 0 0 0 00 00 control/status1, no test modes or POR override
0 0 0 0 0 0 0 0 00 01 control/status2, no alarm/timer flags and
interrupts
0 0 0 0 0 0 0 0 00 02 setting seconds clear the voltage low detector
0 1 0 0 0 1 0 1 45 03 setting minutes
0 0 0 1 0 1 0 0 14 04 setting hours to 14
0 0 0 1 0 1 0 1 16 05 setting days to 16
0 0 0 0 0 1 0 1 03 06 setting weekdays to Friday
1 0 0 0 0 1 1 1 07 07 setting month to 7 and century bit to 1
1 0 0 1 1 0 0 1 99 08 setting years to 99
1 0 0 0 0 0 0 0 80 09 alarm values reset to 00
1 0 0 0 0 0 0 0 80 0A alarm values reset to 00
1 0 0 0 0 0 0 0 80 0B alarm values reset to 00
1 0 0 0 0 0 0 0 80 0C alarm values reset to 00
1 0 0 0 0 0 0 0 00 0D setting frequency out to 32768Hz e.g. for
tuning
0 0 0 0 0 0 0 0 00 0E timer switched off
generate I2C-bus stop condition
How to do it in TinyOS 2? Here's what I did:
---------NodeC.nc-----------------------------
module NodeC {
.........
uses interface Boot;
uses interface AMSend as Send;
uses interface Leds;
uses interface Resource;
uses interface I2CPacket<TI2CBasicAddr> as I2C;
.......
uint8_t buffer[4]; // write
uint8_t rbuffer[4]; // read
.....
event void Boot.booted() {
call Resource.request(); // RTC i2c
}
event void Resource.granted() {
buffer[0] = 0xA2;
buffer[1] = 0x00;
buffer[2] = 0xF;
buffer[3] = 0x00;
// Init time
if (call I2C.write(I2C_START | I2C_STOP, 0xA2, sizeof(uint8_t),
&buffer[0]) == SUCCESS) {
}
// write to control status 1
if (call I2C.write(I2C_START | I2C_STOP, 0x00, sizeof(uint8_t),
&buffer[0]) == SUCCESS) {
}
// init seconds to 15
if (call I2C.write(I2C_START | I2C_STOP, 0x02, sizeof(uint8_t),
&buffer[2]) == SUCCESS) {
}
// Read time
if (call I2C.write(I2C_START | I2C_STOP, 0xA3, sizeof(uint8_t),
&buffer[0]) == SUCCESS) {
call Leds.led2On();
}
if (call I2C.read(I2C_START | I2C_STOP, 0x02, sizeof(uint8_t),
&rbuffer[0]) == SUCCESS)
// call Leds.led1On();
dateAndTime = rbuffer[0];
}
async event void I2C.readDone(error_t error, uint16_t addr, uint8_t
length, uint8_t* data) {
}
async event void I2C.writeDone(error_t error, uint16_t addr, uint8_t
length, uint8_t* data) {
call Leds.led2On();
}
I'm confused about addresses. I2C write address is 0xA2 and read
address 0xA3.
How to just send 0xA2 to I2C like in pseudo code:
1 0 1 0 0 0 1 W A2 slave address (how to send it)?
0 0 0 0 0 0 0 0 00 word address 0, next bytes are data
0 0 0 0 0 0 0 0 00 00 control/status1, no test modes or POR
override (how this should be sent - it's little different from first
line?)
Do I have to always send data to address 0xA2 and seconds address must
be also in buffer[2] when I want to init it to for example 15?
Should I call:
buffer[2] = addr + init value (02+0xF)
call I2C.write(I2C_START | I2C_STOP, 0xA2, sizeof(uint8_t),
&buffer[2]) == SUCCESS)
Any hints how PCF8563 should be used with TinyOS2 on Iris mote?
Andres Vahter
-------------- next part --------------
An HTML attachment was scrubbed...
URL: https://www.millennium.berkeley.edu/pipermail/tinyos-help/attachments/20090729/1ca063c0/attachment-0001.htm
More information about the Tinyos-help
mailing list