mirror of
https://github.com/Lurkars/esp-ena.git
synced 2026-05-08 20:10:37 +02:00
small interface improvements, renaming of device specific modules, starting with TTGO T-Wristband support
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
idf_component_register(
|
||||
SRCS
|
||||
"bm8563.c"
|
||||
INCLUDE_DIRS "."
|
||||
PRIV_REQUIRES
|
||||
rtc
|
||||
i2c-main
|
||||
)
|
||||
@@ -0,0 +1,112 @@
|
||||
// Copyright 2020 Lukas Haubaum
|
||||
//
|
||||
// Licensed under the GNU Affero General Public License, Version 3;
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
|
||||
// https://www.gnu.org/licenses/agpl-3.0.html
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "driver/i2c.h"
|
||||
#include "esp_log.h"
|
||||
|
||||
#include "rtc.h"
|
||||
#include "i2c-main.h"
|
||||
|
||||
#include "bm8563.h"
|
||||
|
||||
uint8_t bm8563_dec2bcd(uint8_t value)
|
||||
{
|
||||
return (((value / 10) << 4) | (value % 10));
|
||||
}
|
||||
|
||||
uint8_t bm8563_bcd2dec(uint8_t value)
|
||||
{
|
||||
return (((value >> 4) * 10) + (value & 0x0f));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Read time
|
||||
*/
|
||||
void rtc_get_time(struct tm *time)
|
||||
{
|
||||
if (!i2c_is_initialized())
|
||||
{
|
||||
i2c_main_init();
|
||||
}
|
||||
uint8_t data[7];
|
||||
|
||||
i2c_cmd_handle_t cmd;
|
||||
cmd = i2c_cmd_link_create();
|
||||
i2c_master_start(cmd);
|
||||
i2c_master_write_byte(cmd, (BM8563_ADDRESS << 1) | I2C_MASTER_WRITE, true);
|
||||
i2c_master_write_byte(cmd, BM8563_SECONDS, true);
|
||||
i2c_master_start(cmd);
|
||||
i2c_master_write_byte(cmd, (BM8563_ADDRESS << 1) | I2C_MASTER_READ, true);
|
||||
i2c_master_read(cmd, data, 7, I2C_MASTER_LAST_NACK);
|
||||
i2c_master_stop(cmd);
|
||||
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_cmd_begin(I2C_NUM_0, cmd, 10 / portTICK_PERIOD_MS));
|
||||
i2c_cmd_link_delete(cmd);
|
||||
|
||||
time->tm_sec = bm8563_bcd2dec(data[0] & 0b01111111);
|
||||
time->tm_min = bm8563_bcd2dec(data[1] & 0b01111111);
|
||||
time->tm_hour = bm8563_bcd2dec(data[2] & 0b00111111);
|
||||
time->tm_mday = bm8563_bcd2dec(data[3] & 0b00111111);
|
||||
time->tm_wday = bm8563_bcd2dec(data[4] & 0b00000111);
|
||||
time->tm_mon = bm8563_bcd2dec(data[5] & 0b00011111) - 1;
|
||||
if (data[5] & BM8563_CENTURY_BIT)
|
||||
{
|
||||
time->tm_year = bm8563_bcd2dec(data[6] & 0b11111111) + 100;
|
||||
}
|
||||
else
|
||||
{
|
||||
time->tm_year = bm8563_bcd2dec(data[6] & 0b01111111);
|
||||
}
|
||||
time->tm_isdst = 0;
|
||||
|
||||
mktime(time);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Write time
|
||||
*/
|
||||
void rtc_set_time(struct tm *time)
|
||||
{
|
||||
if (!i2c_is_initialized())
|
||||
{
|
||||
i2c_main_init();
|
||||
}
|
||||
|
||||
uint8_t data[7] = {0};
|
||||
data[0] = bm8563_dec2bcd(time->tm_sec) & 0b01111111;
|
||||
data[1] = bm8563_dec2bcd(time->tm_min) & 0b01111111;
|
||||
data[2] = bm8563_dec2bcd(time->tm_hour) & 0b00111111;
|
||||
data[3] = bm8563_dec2bcd(time->tm_mday) & 0b00111111;
|
||||
data[4] = bm8563_dec2bcd(time->tm_wday) & 0b00000111;
|
||||
data[5] = bm8563_dec2bcd(time->tm_mon + 1) & 0b00011111;
|
||||
if (time->tm_year > 100)
|
||||
{
|
||||
data[5] |= BM8563_CENTURY_BIT;
|
||||
}
|
||||
|
||||
data[6] = bm8563_dec2bcd(time->tm_year % 100) & 0b11111111;
|
||||
|
||||
i2c_cmd_handle_t cmd;
|
||||
cmd = i2c_cmd_link_create();
|
||||
i2c_master_start(cmd);
|
||||
i2c_master_write_byte(cmd, (BM8563_ADDRESS << 1) | I2C_MASTER_WRITE, true);
|
||||
|
||||
i2c_master_write_byte(cmd, BM8563_SECONDS, true);
|
||||
i2c_master_write(cmd, data, 7, true);
|
||||
|
||||
i2c_master_stop(cmd);
|
||||
ESP_ERROR_CHECK_WITHOUT_ABORT(i2c_master_cmd_begin(I2C_NUM_0, cmd, 10 / portTICK_PERIOD_MS));
|
||||
i2c_cmd_link_delete(cmd);
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
// Copyright 2020 Lukas Haubaum
|
||||
//
|
||||
// Licensed under the GNU Affero General Public License, Version 3;
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
|
||||
// https://www.gnu.org/licenses/agpl-3.0.html
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* @brief I2C driver for BM8563 RTC
|
||||
*
|
||||
*/
|
||||
#ifndef _RTC_BM8562_H_
|
||||
#define _RTC_BM8562_H_
|
||||
|
||||
#include "stdio.h"
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#define BM8563_ADDRESS 0x51
|
||||
#define BM8563_CONTROL_STATUS1 0x00
|
||||
#define BM8563_TESTC 0b00001000
|
||||
#define BM8563_STOP 0b00100000
|
||||
#define BM8563_TEST1 0b10000000
|
||||
#define BM8563_CONTROL_STATUS2 0x01
|
||||
#define BM8563_TIE 0b00000001
|
||||
#define BM8563_AIE 0b00000010
|
||||
#define BM8563_TF 0b00000100
|
||||
#define BM8563_AF 0b00001000
|
||||
#define BM8563_TI_TP 0b00010000
|
||||
#define BM8563_SECONDS 0x02
|
||||
#define BM8563_MINUTES 0x03
|
||||
#define BM8563_HOURS 0x04
|
||||
#define BM8563_DAY 0x05
|
||||
#define BM8563_WEEKDAY 0x06
|
||||
#define BM8563_MONTH 0x07
|
||||
#define BM8563_YEAR 0x08
|
||||
#define BM8563_TIME_SIZE 0x07
|
||||
#define BM8563_CENTURY_BIT 0b10000000
|
||||
|
||||
#define BM8563_MINUTE_ALARM 0x09
|
||||
#define BM8563_HOUR_ALARM 0x0a
|
||||
#define BM8563_DAY_ALARM 0x0b
|
||||
#define BM8563_WEEKDAY_ALARM 0x0c
|
||||
#define BM8563_ALARM_DISABLE 0b10000000
|
||||
#define BM8563_ALARM_NONE 0xff
|
||||
#define BM8563_ALARM_SIZE 0x04
|
||||
|
||||
#define BM8563_TIMER_CONTROL 0x0e
|
||||
#define BM8563_TIMER_ENABLE 0b10000000
|
||||
#define BM8563_TIMER_4_096KHZ 0b00000000
|
||||
#define BM8563_TIMER_64HZ 0b00000001
|
||||
#define BM8563_TIMER_1HZ 0b00000010
|
||||
#define BM8563_TIMER_1_60HZ 0b00000011
|
||||
#define BM8563_TIMER 0x0f
|
||||
|
||||
#define BM8563_ALARM_SET 0x0900
|
||||
#define BM8563_ALARM_READ 0x0901
|
||||
#define BM8563_CONTROL_STATUS1_READ 0x0000
|
||||
#define BM8563_CONTROL_STATUS1_WRITE 0x0001
|
||||
#define BM8563_CONTROL_STATUS2_READ 0x0100
|
||||
#define BM8563_CONTROL_STATUS2_WRITE 0x0101
|
||||
#define BM8563_TIMER_CONTROL_READ 0x0e00
|
||||
#define BM8563_TIMER_CONTROL_WRITE 0x0e01
|
||||
#define BM8563_TIMER_READ 0x0f00
|
||||
#define BM8563_TIMER_WRITE 0x0f01
|
||||
|
||||
/* Status codes. */
|
||||
#define BM8563_ERROR_NOTTY (-1)
|
||||
#define BM8563_OK (0x00)
|
||||
#define BM8563_ERR_LOW_VOLTAGE (0x80)
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user