硬汉嵌入式论坛

 找回密码
 立即注册
查看: 324|回复: 6
收起左侧

[技术讨论] 求教DS3231M+ I2C读取值不正确的问题

[复制链接]

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2023-11-15 12:49:03 | 显示全部楼层 |阅读模式
最近一个项目RTC时钟用的DS3231M+这一款,但是在写驱动的时候遇到一点问题,导致读取的值完全不可用,硬件是h743,用的硬件I2C,上拉电阻已经配置了,读取部分的代码如下


[C] 纯文本查看 复制代码
#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,完全没有按照时间规律递增。
不知道我是哪里写错了,望大大指点
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-11-15 15:01:06 | 显示全部楼层
这一对函数AL_I2C_Mem_Write适合EEPROM,操作DS3231换另外那对函数试试。
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2023-11-16 13:09:19 | 显示全部楼层
eric2013 发表于 2023-11-15 15:01
这一对函数AL_I2C_Mem_Write适合EEPROM,操作DS3231换另外那对函数试试。

感谢回复!!!

我后来也使用另外两个收发函数进行了测试
[C] 纯文本查看 复制代码
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);



回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2023-11-16 13:12:03 | 显示全部楼层
然后,每两秒读一次秒,读到的值都是零,I2C通信应该是正常了的,因为我一开始设置的秒的值为3,判断HAL_I2C_Master_Transmit和HAL_I2C_Master_Receive的状态也都是返回的HAL_OK
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2023-11-17 11:30:34 | 显示全部楼层
目前来讲问题解决了,我在I2C上挂了好几个设备:SSD1309 DS3231M+ EEROM BMP28 AHT20, 只要把EEROM从总线上移开,单独使用一路I2C就可以了,虽然不知道为什么,但是问题解决了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-11-18 08:17:55 | 显示全部楼层
xxyxd 发表于 2023-11-17 11:30
目前来讲问题解决了,我在I2C上挂了好几个设备:SSD1309 DS3231M+ EEROM BMP28 AHT20, 只要把EEROM从总线 ...

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

也许还真有这种可能。
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2023-11-21 09:07:18 | 显示全部楼层
eric2013 发表于 2023-11-18 08:17
难道正好有数据,被EEPROM识别为地址了。

也许还真有这种可能。

您这样一说,我也突然反应过来了,还真有这种可能。
还是自己太菜了这种问题都卡了两天,不过谢谢回复。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 03:02 , Processed in 0.169314 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表