野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17654|回复: 7

I2C例程中的一些小问题,求解答

[复制链接]
发表于 2015-4-27 19:35:48 | 显示全部楼层 |阅读模式
这两天学习到了I2C这一章节,感觉难度骤增啊,例程里面有几处疑惑的地方,百度了半天也没搞明白,特来发帖求教。while(NumByteToRead)  
  {
    if(NumByteToRead == 1)
    {
      I2C_AcknowledgeConfig(I2C1, DISABLE);

      I2C_GenerateSTOP(I2C1, ENABLE);
    }

    if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))
    {      
      *pBuffer = I2C_ReceiveData(I2C1);
      pBuffer++;
      NumByteToRead--;        
    }   
  }
  I2C_AcknowledgeConfig(I2C1, ENABLE);
}


这段代码中关于*pBuffer = I2C_ReceiveData(I2C1);这句话解释是“返回通过I2C最近接收的数据”,我想问的第一个问题:pBuffer[0]中是I2C中的第一个数据还是最后一个数据,比如我向I2C中输入了1,2,3,4,5.那么是1还是5?第二个问题:在循环一次后,再次到了*pBuffer = I2C_ReceiveData(I2C1)这句话时候,库函数I2C_ReceiveData(I2C1)会自动移了一个数据吗?pBuffer[1]直接就等于2(或者4)?



还有就是下面这段等待函数中:
void I2C_EE_WaitEepromStandbyState(void)      
{
  vu16 SR1_Tmp = 0;

  do
  {
    I2C_GenerateSTART(I2C1, ENABLE);
    SR1_Tmp = I2C_ReadRegister(I2C1, I2C_Register_SR1);
    I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);
  }while(!(I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0x0002));

  I2C_ClearFlag(I2C1, I2C_FLAG_AF);
  I2C_GenerateSTOP(I2C1, ENABLE);
}


SR1_Tmp = I2C_ReadRegister(I2C1, I2C_Register_SR1);这句话有什么作用?
回复

使用道具 举报

 楼主| 发表于 2015-4-27 19:50:41 | 显示全部楼层
自顶一下。。。
回复

使用道具 举报

 楼主| 发表于 2015-4-27 20:51:57 | 显示全部楼层
。。。。。。。。。
回复

使用道具 举报

 楼主| 发表于 2015-4-28 09:02:18 | 显示全部楼层
求大神解惑
回复 支持 反对

使用道具 举报

发表于 2015-4-28 10:08:43 | 显示全部楼层
我也有这个问题,你解决了吗?  
回复 支持 反对

使用道具 举报

发表于 2015-4-28 10:08:57 | 显示全部楼层
pBuffer[0]中是I2C中的第一个数据还是最后一个数据:向I2C读数据,读一次即(调用I2C_ReceiveData(I2C1);),地址应该会自动递增到下一个地址,所以pBuffer[0]是I2C地址低的那个数据,楼主可以一次写几个数据,而每次读一个不同地址的数据来分析这个问题。
库函数I2C_ReceiveData(I2C1)会自动移了一个数据吗这个会的,可以参考技术手册中对I2C读写操作说明,实际上很多器件都有这样的功能的
SR1_Tmp = I2C_ReadRegister(I2C1, I2C_Register_SR1);这句话有什么作用?不是很清楚,我觉得是I2C协议要求的吧,在启动I2C通信后读一下状态寄存器
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-28 11:15:04 | 显示全部楼层
mmx0719 发表于 2015-4-28 10:08
我也有这个问题,你解决了吗?

看楼下兄弟的解答
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-28 11:15:55 | 显示全部楼层
亽亼 发表于 2015-4-28 10:08
pBuffer[0]中是I2C中的第一个数据还是最后一个数据:向I2C读数据,读一次即(调用I2C_ReceiveData(I2C1);) ...

多谢解惑!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 18:52 , Processed in 0.034701 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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