I2C bus upgrade (#432)
This commit is contained in:
parent
d100f42b1f
commit
b83c2629b9
56 changed files with 909 additions and 804 deletions
|
@ -11,7 +11,6 @@
|
|||
#include "espressif/sdk_private.h"
|
||||
#include "esp8266.h"
|
||||
|
||||
#include "i2c/i2c.h"
|
||||
|
||||
/* Convert normal decimal to binary coded decimal */
|
||||
static inline uint8_t decToBcd(uint8_t dec)
|
||||
|
@ -28,20 +27,20 @@ static inline uint8_t bcdToDec(uint8_t bcd)
|
|||
/* Send a number of bytes to the rtc over i2c
|
||||
* returns true to indicate success
|
||||
*/
|
||||
static inline int ds3231_send(uint8_t reg, uint8_t *data, uint8_t len)
|
||||
static inline int ds3231_send(i2c_dev_t *dev, uint8_t reg, uint8_t *data, uint8_t len)
|
||||
{
|
||||
return i2c_slave_write(DS3231_ADDR, ®, data, len);
|
||||
return i2c_slave_write(dev->bus, dev->addr, ®, data, len);
|
||||
}
|
||||
|
||||
/* Read a number of bytes from the rtc over i2c
|
||||
* returns true to indicate success
|
||||
*/
|
||||
static inline int ds3231_recv(uint8_t reg, uint8_t *data, uint8_t len)
|
||||
static inline int ds3231_recv(i2c_dev_t *dev, uint8_t reg, uint8_t *data, uint8_t len)
|
||||
{
|
||||
return i2c_slave_read(DS3231_ADDR, ®, data, len);
|
||||
return i2c_slave_read(dev->bus, dev->addr, ®, data, len);
|
||||
}
|
||||
|
||||
int ds3231_setTime(struct tm *time)
|
||||
int ds3231_setTime(i2c_dev_t *dev, struct tm *time)
|
||||
{
|
||||
uint8_t data[7];
|
||||
|
||||
|
@ -54,10 +53,10 @@ int ds3231_setTime(struct tm *time)
|
|||
data[5] = decToBcd(time->tm_mon + 1);
|
||||
data[6] = decToBcd(time->tm_year - 100);
|
||||
|
||||
return ds3231_send(DS3231_ADDR_TIME, data, 7);
|
||||
return ds3231_send(dev, DS3231_ADDR_TIME, data, 7);
|
||||
}
|
||||
|
||||
int ds3231_setAlarm(uint8_t alarms, struct tm *time1, uint8_t option1, struct tm *time2, uint8_t option2)
|
||||
int ds3231_setAlarm(i2c_dev_t *dev, uint8_t alarms, struct tm *time1, uint8_t option1, struct tm *time2, uint8_t option2)
|
||||
{
|
||||
int i = 0;
|
||||
uint8_t data[7];
|
||||
|
@ -81,7 +80,7 @@ int ds3231_setAlarm(uint8_t alarms, struct tm *time1, uint8_t option1, struct tm
|
|||
(option2 == DS3231_ALARM2_MATCH_MINHOURDATE ? decToBcd(time2->tm_mday) : DS3231_ALARM_NOTSET));
|
||||
}
|
||||
|
||||
return ds3231_send((alarms == DS3231_ALARM_2 ? DS3231_ADDR_ALARM2 : DS3231_ADDR_ALARM1), data, i);
|
||||
return ds3231_send(dev, (alarms == DS3231_ALARM_2 ? DS3231_ADDR_ALARM2 : DS3231_ADDR_ALARM1), data, i);
|
||||
}
|
||||
|
||||
/* Get a byte containing just the requested bits
|
||||
|
@ -91,12 +90,12 @@ int ds3231_setAlarm(uint8_t alarms, struct tm *time1, uint8_t option1, struct tm
|
|||
* of use a mask of 0xff to just return the whole register byte
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_getFlag(uint8_t addr, uint8_t mask, uint8_t *flag)
|
||||
bool ds3231_getFlag(i2c_dev_t *dev, uint8_t addr, uint8_t mask, uint8_t *flag)
|
||||
{
|
||||
uint8_t data;
|
||||
|
||||
/* get register */
|
||||
if (!ds3231_recv(addr, &data, 1))
|
||||
if (!ds3231_recv(dev, addr, &data, 1))
|
||||
{
|
||||
/* return only requested flag */
|
||||
*flag = (data & mask);
|
||||
|
@ -112,12 +111,12 @@ bool ds3231_getFlag(uint8_t addr, uint8_t mask, uint8_t *flag)
|
|||
* DS3231_SET/DS3231_CLEAR/DS3231_REPLACE
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_setFlag(uint8_t addr, uint8_t bits, uint8_t mode)
|
||||
bool ds3231_setFlag(i2c_dev_t *dev, uint8_t addr, uint8_t bits, uint8_t mode)
|
||||
{
|
||||
uint8_t data;
|
||||
|
||||
/* get status register */
|
||||
if (!ds3231_recv(addr, &data, 1))
|
||||
if (!ds3231_recv(dev, addr, &data, 1))
|
||||
{
|
||||
/* clear the flag */
|
||||
if (mode == DS3231_REPLACE)
|
||||
|
@ -127,18 +126,18 @@ bool ds3231_setFlag(uint8_t addr, uint8_t bits, uint8_t mode)
|
|||
else
|
||||
data &= ~bits;
|
||||
|
||||
if (!ds3231_send(addr, &data, 1))
|
||||
if (!ds3231_send(dev, addr, &data, 1))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ds3231_getOscillatorStopFlag(bool *flag)
|
||||
bool ds3231_getOscillatorStopFlag(i2c_dev_t *dev, bool *flag)
|
||||
{
|
||||
uint8_t f;
|
||||
|
||||
if (ds3231_getFlag(DS3231_ADDR_STATUS, DS3231_STAT_OSCILLATOR, &f))
|
||||
if (ds3231_getFlag(dev, DS3231_ADDR_STATUS, DS3231_STAT_OSCILLATOR, &f))
|
||||
{
|
||||
*flag = (f ? true : false);
|
||||
return true;
|
||||
|
@ -147,76 +146,76 @@ bool ds3231_getOscillatorStopFlag(bool *flag)
|
|||
return false;
|
||||
}
|
||||
|
||||
inline bool ds3231_clearOscillatorStopFlag()
|
||||
inline bool ds3231_clearOscillatorStopFlag(i2c_dev_t *dev)
|
||||
{
|
||||
return ds3231_setFlag(DS3231_ADDR_STATUS, DS3231_STAT_OSCILLATOR, DS3231_CLEAR);
|
||||
return ds3231_setFlag(dev, DS3231_ADDR_STATUS, DS3231_STAT_OSCILLATOR, DS3231_CLEAR);
|
||||
}
|
||||
|
||||
inline bool ds3231_getAlarmFlags(uint8_t *alarms)
|
||||
inline bool ds3231_getAlarmFlags(i2c_dev_t *dev, uint8_t *alarms)
|
||||
{
|
||||
return ds3231_getFlag(DS3231_ADDR_STATUS, DS3231_ALARM_BOTH, alarms);
|
||||
return ds3231_getFlag(dev, DS3231_ADDR_STATUS, DS3231_ALARM_BOTH, alarms);
|
||||
}
|
||||
|
||||
inline bool ds3231_clearAlarmFlags(uint8_t alarms)
|
||||
inline bool ds3231_clearAlarmFlags(i2c_dev_t *dev, uint8_t alarms)
|
||||
{
|
||||
return ds3231_setFlag(DS3231_ADDR_STATUS, alarms, DS3231_CLEAR);
|
||||
return ds3231_setFlag(dev, DS3231_ADDR_STATUS, alarms, DS3231_CLEAR);
|
||||
}
|
||||
|
||||
inline bool ds3231_enableAlarmInts(uint8_t alarms)
|
||||
inline bool ds3231_enableAlarmInts(i2c_dev_t *dev, uint8_t alarms)
|
||||
{
|
||||
return ds3231_setFlag(DS3231_ADDR_CONTROL, DS3231_CTRL_ALARM_INTS | alarms, DS3231_SET);
|
||||
return ds3231_setFlag(dev, DS3231_ADDR_CONTROL, DS3231_CTRL_ALARM_INTS | alarms, DS3231_SET);
|
||||
}
|
||||
|
||||
inline bool ds3231_disableAlarmInts(uint8_t alarms)
|
||||
inline bool ds3231_disableAlarmInts(i2c_dev_t *dev, uint8_t alarms)
|
||||
{
|
||||
/* Just disable specific alarm(s) requested
|
||||
* does not disable alarm interrupts generally (which would enable the squarewave)
|
||||
*/
|
||||
return ds3231_setFlag(DS3231_ADDR_CONTROL, alarms, DS3231_CLEAR);
|
||||
return ds3231_setFlag(dev, DS3231_ADDR_CONTROL, alarms, DS3231_CLEAR);
|
||||
}
|
||||
|
||||
inline bool ds3231_enable32khz()
|
||||
inline bool ds3231_enable32khz(i2c_dev_t *dev)
|
||||
{
|
||||
return ds3231_setFlag(DS3231_ADDR_STATUS, DS3231_STAT_32KHZ, DS3231_SET);
|
||||
return ds3231_setFlag(dev, DS3231_ADDR_STATUS, DS3231_STAT_32KHZ, DS3231_SET);
|
||||
}
|
||||
|
||||
inline bool ds3231_disable32khz()
|
||||
inline bool ds3231_disable32khz(i2c_dev_t *dev)
|
||||
{
|
||||
return ds3231_setFlag(DS3231_ADDR_STATUS, DS3231_STAT_32KHZ, DS3231_CLEAR);
|
||||
return ds3231_setFlag(dev, DS3231_ADDR_STATUS, DS3231_STAT_32KHZ, DS3231_CLEAR);
|
||||
}
|
||||
|
||||
inline bool ds3231_enableSquarewave()
|
||||
inline bool ds3231_enableSquarewave(i2c_dev_t *dev)
|
||||
{
|
||||
return ds3231_setFlag(DS3231_ADDR_CONTROL, DS3231_CTRL_ALARM_INTS, DS3231_CLEAR);
|
||||
return ds3231_setFlag(dev, DS3231_ADDR_CONTROL, DS3231_CTRL_ALARM_INTS, DS3231_CLEAR);
|
||||
}
|
||||
|
||||
inline bool ds3231_disableSquarewave()
|
||||
inline bool ds3231_disableSquarewave(i2c_dev_t *dev)
|
||||
{
|
||||
return ds3231_setFlag(DS3231_ADDR_CONTROL, DS3231_CTRL_ALARM_INTS, DS3231_SET);
|
||||
return ds3231_setFlag(dev, DS3231_ADDR_CONTROL, DS3231_CTRL_ALARM_INTS, DS3231_SET);
|
||||
}
|
||||
|
||||
bool ds3231_setSquarewaveFreq(uint8_t freq)
|
||||
bool ds3231_setSquarewaveFreq(i2c_dev_t *dev, uint8_t freq)
|
||||
{
|
||||
uint8_t flag = 0;
|
||||
|
||||
if (ds3231_getFlag(DS3231_ADDR_CONTROL, 0xff, &flag))
|
||||
if (ds3231_getFlag(dev, DS3231_ADDR_CONTROL, 0xff, &flag))
|
||||
{
|
||||
/* clear current rate */
|
||||
flag &= ~DS3231_CTRL_SQWAVE_8192HZ;
|
||||
/* set new rate */
|
||||
flag |= freq;
|
||||
|
||||
return ds3231_setFlag(DS3231_ADDR_CONTROL, flag, DS3231_REPLACE);
|
||||
return ds3231_setFlag(dev, DS3231_ADDR_CONTROL, flag, DS3231_REPLACE);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ds3231_getRawTemp(int16_t *temp)
|
||||
bool ds3231_getRawTemp(i2c_dev_t *dev, int16_t *temp)
|
||||
{
|
||||
uint8_t data[2];
|
||||
|
||||
data[0] = DS3231_ADDR_TEMP;
|
||||
if (!ds3231_recv(DS3231_ADDR_TEMP,data, 2))
|
||||
if (!ds3231_recv(dev, DS3231_ADDR_TEMP,data, 2))
|
||||
{
|
||||
*temp = (int16_t)(int8_t)data[0] << 2 | data[1] >> 6;
|
||||
return true;
|
||||
|
@ -225,11 +224,11 @@ bool ds3231_getRawTemp(int16_t *temp)
|
|||
return false;
|
||||
}
|
||||
|
||||
bool ds3231_getTempInteger(int8_t *temp)
|
||||
bool ds3231_getTempInteger(i2c_dev_t *dev, int8_t *temp)
|
||||
{
|
||||
int16_t tInt;
|
||||
|
||||
if (ds3231_getRawTemp(&tInt)) {
|
||||
if (ds3231_getRawTemp(dev, &tInt)) {
|
||||
*temp = tInt >> 2;
|
||||
return true;
|
||||
}
|
||||
|
@ -237,11 +236,11 @@ bool ds3231_getTempInteger(int8_t *temp)
|
|||
return false;
|
||||
}
|
||||
|
||||
bool ds3231_getTempFloat(float *temp)
|
||||
bool ds3231_getTempFloat(i2c_dev_t *dev, float *temp)
|
||||
{
|
||||
int16_t tInt;
|
||||
|
||||
if (ds3231_getRawTemp(&tInt)) {
|
||||
if (ds3231_getRawTemp(dev, &tInt)) {
|
||||
*temp = tInt * 0.25;
|
||||
return true;
|
||||
}
|
||||
|
@ -249,12 +248,12 @@ bool ds3231_getTempFloat(float *temp)
|
|||
return false;
|
||||
}
|
||||
|
||||
bool ds3231_getTime(struct tm *time)
|
||||
bool ds3231_getTime(i2c_dev_t *dev, struct tm *time)
|
||||
{
|
||||
uint8_t data[7];
|
||||
|
||||
/* read time */
|
||||
if (ds3231_recv(DS3231_ADDR_TIME, data, 7))
|
||||
if (ds3231_recv(dev, DS3231_ADDR_TIME, data, 7))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -281,10 +280,5 @@ bool ds3231_getTime(struct tm *time)
|
|||
//applyTZ(time);
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
void ds3231_Init(uint8_t scl, uint8_t sda)
|
||||
{
|
||||
i2c_init(scl, sda);
|
||||
}
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <time.h>
|
||||
#include "i2c/i2c.h"
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@ -87,7 +89,7 @@ enum {
|
|||
* I suggest using GMT and applying timezone and DST when read back
|
||||
* returns true to indicate success
|
||||
*/
|
||||
int ds3231_setTime(struct tm *time);
|
||||
int ds3231_setTime(i2c_dev_t *dev, struct tm *time);
|
||||
|
||||
/* Set alarms
|
||||
* alarm1 works with seconds, minutes, hours and day of week/month, or fires every second
|
||||
|
@ -100,30 +102,30 @@ int ds3231_setTime(struct tm *time);
|
|||
* if you want to enable interrupts for the alarms you need to do that separately
|
||||
* returns true to indicate success
|
||||
*/
|
||||
int ds3231_setAlarm(uint8_t alarms, struct tm *time1, uint8_t option1, struct tm *time2, uint8_t option2);
|
||||
int ds3231_setAlarm(i2c_dev_t *dev, uint8_t alarms, struct tm *time1, uint8_t option1, struct tm *time2, uint8_t option2);
|
||||
|
||||
/* Check if oscillator has previously stopped, e.g. no power/battery or disabled
|
||||
* sets flag to true if there has been a stop
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_getOscillatorStopFlag(bool *flag);
|
||||
bool ds3231_getOscillatorStopFlag(i2c_dev_t *dev, bool *flag);
|
||||
|
||||
/* Clear the oscillator stopped flag
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_clearOscillatorStopFlag();
|
||||
bool ds3231_clearOscillatorStopFlag(i2c_dev_t *dev);
|
||||
|
||||
/* Check which alarm(s) have past
|
||||
* sets alarms to DS3231_ALARM_NONE/DS3231_ALARM_1/DS3231_ALARM_2/DS3231_ALARM_BOTH
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_getAlarmFlags(uint8_t *alarms);
|
||||
bool ds3231_getAlarmFlags(i2c_dev_t *dev, uint8_t *alarms);
|
||||
|
||||
/* Clear alarm past flag(s)
|
||||
* pass DS3231_ALARM_1/DS3231_ALARM_2/DS3231_ALARM_BOTH
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_clearAlarmFlags(uint8_t alarm);
|
||||
bool ds3231_clearAlarmFlags(i2c_dev_t *dev, uint8_t alarm);
|
||||
|
||||
/* enable alarm interrupts (and disables squarewave)
|
||||
* pass DS3231_ALARM_1/DS3231_ALARM_2/DS3231_ALARM_BOTH
|
||||
|
@ -132,61 +134,60 @@ bool ds3231_clearAlarmFlags(uint8_t alarm);
|
|||
* interrupt enabled, else it will trigger immediately
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_enableAlarmInts(uint8_t alarms);
|
||||
bool ds3231_enableAlarmInts(i2c_dev_t *dev, uint8_t alarms);
|
||||
|
||||
/* Disable alarm interrupts (does not (re-)enable squarewave)
|
||||
* pass DS3231_ALARM_1/DS3231_ALARM_2/DS3231_ALARM_BOTH
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_disableAlarmInts(uint8_t alarms);
|
||||
bool ds3231_disableAlarmInts(i2c_dev_t *dev, uint8_t alarms);
|
||||
|
||||
/* Enable the output of 32khz signal
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_enable32khz();
|
||||
bool ds3231_enable32khz(i2c_dev_t *dev);
|
||||
|
||||
/* Disable the output of 32khz signal
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_disable32khz();
|
||||
bool ds3231_disable32khz(i2c_dev_t *dev);
|
||||
|
||||
/* Enable the squarewave output (disables alarm interrupt functionality)
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_enableSquarewave();
|
||||
bool ds3231_enableSquarewave(i2c_dev_t *dev);
|
||||
|
||||
/* Disable the squarewave output (which re-enables alarm interrupts, but individual
|
||||
* alarm interrupts also need to be enabled, if not already, before they will trigger)
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_disableSquarewave();
|
||||
bool ds3231_disableSquarewave(i2c_dev_t *dev);
|
||||
|
||||
/* Set the frequency of the squarewave output (but does not enable it)
|
||||
* pass DS3231_SQUAREWAVE_RATE_1HZ/DS3231_SQUAREWAVE_RATE_1024HZ/DS3231_SQUAREWAVE_RATE_4096HZ/DS3231_SQUAREWAVE_RATE_8192HZ
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_setSquarewaveFreq(uint8_t freq);
|
||||
bool ds3231_setSquarewaveFreq(i2c_dev_t *dev, uint8_t freq);
|
||||
|
||||
/* Get the raw value
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_getRawTemp(int16_t *temp);
|
||||
bool ds3231_getRawTemp(i2c_dev_t *dev, int16_t *temp);
|
||||
|
||||
/* Get the temperature as an integer
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_getTempInteger(int8_t *temp);
|
||||
bool ds3231_getTempInteger(i2c_dev_t *dev, int8_t *temp);
|
||||
|
||||
/* Get the temerapture as a float (in quarter degree increments)
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_getTempFloat(float *temp);
|
||||
bool ds3231_getTempFloat(i2c_dev_t *dev, float *temp);
|
||||
|
||||
/* Get the time from the rtc, populates a supplied tm struct
|
||||
* returns true to indicate success
|
||||
*/
|
||||
bool ds3231_getTime(struct tm *time);
|
||||
void ds3231_Init(uint8_t scl, uint8_t sda);
|
||||
bool ds3231_getTime(i2c_dev_t *dev, struct tm *time);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue