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);

// 处理读取的

posted @ 2023-06-24 21:19  cogitoergosum  阅读(1216)  评论(0编辑  收藏  举报