求教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,完全没有按照时间规律递增。
不知道我是哪里写错了,望大大指点
这一对函数AL_I2C_Mem_Write适合EEPROM,操作DS3231换另外那对函数试试。 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);
然后,每两秒读一次秒,读到的值都是零,I2C通信应该是正常了的,因为我一开始设置的秒的值为3,判断HAL_I2C_Master_Transmit和HAL_I2C_Master_Receive的状态也都是返回的HAL_OK 目前来讲问题解决了,我在I2C上挂了好几个设备:SSD1309 DS3231M+ EEROM BMP28 AHT20, 只要把EEROM从总线上移开,单独使用一路I2C就可以了,虽然不知道为什么,但是问题解决了。 xxyxd 发表于 2023-11-17 11:30
目前来讲问题解决了,我在I2C上挂了好几个设备:SSD1309 DS3231M+ EEROM BMP28 AHT20, 只要把EEROM从总线 ...
难道正好有数据,被EEPROM识别为地址了。
也许还真有这种可能。 eric2013 发表于 2023-11-18 08:17
难道正好有数据,被EEPROM识别为地址了。
也许还真有这种可能。
您这样一说,我也突然反应过来了,还真有这种可能。
还是自己太菜了这种问题都卡了两天,不过谢谢回复。
页:
[1]