我正在为Nuvoton M031SD2AE单片机开发一个RTC库。我用PCF85063A。我想启动第二警报器。在数据表中它的地址是0x0B。
这是第二个报警器。
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。但是,我认为当其他位元被操纵时,它可能会在将来的使用中造成错误。因为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位的第二次报警寄存器?
发布于 2022-09-27 19:55:32
您没有显示错误消息和受影响的行。它很可能是这样写的:“您提供了一个整数,但是需要一个指向整数的指针。”顺便说一下,作为参数,数组会衰减到指向其第一个元素的指针。
您提供的不是变量的预期地址来存储值,而是提供值。在C中,您可以通过运算符&获得变量的地址。
实际上,多字节函数期望指向与参数uint8_t相同的指针,u32rLen说。
这就是修正后的版本:
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);
}最后注意:请阅读所有函数的文档,以增加合理的错误处理。
https://stackoverflow.com/questions/73859613
复制相似问题