搜索
bottom↓
回复: 8

I2C 读取时序图疑问,见红色加粗字体

[复制链接]

出0入0汤圆

发表于 2017-8-27 22:13:33 | 显示全部楼层 |阅读模式
本帖最后由 swortering 于 2017-8-28 22:12 编辑

源代码为野火开发板提供的
uint32_t I2C_EE_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)
{  
  
  I2CTimeout = I2CT_LONG_TIMEOUT;
  
  //*((u8 *)0x4001080c) |=0x80;
  while(I2C_GetFlagStatus(EEPROM_I2Cx, I2C_FLAG_BUSY))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(9);
   }
  
  /* Send START condition */
  I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);
  //*((u8 *)0x4001080c) &=~0x80;
  
  I2CTimeout = I2CT_FLAG_TIMEOUT;
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_MODE_SELECT))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(10);
   }
  
  /* Send EEPROM address for write */
  I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);

  I2CTimeout = I2CT_FLAG_TIMEOUT;
  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(11);
   }
   
/* Clear EV6 by setting again the PE bit */
  I2C_Cmd(EEPROM_I2Cx, ENABLE);   
/* 为什么需要重新使能一下模块 */

  /* Send the EEPROM's internal address to write to */
  I2C_SendData(EEPROM_I2Cx, ReadAddr);  

   
  I2CTimeout = I2CT_FLAG_TIMEOUT;
  /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(12);
   }
   
  /* Send STRAT condition a second time */  
  I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);
  
  I2CTimeout = I2CT_FLAG_TIMEOUT;
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_MODE_SELECT))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(13);
   }
   
  /* Send EEPROM address for read */
  I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Receiver);
  
  I2CTimeout = I2CT_FLAG_TIMEOUT;
  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(14);
   }
  
  /* While there is data to be read */
  while(NumByteToRead)  
  {
    if(NumByteToRead == 1)
    {
      /* Disable Acknowledgement */
      I2C_AcknowledgeConfig(EEPROM_I2Cx, DISABLE);
      
      /* Send STOP Condition */
      I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE);
    }

    /* Test on EV7 and clear it */   
    I2CTimeout = I2CT_LONG_TIMEOUT;
   
                while(I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)==0)  
                {
                        if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(3);
                }
    {      
      /* Read a byte from the EEPROM */
      *pBuffer = I2C_ReceiveData(EEPROM_I2Cx);

      /* Point to the next location where the byte read will be saved */
      pBuffer++;
      
      /* Decrement the read bytes counter */
      NumByteToRead--;        
    }   
  }

  /* Enable Acknowledgement to be ready for another reception */
  I2C_AcknowledgeConfig(EEPROM_I2Cx, ENABLE);
  
    return 1;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入93汤圆

发表于 2017-8-28 07:02:15 | 显示全部楼层
红色?LZ您的色盲已经很严重了,还是去医院看看吧。

出0入0汤圆

发表于 2017-8-28 08:33:17 | 显示全部楼层
果然非常严重

出0入0汤圆

发表于 2017-8-28 09:27:11 | 显示全部楼层
/* Clear EV6 by setting again the PE bit */ 此地无银三百两

出0入8汤圆

发表于 2017-8-28 10:57:19 来自手机 | 显示全部楼层
liujinhan 发表于 2017-8-28 09:27
/* Clear EV6 by setting again the PE bit */ 此地无银三百两

采用设置PE的方式来,清除EV6
因为有些寄存器是写1清零,所以这里要使能一次

你不能指望每个人都学过英语,有些人能区分abc就很不错了

出0入8汤圆

发表于 2017-8-28 11:00:43 来自手机 | 显示全部楼层
takashiki 发表于 2017-8-28 07:02
红色?LZ您的色盲已经很严重了,还是去医院看看吧。

2R+1G=橙色
楼主说这是红色,说明他识别不了绿色

所以楼主是绿色色盲,鉴定完毕

出590入992汤圆

发表于 2017-8-28 15:11:59 | 显示全部楼层
canspider 发表于 2017-8-28 11:00
2R+1G=橙色
楼主说这是红色,说明他识别不了绿色

出0入0汤圆

 楼主| 发表于 2017-8-28 22:02:56 | 显示全部楼层
本帖最后由 swortering 于 2017-8-28 22:10 编辑

乐意接受批评,我编辑的时候选择的是红色,结果出来的是这种颜色,非常抱歉,没有仔细校对。
非常感谢 canspider 的回复。

出0入0汤圆

 楼主| 发表于 2017-8-28 22:08:17 | 显示全部楼层
canspider 发表于 2017-8-28 10:57
采用设置PE的方式来,清除EV6
因为有些寄存器是写1清零,所以这里要使能一次

麻烦您指出在datasheet的哪一段说明写PE可以清寄存器的,鄙人没有找到,谢谢您的批评。
还望您指出来。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-21 20:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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