/*! \brief wait for EEPROM standby state \param[in] none \param[out] none \retval none */ void eeprom_wait_standby_state(void) { __IO uint32_t val = 0; while(1){ /* wait until I2C bus is idle */ while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); /* send a start condition to I2C bus */ i2c_start_on_bus(I2C0); /* wait until SBSEND bit is set */ while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)); /* send slave address to I2C bus */ i2c_master_addressing(I2C0, eeprom_address, I2C_TRANSMITTER); /* keep looping till the Address is acknowledged or the AE flag is set (address not acknowledged at time) */ do{ /* get the current value of the I2C_STAT0 register */ val = I2C_STAT0(I2C0); }while(0 == (val & (I2C_STAT0_ADDSEND | I2C_STAT0_AERR))); /* check if the ADDSEND flag has been set */ if(val & I2C_STAT0_ADDSEND){ /* clear ADDSEND flag */ i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND); /* send a stop condition to I2C bus */ i2c_stop_on_bus(I2C0); /* exit the function */ return ; } else { /* clear the bit of AERR */ i2c_flag_clear(I2C0, I2C_FLAG_AERR); } /* send a stop condition to I2C bus */ i2c_stop_on_bus(I2C0); /* wait until the stop condition is finished */ while(I2C_CTL0(I2C0)&I2C_CTL0_STOP); } }这个函数是干什么的?详细解释每一句
时间: 2024-02-14 09:15:29 浏览: 228
这个函数是用来等待EEPROM设备进入待机状态的。
具体解释如下:
```c
void eeprom_wait_standby_state(void) {
__IO uint32_t val = 0; //定义一个32位的无符号整型变量val,初始化为0
while(1){ //进入一个死循环,直到EEPROM设备进入待机状态后才会退出
//等待I2C总线空闲
while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));
//向I2C总线发送起始信号
i2c_start_on_bus(I2C0);
//等待起始信号发送完成
while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));
//向EEPROM设备发送地址和写命令
i2c_master_addressing(I2C0, eeprom_address, I2C_TRANSMITTER);
//循环检查地址是否被确认,或者是否出现地址错误
do{
//读取I2C_STAT0寄存器的值
val = I2C_STAT0(I2C0);
}while(0 == (val & (I2C_STAT0_ADDSEND | I2C_STAT0_AERR)));
//检查地址是否被确认
if(val & I2C_STAT0_ADDSEND){
//清除ADDSEND标志位
i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);
//发送停止信号
i2c_stop_on_bus(I2C0);
//退出函数
return ;
} else {
//清除AERR标志位
i2c_flag_clear(I2C0, I2C_FLAG_AERR);
}
//发送停止信号
i2c_stop_on_bus(I2C0);
//等待停止信号发送完成
while(I2C_CTL0(I2C0)&I2C_CTL0_STOP);
}
}
```
总体来说,这个函数的作用就是等待EEPROM设备进入待机状态,以便后续的读写操作能够顺利进行。具体实现过程如下:
1. 定义一个32位的无符号整型变量val,初始化为0;
2. 进入一个死循环,直到EEPROM设备进入待机状态后才会退出;
3. 等待I2C总线空闲;
4. 向I2C总线发送起始信号;
5. 等待起始信号发送完成;
6. 向EEPROM设备发送地址和写命令;
7. 循环检查地址是否被确认,或者是否出现地址错误;
8. 如果地址被确认,则清除ADDSEND标志位、发送停止信号,并退出函数;
9. 如果出现地址错误,则清除AERR标志位;
10. 发送停止信号;
11. 等待停止信号发送完成;
12. 重复步骤3-11,直到EEPROM设备进入待机状态。
阅读全文