野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 267|回复: 4

STM32 i2c写eeprom再读等待eeprom写完成代码部分

[复制链接]
发表于 2024-8-31 19:04:10 | 显示全部楼层 |阅读模式
本帖最后由 我不理解 于 2024-9-2 22:16 编辑

如下是野火给出的i2c驱动c程序的等待检测代码
void I2C_EE_WaitEepromStandbyState(void)      
{
  vu16 SR1_Tmp = 0;

  do
  {
    /* Send START condition */
    I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);
    /* Read I2C1 SR1 register */
    SR1_Tmp = I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1);
    /* Send EEPROM address for write */
    I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);
  }while(!(I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1) & 0x0002));        
<- 此处,在上一句给了发送7地址指令后,i2c此时是必定还没有发完这些地址的。那么直接判断i2c 的ADDR有没有发送完成是否是个合理的行为,虽然我不知道为什么程序可以跑,我猜测硬件层面状态机可能混乱阴差阳错导致程序运行成功了?可能在某次eeprom可以接到start信号后即使stm32发了好几次start eeprom也是                                                                                           一直接按内部状态机运行,然后给了个ack信号?然后被stm32捕捉到了?
非常费解好吧!!!!


  /* Clear AF flag */
  I2C_ClearFlag(EEPROM_I2Cx, I2C_FLAG_AF);
    /* STOP condition */   
    I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE);   
}

回复

使用道具 举报

发表于 2024-9-2 08:58:58 | 显示全部楼层
你怎么判断他一定没发送完地址的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-2 22:15:00 | 显示全部楼层
菠萝片 发表于 2024-9-2 08:58
你怎么判断他一定没发送完地址的

i2c的速度400K,cpu主频72M,刚给出的发送地址指令然后直接判断有没有发完,这难道发完了吗
回复 支持 反对

使用道具 举报

发表于 2024-9-3 09:42:07 | 显示全部楼层
为什么不能发完,他本身流程先运行完指令再运行下一句判断,没问题啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 14 小时前 | 显示全部楼层
菠萝片 发表于 2024-9-3 09:42
为什么不能发完,他本身流程先运行完指令再运行下一句判断,没问题啊

不是 i2c的速度是400k,你运行完一条指令后下条指令就是判断有没有发完,你指令是在72M时钟域运行的 a
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-12 14:28 , Processed in 0.109698 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表