我很难理解成功设置32位寄存器中的一位的逻辑。以下是该函数的伪代码:
读取主寄存器,
如果第29位 CREG_CLK_CTRL_I2C0
未设置,则设置它
uint32_t creg;
//read the CREG Master register
creg = READ_ARC_REG((volatile uint32_t)AR_IO_CREG_MST0_CTRL);
if((creg & (1 << CREG_CLK_CTRL_I2C0)) == 0){
creg |= ( 1 << CREG_CLK_CTRL_I2C0);
WRITE_ARC_REG(creg, (volatile uint32_t)(AR_IO_CREG_MST0_CTRL));
}
如果CREG主寄存器最初为空,则逻辑不按预期工作。但是,如果我用所有零和第31位上的1(1000 ... 0)填充它,那么逻辑会起作用。 我不确定我的测试条件是否不正确,或者可能是其他原因。
有人能帮忙吗?
creg
的类型是什么? - dbushCREG_CLK_CTRL_I2C0
是 29,代表第 29 位。你确定这是正确的吗?CREG_CLK_CTRL_I2C0
的二进制表示中,第 29 位不是 0b00100000000000000000000000000000 吗? - acwaters