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

      单片机论坛

       找回密码
       立即注册

      QQ登录

      只需一步快速开始

      搜索
      查看: 3116|回复: 11
      打印 上一主题 下一主题
      收起左侧

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

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


      分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
      收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
      回复

      使用道具 举报

      沙发
      人中狼 发表于 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 回帖助人的奖励

      查看全部评分

      回复

      使用道具 举报

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

      看楼下我的解释
      回复

      使用道具 举报

      6#
       楼主| blossom99 发表于 2018-9-4 01:32 | 只看该作者
      马帅 发表于 2018-9-4 00:27
      低电平应答ACK高电平NACK

      看楼下我的解释
      回复

      使用道具 举报

      7#
      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();//主机挂断了电话
      }
      回复

      使用道具 举报

      8#
      726434632 发表于 2018-9-4 08:37 | 只看该作者
      blossom99 发表于 2018-9-4 01:30
      你?#23884;?#27809;有理解我的意思我是说主机给从机发数据从机没有给主机应答即没有在SCK高电平时把SDA拉低 ...

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

      评分

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

      查看全部评分

      回复

      使用道具 举报

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

      使用道具 举报

      10#
      zyaq123 发表于 2018-9-4 11:41 | 只看该作者
      你可以?#21451;?#26102;判?#20064;?#23450;时过后如果没有收到应答则?#39034;?#27492;次发送
      回复

      使用道具 举报

      11#
      zyaq123 发表于 2018-9-4 11:43 | 只看该作者
      从机无应答可能总线有问题哦你可以在主机上?#21451;?#26102;判断尽可能少用while或者while中做一个技术不然很容易卡机
      回复

      使用道具 举报

      12#
      ?#24405;?#39281; 发表于 2018-10-24 23:44 | 只看该作者
      郭老师的教材只能入门有很多东西是粗糙?#27169;?#19981;严谨的
      回复

      使用道具 举报

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

      本版积?#27490;?#21017;

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

      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>