ds3231.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "main.h"
  2. extern int8_t user_i2c_read(uint8_t id, uint8_t reg_addr, uint8_t *data, uint16_t len);
  3. extern int8_t user_i2c_write(uint8_t id, uint8_t reg_addr, uint8_t *data, uint16_t len);
  4. /**
  5. * @brief Инициализация RTC
  6. */
  7. void RTC_Init(void) {
  8. uint8_t buf[3] = {0};
  9. /* Clear flags */
  10. Flag.I2C_TX_End = 0;
  11. buf[0] = DS3231_1HZ; // set 1 Hz output squware
  12. buf[1] = 0x0; // disable 32 kHz output
  13. user_i2c_write(DS3231_I2C_ADDR, DS3231_ADDR_CONTROL, buf, 2);
  14. }
  15. /**
  16. * @brief Чтение всех регистров DS3231
  17. */
  18. void RTC_ReadAll(rtc_t * data) {
  19. Flag.I2C_RX_End = 0;
  20. Flag.I2C_TX_End = 0;
  21. user_i2c_read(DS3231_I2C_ADDR, DS3231_ADDR_TIME, (uint8_t *)data, DS3231_SIZE_ALL);
  22. }
  23. /**
  24. * @brief Запись времени и календаря "SS:MM:HH wd dd/mm/yy"
  25. */
  26. void RTC_WriteTimeCalendar(rtc_t * data) {
  27. Flag.I2C_TX_End = 0;
  28. user_i2c_write(DS3231_I2C_ADDR, DS3231_ADDR_TIME, &(data->Sec), (DS3231_SIZE_TIME + DS3231_SIZE_CALENDAR));
  29. }
  30. /**
  31. * @brief Запись времени "SS:MM:HH"
  32. */
  33. void RTC_WriteTime(rtc_t * data) {
  34. Flag.I2C_TX_End = 0;
  35. user_i2c_write(DS3231_I2C_ADDR, DS3231_ADDR_TIME, &(data->Sec), DS3231_SIZE_TIME);
  36. }
  37. /**
  38. * @brief Запись часов "HH"
  39. */
  40. void RTC_WriteHH(rtc_t * data) {
  41. Flag.I2C_TX_End = 0;
  42. user_i2c_write(DS3231_I2C_ADDR, (DS3231_ADDR_TIME + 2), &(data->Hr), 1);
  43. }
  44. /**
  45. * @brief Запись часов и минут "MM:HH"
  46. */
  47. void RTC_WriteHHMM(rtc_t * data) {
  48. Flag.I2C_TX_End = 0;
  49. user_i2c_write(DS3231_I2C_ADDR, (DS3231_ADDR_TIME + 1), &(data->Min), 2);
  50. }
  51. /**
  52. * @brief Запись календаря "wd dd/mm/yy"
  53. */
  54. void RTC_WriteCalendar(rtc_t * data) {
  55. Flag.I2C_TX_End = 0;
  56. user_i2c_write(DS3231_I2C_ADDR, DS3231_ADDR_CALENDAR, &(data->WD), DS3231_SIZE_CALENDAR);
  57. }
  58. /**
  59. * @brief Convert BCD value to Binary
  60. */
  61. uint8_t bcd2bin(uint8_t bcd)
  62. {
  63. return (10 * (bcd >> 4) + (bcd & 0x0f));
  64. }
  65. /**
  66. * @brief Convert Binary value to BCD
  67. */
  68. uint8_t bin2bcd(uint8_t bin)
  69. {
  70. return (((bin / 10 ) << 4) | (bin % 10));
  71. }