c - TWI and DS3231 library in avr-gcc -
could tell me if library correct?
function (rtcreadminutes(uint8_t* minutes)) returning (5). means (i2cstart()) returning (0) why. tried written in datasheet. using atmega 328 , rtc ds3231. connected corectly.
i2c.h
#ifndef i2c_h #define i2c_h #include <avr/io.h> #include <util/delay.h> #define start 0x08 #define start_rep 0x10 #define mt_sla_ack 0x18 #define mt_data_ack 0x28 #define mr_sla_ack 0x40 #define mr_data_nack 0x58 void i2cinit(void); uint8_t i2cstart(void); uint8_t i2cstartrep(void); uint8_t i2cstop(void); uint8_t i2csendaddress(uint8_t); uint8_t i2csenddata(uint8_t); uint8_t i2creadack(void); uint8_t i2creceivedata(uint8_t*); #endif
i2c.c
#include "i2c.h" void i2cinit(void) { //set scl 400khz twsr = 0x00; twbr = 0x0c; //enable twi twcr = (1<<twen); } uint8_t i2cstart(void) { twcr = (1<<twint)|(1<<twsta)|(1<<twen); while(!(twcr & (1<<twint))); if ((twsr & 0xf8) != start) return 0; else return 1; } uint8_t i2cstartrep(void) { twcr = (1<<twint)|(1<<twsta)|(1<<twen); while(!(twcr & (1<<twint))); if ((twsr & 0xf8) != start_rep) return 0; else return 1; } uint8_t i2cstop(void) { twcr = (1<<twint)|(1<<twsto)|(1<<twen); return 1; } uint8_t i2csendaddress(uint8_t add) { twdr = add; twcr = (1<<twint) | (1<<twen); while (!(twcr & (1<<twint))); if (add & 0x01) if ((twsr & 0xf8) != mr_sla_ack) return 0; else return 1; else if ((twsr & 0xf8) != mt_sla_ack) return 0; else return 1; } uint8_t i2csenddata(uint8_t data) { twdr = data; twcr = (1<<twint) | (1<<twen); while (!(twcr & (1<<twint))); if ((twsr & 0xf8) != mt_data_ack) return 0; else return 1; } uint8_t i2creadack(void) { twcr = (1<<twint)|(1<<twen)|(1<<twea); while ((twcr & (1<<twint)) == 0); return twdr; } uint8_t i2creceivedata(uint8_t* data) { twcr = (1<<twint)|(1<<twen); while ((twcr & (1<<twint)) == 0); *data=twdr; if ((twsr & 0xf8) != mr_data_nack) return 0; else return 1; }
rtc.h
#ifndef rtc_h #define rtc_c #include <avr/io.h> #include <util/delay.h> #include "i2c.h" #define rtc_address 0xc0 #define seconds_address 0x00 #define minutes_address 0x01 #define hours_address 0x02 #define day_address 0x03 #define date_address 0x04 uint8_t rtcreadminutes(uint8_t*); uint8_t rtcreadhours(void); #endif
rtc.c
#include "rtc.h" uint8_t rtcreadminutes(uint8_t* minutes) { if (!i2cstart()) return 5; if (!i2csenddata(rtc_address)) return 0; if (!i2csenddata(minutes_address)) return 0; if (!i2cstartrep()) return 0; if (!i2csenddata(rtc_address | 1)) return 0; if (!i2creceivedata(minutes)) return 0; i2cstop(); return 1; } uint8_t rtcreadhours(void) { return 1; }
Comments
Post a Comment