c-PCF85063A启用第二个报警寄存器



我正在为Nuvoton M031SD2AE MCU开发RTC库。我使用PCF85063A。我想启用第二个警报。在数据表中,它的地址是0x0B。

这是第二个报警寄存器。

RTC第二报警寄存器

void set_second_alarm(void)
{
uint8_t secondAlarmValue;
I2C_ReadMultiBytesOneReg(I2C0,I2CADDR,SECONDALARM,secondAlarmValue,1);
secondAlarmValue = (secondAlarmValue) & 0x7F;
I2C_WriteMultiBytesOneReg(I2C0,I2CADDR,SECONDALARM,secondAlarmValue,1);
}

我试着做这样的事。因为数据表上说寄存器的默认值是1000 0000。然而,我认为当其他位被操作时,这可能会在未来的使用中造成错误。我也收到错误,因为I2C_ReadMultiBytesOneReg函数将uint8_t rdata[]作为参数。

这些是我使用的I2C函数:

uint8_t I2C_WriteByteOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t data);
uint32_t I2C_ReadMultiBytesOneReg(I2C_T *i2c, uint8_t u8SlaveAddr, uint8_t u8DataAddr, uint8_t rdata[], uint32_t u32rLen);

基本上,我想写0到第二个报警寄存器的第7位,以启用报警。然而,我不知道该怎么做

如何将0写入第二个报警寄存器的第7位?

您尚未显示错误消息和受影响的行。很可能它说的是类似";您提供了一个整数,但需要一个指向整数的指针"BTW,用作参数,数组衰减为指向其第一个元素的指针。

您提供的是,而不是用于存储值和从中读取的变量的预期地址。在C中,您可以通过运算符&获得变量的地址。

实际上,多字节函数期望指向与参数u32rLen所说的一样多的uint8_t的指针。

所以这是修正后的版本:

void set_second_alarm(void)
{
uint8_t secondAlarmValue;
I2C_ReadMultiBytesOneReg(I2C0, I2CADDR, SECONDALARM, &secondAlarmValue, 1);
secondAlarmValue &= 0x7F;
I2C_WriteMultiBytesOneReg(I2C0, I2CADDR, SECONDALARM, &secondAlarmValue, 1);
}

如果你仔细观察,我已经简化了第7位的清除。通过这种方式,可以使用对单个变量进行操作的二进制运算符来简化许多表达式。重读初学者C书的相关章节。

您没有解释为什么要使用多字节函数。请考虑使用单字节函数:

void set_second_alarm(void)
{
uint8_t secondAlarmValue;
secondAlarmValue = I2C_ReadByteOneReg(I2C0, I2CADDR, SECONDALARM);
secondAlarmValue &= 0x7F;
I2C_WriteByteOneReg(I2C0, I2CADDR, SECONDALARM, secondAlarmValue);
}

最后一点:请阅读所有函数的文档,添加合理的错误处理。

最新更新