//////////////////////////////////////////////////////////////////////////////// /// @brief Checks whether the specified I2C flag is set or not. /// @param i2c: select the I2C peripheral. /// @param flag: specifies the flag to check. /// This parameter can be one of the following values: /// @arg I2C_FLAG_RX_UNDER : Rx Buffer is empty flag /// @arg I2C_FLAG_RX_OVER : RX Buffer Overrun flag /// @arg I2C_FLAG_RX_FULL : Rx buffer full flag /// @arg I2C_FLAG_TX_OVER : TX Buffer Overrun flag /// @arg I2C_FLAG_TX_EMPTY : TX_FIFO empty flag /// @arg I2C_FLAG_RD_REQ : I2C work as slave or master flag /// @arg I2C_FLAG_TX_ABRT : TX error flag(Master mode) /// @arg I2C_FLAG_RX_DONE : Master not ack flag(slave mode) /// @arg I2C_FLAG_ACTIVITY : I2C activity flag /// @arg I2C_FLAG_STOP_DET : stop condition flag /// @arg I2C_FLAG_START_DET: start condition flag /// @arg I2C_FLAG_GEN_CALL : a general call address and ack flag /// @retval The new state of I2C_FLAG (SET or RESET). //////////////////////////////////////////////////////////////////////////////// FlagStatus I2C_GetFlagStatus(I2C_TypeDef* i2c, u32 flag) { if (flag & 0x8000) return ((i2c->IC_STATUS & flag) ? SET : RESET); if ((flag == I2C_FLAG_RX_FULL) && (I2C_CMD_DIR == 0)) { i2c->IC_DATA_CMD = I2C_DR_CMD; I2C_CMD_DIR = 1; } return (((i2c->IC_RAW_INTR_STAT & flag)) ? SET : RESET); }
时间: 2023-07-26 15:04:29 浏览: 269
这段代码是一个用于检查指定I2C标志位是否被设置的函数。以下是对该函数的解释:
- `i2c`:选择要检查的I2C外设。
- `flag`:指定要检查的标志位。可以是以下值之一:
- `I2C_FLAG_RX_UNDER`:接收缓冲区为空标志。
- `I2C_FLAG_RX_OVER`:接收缓冲区溢出标志。
- `I2C_FLAG_RX_FULL`:接收缓冲区满标志。
- `I2C_FLAG_TX_OVER`:发送缓冲区溢出标志。
- `I2C_FLAG_TX_EMPTY`:发送FIFO为空标志。
- `I2C_FLAG_RD_REQ`:I2C作为主模式或从模式工作的标志。
- `I2C_FLAG_TX_ABRT`:发送错误标志(主模式)。
- `I2C_FLAG_RX_DONE`:主机未应答标志(从模式)。
- `I2C_FLAG_ACTIVITY`:I2C活动标志。
- `I2C_FLAG_STOP_DET`:停止条件标志。
- `I2C_FLAG_START_DET`:启动条件标志。
- `I2C_FLAG_GEN_CALL`:通用调用地址和应答标志。
该函数返回指定标志位的状态,即SET(已设置)或RESET(未设置)。在函数内部,它首先检查标志位是否属于高位(0x8000及以上),如果是,则直接读取`IC_STATUS`寄存器并返回结果。否则,它将检查是否需要将数据写入`IC_DATA_CMD`寄存器,然后再返回`IC_RAW_INTR_STAT`寄存器中指定标志位的状态。
注意:上述代码片段中的一些变量和宏定义(如`I2C_CMD_DIR`和`I2C_DR_CMD`)没有提供完整的定义,因此无法对其进行详细解释。需要查看完整的代码或上下文才能理解它们的含义和作用。
阅读全文