Интерфейс Ардуино PC8563

Я пытаюсь подключить pc8563 к Arduino Uno. У меня есть небольшое сомнение, связанное с чтением адреса подчиненного устройства RTC

В техническом описании RTC указана страница № 14. где адрес ведомого устройства — A2 для записи и чтения A3 я хотел бы знать, как A2 /A3

Пример кода из идентификатора устройства веб-сайта, упомянутого как 0X51

Мой вопрос, как настроить точный адрес подчиненного устройства??

#include "Wire.h"
#define PCF8563address 0x51

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
String days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };

byte bcdToDec(byte value)
{
  return ((value / 16) * 10 + value % 16);
}

byte decToBcd(byte value){
  return (value / 10 * 16 + value % 10);
}

void setPCF8563()
// это устанавливает время и дату на PCF8563
{
  Wire.beginTransmission(PCF8563address);
  Wire.write(0x02);
  Wire.write(decToBcd(second)); 
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));     
  Wire.write(decToBcd(dayOfMonth));
  Wire.write(decToBcd(dayOfWeek)); 
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.endTransmission();
}

void readPCF8563()
// это получает время и дату от PCF8563
{
  Wire.beginTransmission(PCF8563address);
  Wire.write(0x02);
  Wire.endTransmission();
  Wire.requestFrom(PCF8563address, 7);
  second     = bcdToDec(Wire.read() & B01111111); // удалить бит ошибки VL
  minute     = bcdToDec(Wire.read() & B01111111); // удаляем ненужные биты из MSB
  hour       = bcdToDec(Wire.read() & B00111111);
  dayOfMonth = bcdToDec(Wire.read() & B00111111);
  dayOfWeek  = bcdToDec(Wire.read() & B00000111); 
  month      = bcdToDec(Wire.read() & B00011111);  // удалить бит века, 1999 закончился
  year       = bcdToDec(Wire.read());
}

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  // измените следующее, чтобы установить начальное время
  second = 0;
  minute = 28;
  hour = 9;
  dayOfWeek = 2;
  dayOfMonth = 13;
  month = 8;
  year = 13;
  // закомментируйте следующую строку и загрузите снова, чтобы установить и предотвратить сброс времени при каждом сбросе
  setPCF8563();
}

void loop()
{
  readPCF8563();
  Serial.print(days[dayOfWeek]);
  Serial.print(" "); 
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/20");
  Serial.print(year, DEC);
  Serial.print(" - ");
  Serial.print(hour, DEC);
  Serial.print(":");
  if (minute < 10)
  {
    Serial.print("0");
  }
  Serial.print(minute, DEC);
  Serial.print(":"); 
  if (second < 10)
  {
    Serial.print("0");
  } 
  Serial.println(second, DEC); 
  delay(1000);
}

Технические данные RTC

, 👍1

Обсуждение

так какой из них работает? А2 или 51?, @jsotola

на самом деле это один и тот же адрес .... A2 - 8-битное число .... 51 - 7-битное число ... бит 0 используется для указания чтения или записи .... запишите A2 как двоичное число ... вы увидите, что 51 - это верхние 7 бит, @jsotola


1 ответ


2

Обычные адреса I2C имеют длину 7 бит. На первом кадре I2C транзакции мастер отправляет 8-битный байт, содержащий адрес ведомое устройство, за которым следует бит, указывающий, является ли это чтением или записью операция. Некоторые люди склонны называть «адресом» весь 8-битный кадр, что вызывает путаницу. Из-за этого у нас получается три вкуса. адресов I2C:

  • 7-битный адрес, который является реальным адресом устройства
  • 8-битный «адрес записи», то есть адрес, за которым следует 0 что означает «операция записи».
  • 8-битный «адрес чтения», который представляет собой адрес, за которым следует 1 что означает «операция чтения».

Для вашего RTC 3 адреса в шестнадцатеричном и двоичном формате следующие:

7-bit = 0x51 = 0b1010001
write = 0xA2 = 0b10100010
read  = 0xA3 = 0b10100011

Библиотека Arduino Wire ожидает 7-битный адрес.

,