野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10816|回复: 3

为什么I2C中SR寄存器的ADDR位一直读不出来

[复制链接]
发表于 2017-8-1 10:52:14 | 显示全部楼层 |阅读模式
本帖最后由 xlyzp 于 2017-8-1 18:22 编辑

完全按照例程来的,验证过程中I2C_EE_ByteWrite函数能正确执行,但就是卡在 waitEepromStandbyState函数处,经过断点调试后发现
运行完语句I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);后即使SR1寄存器是0x0482,即ADDR位为1,
往下执行SR1_Tmp = I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1);的时候ADDR会跳变为0,一开始以为是读操作会使ADDR为0,结果
发现读出来的的SR1寄存器的ADDR也位始终为0。把SR1_Tmp = I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1);换成
SR1_Tmp =I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED);或者
SR1_Tmp =I2C_GetFlagStatus (EEPROM_I2C,I2C_FLAG_ADDR);也不行。求各位大神给个解释。

int main(void)
{        
        // 程序来到main函数之前,启动文件:statup_stm32f10x_hd.s已经调用
        // SystemInit()函数把系统时钟初始化成72MHZ
        // SystemInit()在system_stm32f10x.c中定义
        // 如果用户想修改系统时钟,可自行编写程序修改
        uint8_t String[20]="transmit begin\n";
        uint8_t String1[20]="transmit complete\n";
        uint8_t String2[20]="receive begin\n";
        uint8_t String3[20]="receive complete\n";
  uint8_t aChar=0;        
        USART_Config();        
  I2C_EEPROM_config();        
        USART_SendString(DEBUG_USARTx,String);
        EEPROM_ByteWrite(0x00,'a');
        USART_SendString(DEBUG_USARTx,String1);
  EEPROM_WaitStandbyState();
        USART_SendString(DEBUG_USARTx,String2);
        aChar=EEPROM_ByteRead(0x00);
        USART_SendString(DEBUG_USARTx,String3);
        USART_SendByte(DEBUG_USARTx,aChar);
        while(1)
        {
        }
}

void I2C_EE_WaitEepromStandbyState(void)      
{
  vu16 SR1_Tmp = 0;

  do
  {
    /* Send START condition */
    I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);
    /* Send EEPROM address for write */
    I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);
        /* Read I2C1 SR1 register */
    SR1_Tmp = I2C_ReadRegister(EEPROM_I2Cx, I2C_Register_SR1 & 0x0002));
  }while(!SR1_Tmp);

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


捕获.PNG
捕获1.PNG
捕获2.PNG
回复

使用道具 举报

发表于 2017-8-1 11:54:35 | 显示全部楼层
先看看例程行不行,例程可以的话那就照抄
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-1 12:38:27 来自手机 | 显示全部楼层
fire视频里演示的例程也不行(▼皿▼#)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-1 18:20:29 | 显示全部楼层
就是这一步把ADDR给清零了
捕获3.PNG
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 23:18 , Processed in 0.030570 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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