查看: 3888|回复: 7

[求助] I2C通信问题

[复制链接]
  • TA的每日心情
    郁闷
    2019-11-18 08:30
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    2

    主题

    16

    帖子

    0

    注册会员

    Rank: 2

    积分
    71
    最后登录
    2019-11-18
    发表于 2019-11-11 10:31:04 | 显示全部楼层 |阅读模式
    用LPC804做了一个温湿度控制器,接SHT21温湿度传感器可以正常使用。接上测试板(模拟各种温湿度数值,检测控制逻辑用)i2c通信失败,测试板在其他控制器上能正常使用。这里使用的IO模拟I2C

    示波器测到的SCL信号

    示波器测到的SCL信号
    示波器测到的SCL波形如图,如果不接SDA线,SCL信号正常。请问大家这可能是什么原因?怎么解决?
    我知道答案 目前已有7人回答
    哎,代码总出bug,签到求保佑!
    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    2019-11-18 08:30
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    2

    主题

    16

    帖子

    0

    注册会员

    Rank: 2

    积分
    71
    最后登录
    2019-11-18
     楼主| 发表于 2019-11-12 15:04:18 | 显示全部楼层
    使用SHT21传感器时通信正常,波形图如下:

    0b8856e46a66395a7e28f79f9043457.jpg

    因需要测试其功能,使用单片机从机模式来模拟数据,与主机通信失败。在未接入SDA信号时的SCL信号如下:

    01212b0a32075d20d4c74b94383ee67.jpg

    在SDA信号接入之后,SCL比较明显的不正常,SDA信号也有异常。怀疑是导致通信失败的问题点,但是不清楚引起原因,也不知道怎么解决,请大家看看,寻求帮助

    比较明显的时钟信号不正常

    比较明显的时钟信号不正常
             559bfd49f81ca379e19b33d76e42b2b.jpg
    哎,代码总出bug,签到求保佑!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2021-8-25 16:50
  • 签到天数: 57 天

    连续签到: 1 天

    [LV.5]常住居民I

    20

    主题

    185

    帖子

    12

    金牌会员

    Rank: 6Rank: 6

    积分
    1288
    最后登录
    2025-5-19
    发表于 2019-11-11 12:29:29 | 显示全部楼层
    把SCL SDA波形都抓出来看看。
    签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-5-7 16:22
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    1

    主题

    42

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    293
    最后登录
    2021-7-29
    发表于 2019-11-11 14:05:20 | 显示全部楼层
    应该把驱动代码贴出来看看,一般是软件问题
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2019-11-18 08:30
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    2

    主题

    16

    帖子

    0

    注册会员

    Rank: 2

    积分
    71
    最后登录
    2019-11-18
     楼主| 发表于 2019-11-11 14:14:22 | 显示全部楼层
    1. void measuring()
    2. {
    3.     unsigned int measdata;
    4.     byte errcode,slaveAck;
    5.     measCounter++;
    6.     dispcounter &= 0x01;
    7.     if(levelFlag == 7)
    8.     {
    9.         return;
    10.     }
    11.     if(SHT2xResetFlag == 0)
    12.     {
    13.         if(measCounter == 1)        //read RH
    14.         {
    15.             slaveAck = HTU21Command(0xF5);
    16.             if(slaveAck)
    17.             {
    18.                        if(counterErrCNC < 255)
    19.                        {
    20.                              counterErrCNC++;
    21.                              counterErrCNC1++;
    22.                        }
    23.             }
    24.             else
    25.             {
    26.                 counterErrCNC = 0;
    27.                 counterErrCNC1 = 0;
    28.             }
    29.         }
    30.         else if(measCounter == 7)  //wait 120ms
    31.         {
    32.              errcode = HTU21read(&measdata);
    33.              if(errcode)
    34.              {
    35.                      if(counterErrCRC < 255)
    36.                      {  
    37.                              counterErrCRC++;
    38.                          counterErrCRC1++;
    39.                      }
    40.              }
    41.              else
    42.              {
    43.                  counterErrCRC = 0;
    44.                  counterErrCRC1 = 0;
    45.                  readdataRH[0] = measdata >> 8;
    46.                      readdataRH[1] = measdata & 0x00FF;
    47.              }
    48.              SCL_INPUT();           
    49.         }
    50.         else if((measCounter >= 8)&&(measCounter <= 20)) //new
    51.         {
    52.             if(SCL == 0)
    53.             {
    54.                 SCLholdFlag = 1;
    55.             }
    56.             else
    57.             {
    58.                 if(SCLholdFlag)
    59.                 {
    60.                     SCLholdFlag = 0;
    61.                     dummyReadCnt++;
    62.                     errcode = HTU21read2(&measdata);
    63.                     if(errcode == 0)
    64.                     {
    65.                         counterErrCRC = 0;
    66.                         readdataRH[0] = measdata >> 8;
    67.                         readdataRH[1] = measdata & 0x00FF;
    68.                     }
    69.                 }
    70.             }
    71.         }
    72.         else if(measCounter == 21)  //read temperature
    73.         {
    74.              slaveAck = HTU21Command(0xF3);  //0xF3
    75.              if(slaveAck)
    76.              {
    77.                        if(counterErrCNC2 < 255)
    78.                        {
    79.                              counterErrCNC2++;
    80.                              counterErrCNC3++;
    81.                        }
    82.              }
    83.              else
    84.              {
    85.                 counterErrCNC2 = 0;
    86.                 counterErrCNC3 = 0;
    87.              }
    88.         }
    89.         else if(measCounter == 31)  //wait 200ms
    90.         {
    91.              errcode = HTU21read(&measdata);
    92.              if(errcode)
    93.              {
    94.                      if(counterErrCRC2 < 255)
    95.                      {
    96.                              counterErrCRC2++;
    97.                              counterErrCRC3++;
    98.                      }
    99.              }
    100.              else
    101.              {
    102.                  counterErrCRC2 = 0;
    103.                  counterErrCRC3 = 0;
    104.                  readdataTemp[0] = measdata >> 8;
    105.                      readdataTemp[1] = measdata & 0x00FF;
    106.              }
    107.              SCL_INPUT();           
    108.         }
    109.         
    110.         else if((measCounter >= 32)&&(measCounter < 50))  //new
    111.         {
    112.             if(SCL == 0)
    113.             {
    114.                 SCLholdFlag = 1;
    115.             }
    116.             else
    117.             {
    118.                 if(SCLholdFlag)
    119.                 {
    120.                     SCLholdFlag = 0;
    121.                     dummyReadCnt++;   
    122.                     errcode = HTU21read2(&measdata);
    123.                     if(errcode == 0)
    124.                     {
    125.                         counterErrCRC2 = 0;
    126.                         readdataTemp[0] = measdata >> 8;
    127.                             readdataTemp[1] = measdata & 0x00FF;
    128.                     }   
    129.                 }
    130.             }
    131.         }  
    132.     }
    133.     else if(SHT2xwaitSec == 0)
    134.     {
    135.        if(measCounter == 1)
    136.        {
    137.            (void)HTU21read2(&measdata);  
    138.        }
    139.        else if(measCounter == 2)
    140.        {
    141.            SCL_INPUT();
    142.            SDA_HIGH();   
    143.        }
    144.     }
    145.     else if(SHT2xwaitSec == 1)
    146.     {
    147.        if(measCounter == 35)
    148.        {
    149.            errcode = SHT2x_SoftReset();
    150.        }
    151.        else if(measCounter == 50)
    152.        {
    153.            SHT2xResetFlag = 0;
    154.        }
    155.     }
    156.     if(measCounter >= 50)
    157.     {
    158.         measCounter = 0;
    159.         dispcounter++;
    160.         SHT2xwaitSec++;
    161.         //2017.12.08
    162.         if((counterErrCNC1 >= 8) || (counterErrCNC3 >= 8))
    163.         {
    164.             SHT2xResetFlag = 1;
    165.             SHT2xwaitSec = 0;
    166.             counterErrCNC1 = 0;
    167.             counterErrCNC3 = 0;
    168.         }
    169.         else if((counterErrCRC1 >= 8) || (counterErrCRC3 >= 8))
    170.         {
    171.             SHT2xResetFlag = 1;
    172.             SHT2xwaitSec = 0;
    173.             counterErrCRC1 = 0;
    174.             counterErrCRC3 = 0;
    175.         }
    176.     }

    177.     if((counterErrCNC >= 48)||(counterErrCRC >= 150))
    178.     {
    179.         humidityFlag = 1;           
    180.     }
    181.     if(counterErrCNC || counterErrCRC)
    182.     {
    183.         commErrFlag = 1;
    184.     }
    185.     else commErrFlag = 0;
    186.    
    187.     if((counterErrCNC2 >= 48)||(counterErrCRC2 >= 150))
    188.     {
    189.         temper0Flag = 1;         
    190.     }
    191.     if(counterErrCNC2 || counterErrCRC2)
    192.     {
    193.         commErrFlag2 = 1;
    194.     }
    195.     else commErrFlag2 = 0;
    196.    
    197.     if(sensor1PwrFlag == 1)
    198.     {
    199.         if(counterErrCNC >= 4)
    200.         {
    201.             humidityFlag = 1;  
    202.             sensor1PwrFlag = 0;
    203.         }
    204.     }      
    205.     if(sensor2PwrFlag == 1)
    206.     {
    207.         if(counterErrCNC2 >= 4)
    208.         {
    209.             temper0Flag = 1;  
    210.             sensor2PwrFlag = 0;
    211.         }
    212.     }   
    213.     if(counterBaseSec >= 6)
    214.     {
    215.         sensor1PwrFlag = 0;
    216.         sensor2PwrFlag = 0;
    217.     }
    218. }
    复制代码
    哎,代码总出bug,签到求保佑!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25561
    最后登录
    2025-9-17
    发表于 2019-11-12 09:42:17 | 显示全部楼层
    你把两个波形都一起抓出来吧,还有介绍一下问题现象
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2019-11-18 08:30
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    2

    主题

    16

    帖子

    0

    注册会员

    Rank: 2

    积分
    71
    最后登录
    2019-11-18
     楼主| 发表于 2019-11-12 14:49:42 | 显示全部楼层
    file:///C:/Users/Administrator/Desktop/IIC%E7%A4%BA%E6%B3%A2%E5%99%A8%E6%B3%A2%E5%BD%A2/2d24bba5f67633f38b24f9b4e75e495.jpg
    哎,代码总出bug,签到求保佑!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-8-8 16:43
  • 签到天数: 1504 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4695

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10112
    最后登录
    2025-9-17
    发表于 2019-11-12 21:54:35 | 显示全部楼层
    小帅哥,不要贴应用层的代码。
    要看看I2C驱动部分的代码。
    会不会是引脚配置哪里有问题啊?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-18 09:40 , Processed in 0.114596 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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