xxyxd 发表于 2023-11-15 12:49:03

求教DS3231M+ I2C读取值不正确的问题

最近一个项目RTC时钟用的DS3231M+这一款,但是在写驱动的时候遇到一点问题,导致读取的值完全不可用,硬件是h743,用的硬件I2C,上拉电阻已经配置了,读取部分的代码如下


#define I2C_PORT hi2c1
#define DS3231_ADDRESS 0xD0
#define Control_RES    0xE0
#define Second_RES   0x00

uint8_t DS3231ReadByte(uint8_t resaddr)
{
    uint8_t data;
    HAL_I2C_Mem_Read(&I2C_PORT, DS3231_ADDRESS, resaddr, I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY);
    return data;
}

void DS3231Write(uint8_t resaddr, uint8_t data)
{
    HAL_I2C_Mem_Write(&I2C_PORT, DS3231_ADDRESS, resaddr, I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY);
}

uint8_t BCD2HEX(uint8_t value)
{
    return ((value >> 4) * 10) + (value & 0x0f);
}

uint8_t HEX2BCD(uint8_t value)
{
    return (((value % 100) / 10) << 4) | (value % 10);
}


DS3231_Init(void)
{
    uint8_t init_value = 0x00;
    DS3231Write(Control_RES, init_value);
}

uint8_t DS3231_GetSecond(void)
{
    return(BCD2HEX(DS3231ReadByte(Second_RES)));
}

这里是用秒的获取来当案例,但是当我把DS3231_GetSecond获取到的值打印出来的时候,不是0就是1,完全没有按照时间规律递增。
不知道我是哪里写错了,望大大指点

eric2013 发表于 2023-11-15 15:01:06

这一对函数AL_I2C_Mem_Write适合EEPROM,操作DS3231换另外那对函数试试。

xxyxd 发表于 2023-11-16 13:09:19

eric2013 发表于 2023-11-15 15:01
这一对函数AL_I2C_Mem_Write适合EEPROM,操作DS3231换另外那对函数试试。

感谢回复!!!

我后来也使用另外两个收发函数进行了测试
uint8_t val;
                HAL_I2C_Master_Transmit(&hi2c1, 0xD0, 0x00, 1, 500);
                HAL_I2C_Master_Receive(&hi2c1, 0xD0, &val, 1, 500);
                val = BCD2HEX(val);
                printf("秒值为:%d\n", val);



xxyxd 发表于 2023-11-16 13:12:03

然后,每两秒读一次秒,读到的值都是零,I2C通信应该是正常了的,因为我一开始设置的秒的值为3,判断HAL_I2C_Master_Transmit和HAL_I2C_Master_Receive的状态也都是返回的HAL_OK

xxyxd 发表于 2023-11-17 11:30:34

目前来讲问题解决了,我在I2C上挂了好几个设备:SSD1309 DS3231M+ EEROM BMP28 AHT20, 只要把EEROM从总线上移开,单独使用一路I2C就可以了,虽然不知道为什么,但是问题解决了。

eric2013 发表于 2023-11-18 08:17:55

xxyxd 发表于 2023-11-17 11:30
目前来讲问题解决了,我在I2C上挂了好几个设备:SSD1309 DS3231M+ EEROM BMP28 AHT20, 只要把EEROM从总线 ...

难道正好有数据,被EEPROM识别为地址了。

也许还真有这种可能。

xxyxd 发表于 2023-11-21 09:07:18

eric2013 发表于 2023-11-18 08:17
难道正好有数据,被EEPROM识别为地址了。

也许还真有这种可能。

您这样一说,我也突然反应过来了,还真有这种可能。
还是自己太菜了这种问题都卡了两天,不过谢谢回复。
页: [1]
查看完整版本: 求教DS3231M+ I2C读取值不正确的问题