3977|6

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

有一事不明 [复制链接]

在调试12c调试的例程时:
请看:主模式接受数据时
while(NumByteToRead)  
  {
    /* Test on EV7 and clear it */
    if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))  
    {
      if(NumByteToRead == 2)
      {
        /* Disable Acknowledgement */
        I2C_AcknowledgeConfig(I2C1, DISABLE);
      }

      if(NumByteToRead == 1)
      {
        /* Send STOP Condition */
        I2C_GenerateSTOP(I2C1, ENABLE);
      }
      
      /* Read a byte from the EEPROM */
      *pBuffer = I2C_ReceiveData(I2C1);

      /* Point to the next location where the byte read will be saved */
      pBuffer++; 
      
      /* Decrement the read bytes counter */
      NumByteToRead--;    
    }   
  }
历程中在倒数第二个字节产生nack 倒数第一个产生stop

而文档中有写:
关闭通信
主设备在从从设备接收到的最后一个字节后发送一个NACK。从设备接收到NACK后,释放对SCL和SDA线的控制。主设备就可以发送一个停止/重起始(Stop/Re-Start)条件。
􀁺 为了在收到最后一个字节后产生一个NACK脉冲,在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)必须清除ACK位。
􀁺 为了产生一个停止/重起始条件,软件必须在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)设置STOP/START位。
在产生了停止条件后,接口自动回到从模式(M/SL位被清除)。


都应该在倒数第一个才对。
此帖出自stm32/stm8论坛

最新回复

                                     详情 回复 发表于 2008-3-11 17:47
点赞 关注
 

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

当你检测到有数据可读时,这个数据已经传送完成

运行到 if(NumByteToRead == 2) 这句时,倒数第二个字节已经在缓冲区中,即已经收到倒数第二个字节。

同理,倒数第一个字节也是如此。

例程和说明都没有错,是你的理解慢了一拍~~~~~~~~~
此帖出自stm32/stm8论坛
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

难道判断语句

难道判断语句 if(NumByteToRead == 2) 和 接受语句*pBuffer = I2C_ReceiveData(I2C1);
是同时执行的吗?接受的触发是硬件自己还是I2C_ReceiveData(I2C1)函数
请指点
此帖出自stm32/stm8论坛
 
 

回复

93

帖子

0

TA的资源

一粒金砂(初级)

4
 

执行判断语句时,数据已经在缓冲区中

前面的语句正是判断数据是否已经接收进到缓冲区中:
if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))

如果数据没有接收进到缓冲区,if(NumByteToRead == 2)根本不会被执行。
此帖出自stm32/stm8论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

5
 

那这么说 也不对呀

楼主请看:
  判断语句 if(NumByteToRead == 2)
在接受语句*pBuffer = I2C_ReceiveData(I2C1);
的前面
说明他判断的是上一次地接受。
 这样(==2) 他就是在倒数第二次接受前  禁止了应答响应
而你前面说是倒数第一次前才禁止  资料也是这么说的

请明示
  
此帖出自stm32/stm8论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

6
 

4楼已经说得很清楚了:执行判断语句时,数据已经在缓冲区

                                 I2C_ReceiveData(I2C1); 这句话只是把数据从缓冲区中读出而已;程序不会在这句话上等待数据进入。
此帖出自stm32/stm8论坛
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(初级)

7
 

明白了

                                  
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表