stm32 基于HAL工程硬件I2C读取PCF8563
参考链接:https://download.csdn.net/download/xqw19891201/11267260
PCF8563 的读写地址可以从手册上获取
#include "stm32xxxx.h"
#include "stm32xxxx_hal.h"
#define PCF8563_ADDRESS 0xA2 // PCF8563的I2C地址
I2C_HandleTypeDef hi2c; // I2C句柄
// 从PCF8563读取一个字节
uint8_t PCF8563_ReadByte(uint8_t reg)
{
  uint8_t data;
  HAL_I2C_Mem_Read(&hi2c, PCF8563_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY);
  return data;
}
// 从PCF8563读取时间和日期
void PCF8563_ReadDateTime(uint8_t *buffer)
{
  HAL_I2C_Mem_Read(&hi2c, PCF8563_ADDRESS, 2, I2C_MEMADD_SIZE_8BIT, buffer, 7, HAL_MAX_DELAY);
}
int main(void)
{
  // 初始化硬件I2C外设
  HAL_Init();
  // 初始化时钟和GPIO引脚
  // ...
  // 配置I2C参数
  hi2c.Instance = I2C1;
  hi2c.Init.ClockSpeed = 400000;
  hi2c.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c.Init.OwnAddress1 = 0;
  hi2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c.Init.OwnAddress2 = 0;
  hi2c.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  // 初始化I2C外设
  HAL_I2C_Init(&hi2c);
uint8_t dateTimeBuffer[7];
  // 读取PCF8563的时间和日期
  PCF8563_ReadDateTime(dateTimeBuffer);
  // 处理读取的时间和日期数据
  // ...
  while (1)
  {
    // 主循环
    // ...
  }
}
// 读取PCF8563的时间
void PCF8563_ReadDateTime(uint8_t *buffer)
{
  HAL_I2C_Mem_Read(&hi2c, PCF8563_ADDRESS, 2, I2C_MEMADD_SIZE_8BIT, buffer, 7, HAL_MAX_DELAY);
}
int main(void)
{
  // ...
  
  uint8_t dateTimeBuffer[7];
  // 读取PCF8563的时间和日期
  PCF8563_ReadDateTime(dateTimeBuffer);
  // 处理读取的时间和日期数据
  // ...
  while (1)
  {
    // 主循环
    // ...
  }
}
// BCD转换为Buffer
void BCDtoBuffer(uint8_t *bcd, uint8_t *buffer, uint8_t size)
{
  for (uint8_t i = 0; i < size; i++)
  {
    buffer[i] = ((bcd[i] >> 4) & 0x0F) * 10 + (bcd[i] & 0x0F);
  }
}
// Buffer转换为BCD
void BuffertoBCD(uint8_t *buffer, uint8_t *bcd, uint8_t size)
{
  for (uint8_t i = 0; i < size; i++)
  {
    bcd[i] = ((buffer[i] / 10) << 4) | (buffer[i] % 10);
  }
}
// 设置PCF8563的时间
void PCF8563_SetDateTime(uint8_t *buffer)
{
  uint8_t bcd[7];
  BuffertoBCD(buffer, bcd, 7); // 将Buffer转换为BCD
  bcd[0] &= 0x7F; // 清除时钟暂停位
  HAL_I2C_Mem_Write(&hi2c, PCF8563_ADDRESS, 2, I2C_MEMADD_SIZE_8BIT, bcd, 7, HAL_MAX_DELAY);
}
// 读取PCF8563的时间
void PCF8563_ReadDateTime(uint8_t *buffer)
{
  uint8_t bcd[7];
  HAL_I2C_Mem_Read(&hi2c, PCF8563_ADDRESS, 2, I2C_MEMADD_SIZE_8BIT, bcd, 7, HAL_MAX_DELAY);
  BCDtoBuffer(bcd, buffer, 7); // 将BCD转换为Buffer
}
int main(void)
{
  // ...
uint8_t dateTimeBuffer[7];
  // 设置PCF8563的时间为2023年6月1日 12:34:56
  dateTimeBuffer[0] = 56;   // 秒(BCD格式)
  dateTimeBuffer[1] = 34;   // 分钟(BCD格式)
  dateTimeBuffer[2] = 12;   // 小时(BCD格式)
  dateTimeBuffer[3] = 1;    // 日(BCD格式)
  dateTimeBuffer[4] = 6;    // 月(BCD格式)
  dateTimeBuffer[5] = 23;   // 年(BCD格式)
  dateTimeBuffer[6] = 0;    // 星期几(BCD格式)
  // 设置PCF8563的时间
  PCF8563_SetDateTime(dateTimeBuffer);
  // 读取PCF8563的时间和日期
  PCF8563_ReadDateTime(dateTimeBuffer);
// 处理读取的
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号