1. <em id="3qmea"><ol id="3qmea"></ol></em>
    2. <em id="3qmea"></em>

      单片机论坛

       找回密码
       立即注册

      QQ登录

      只需一步,快速开始

      搜索
      查看: 3576|回复: 11
      收起左侧

      关于用51单片机模拟IIC总线通信(主机给从机发信号,从机无应答时应该终止发送数据)

      [复制链接]
      blossom99 发表于 2018-9-3 19:51 | 显示全部楼层 |阅读模式
      最近认真的学习了IIC总线通信,并看了郭天祥老师的书和视?#21040;步狻?br /> 但是我有一点疑问:在IIC总线协议里规定当主机给从机发信号,从机无应答时应该终止发送数据,但是郭老师的例程里并没有这一内容,在其他的IIC通信例程中也没有看到类似内容。这是说明这个部分不重要吗?如果要实现是不?#20999;?#35201;用到goto语句?


      回复

      使用道具 举报

      人中狼 发表于 2018-9-3 22:36 | 显示全部楼层
      这部分应该都有?#27169;?#36825;里的从机应答应该不是应答相应的数据,而是在协议里主机发送一个字节数据后,从机都会返回一个应答的位,只有一个BIT,注意看协议

      评分

      参与人数 1黑币 +20 收起 理由
      admin + 20 回帖助人的奖励!

      查看全部评分

      回复

      使用道具 举报

      马帅 发表于 2018-9-4 00:27 来自手机 | 显示全部楼层
      低电平应答ACK,高电平NACK

      评分

      参与人数 1黑币 +20 收起 理由
      admin + 20 回帖助人的奖励!

      查看全部评分

      回复

      使用道具 举报

       楼主| blossom99 发表于 2018-9-4 01:30 | 显示全部楼层
      你?#23884;?#27809;有理解我的意思。我是说,主机给从机发数据,从机没有给主机应答,即没有在SCK高电平时把SDA拉低(1bit)时,主机应该中断传输才对。但是我看的所有例程里(包括不少12864LCD例程)都没有相关语句,大多只是后面加了一个时钟,都不管SDA是什么,只为了能够顺利进行数据传输。还有AT24C02中读完一节数据应该先非应答,再停止之类的小细节……可能是我抠的太仔细了……

      评分

      参与人数 1黑币 +40 收起 理由
      admin + 40 回帖助人的奖励!

      查看全部评分

      回复

      使用道具 举报

       楼主| blossom99 发表于 2018-9-4 01:31 | 显示全部楼层
      人中狼 发表于 2018-9-3 22:36
      这部分应该都有?#27169;?#36825;里的从机应答应该不是应答相应的数据,而是在协议里主机发送一个字节数据后,从机都会 ...

      看楼下我的解释
      回复

      使用道具 举报

       楼主| blossom99 发表于 2018-9-4 01:32 | 显示全部楼层
      马帅 发表于 2018-9-4 00:27
      低电平应答ACK,高电平NACK

      看楼下我的解释
      回复

      使用道具 举报

      726434632 发表于 2018-9-4 08:31 | 显示全部楼层
      可以不去理从机、主机自己模拟一个应答位就好了。
      类似这种
      ?#20174;?#31572;信号由主机自己模拟、不理会从机。只要芯片没有坏、不影响使用。
      void iic_slave_NOACK()//默认非应答信号
      {
              SDA=1;
              _nop_();
              SCL=1;
              _nop_();
              SCL=0;       
              _nop_();
      }

      void MSA300_WriteBytes(unsigned char RegAddr,unsigned char Data)
      {
                  I2C_Start();//主机准备好了
              I2C_Write(G_SlaveAddr_W);//主机要给从机发数据,知会从机一下
              iic_Ack();//主机当从机默认知道了
              I2C_Write(RegAddr);//主机告诉从机要操纵的地址
              iic_Ack();//主机当从机默认知道了
              I2C_Write(Data);//主机告诉从机要修改的地?#20998;?#20869;容
              iic_Ack();//主机当从机默认知道了
              I2C_Stop();//主机挂断了电话
      }
      回复

      使用道具 举报

      726434632 发表于 2018-9-4 08:37 | 显示全部楼层
      blossom99 发表于 2018-9-4 01:30
      你?#23884;?#27809;有理解我的意思。我是说,主机给从机发数据,从机没有给主机应答,即没有在SCK高电平时把SDA拉低( ...

      从机如果没有给主机应答、即说明从机坏了或者时序不对。读出来的数据肯定是不对的。所以一般简单用途都不去理会从机是否应答。如果要去理会从机应答那就while等待从机应答、然后加个超时机制,规定时间内while没有检测到从机应答、就return 错误标志,如果成功发送就return 成功标志。主程序里判断是错误标志就输出错误信息即可,比如“通信错误、请更换芯片”

      评分

      参与人数 1黑币 +5 收起 理由
      blossom99 + 5 很给力!

      查看全部评分

      回复

      使用道具 举报

      人中狼 发表于 2018-9-4 10:19 | 显示全部楼层
      最好可以贴上你所看的例程,或许有的例程为了?#22870;?#24182;没有去检测应答,我也是看例程学的IIC,里面就有对从机应答的检测和处理。多看一些例程,现在都用C语言写程序,所以有的例程不需要局限在51,?#37096;?#20197;看看如STM32中相关操作的例程
      回复

      使用道具 举报

      zyaq123 发表于 2018-9-4 11:41 | 显示全部楼层
      你可以加延时判?#20064; ?#23450;时过后如果没有收到应答,则?#39034;?#27492;次发送
      回复

      使用道具 举报

      zyaq123 发表于 2018-9-4 11:43 | 显示全部楼层
      从机无应答,可能总线有问题哦,你可以在主机上加延时判断。尽可能少用while,或者while中做一个技术,不然很容易卡机
      回复

      使用道具 举报

      温xyz 发表于 2018-10-24 23:44 | 显示全部楼层
      郭老师的教材只能入门,有很多东西是粗糙?#27169;?#19981;严谨的。
      回复

      使用道具 举报

      13#
      无效楼层,该帖已经被删除
      您需要登录后才可以回帖 登录 | 立即注册

      本版积?#27490;?#21017;

      QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机 联系QQ:125739409;技术交流QQ群582644647

      Powered by 单片机?#22363;?#32593;

      快速回复 返回顶部 返回列表
      青海11选5app下载

        
        
        1. <em id="3qmea"><ol id="3qmea"></ol></em>
        2. <em id="3qmea"></em>

            
            
            1. <em id="3qmea"><ol id="3qmea"></ol></em>
            2. <em id="3qmea"></em>
              qq游戏欢乐斗地主 前三组选组六怎么玩 江西快3开奖视频直播 体彩浙江20选518298期 手机qq游戏大厅五子棋 福彩七乐彩走势图预测 陕西快乐十分钟 赌场回忆录 新河南481在线直播 3d经典胆码公式 黄金城娱乐场骗人吗 体育彩票走势图区号 河南快3跨度走势图 韩国快乐8官网下载地址 百家乐玩法