• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

if判断函数的返回值,关于iic的一个问题

Chauncey 2017-11-27 浏览量:848

51模拟iic时有点问题没搞懂


我的想法是用if检测应答


1.png



如果有应答,I2C_Write(I2C_ID_EEPROM,255,0xf0)返回0,那应该跳出if,直接执行P0 = I2C_Read(I2C_ID_EEPROM, 255) ;


如果没有应答,那应该返回1,执行if里的P0 = 0;     delay_ms(5000); 然后执行P0 = I2C_Read(I2C_ID_EEPROM, 255) ;


不过写到单片机里发现不管怎么样,P0都被置低了5s


3.png

4.png


而且就算把false都备注掉,P0还是被置低了5s

QQ截图20171127151220.png


为什么会这样??



我的getack


1.png


18218811680的说法改成这样了,但是好像没什么用。。。


2.png

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 事实证明,你这个就是应答就是等不到。你看下你的应答函数怎么写的?应答函数应该是要循环等待应答,设置超时多久等不到应答在退出等待应答。
    • 发布于 2017-11-27
    • 举报
    • 评论 5
    • 1
    • 0
Chauncey 回复了 18218811680:帮我看一下吧,我把我之前的程序和按你的说法改的都放上去了,不过好像都不太管用 回复
18218811680 回复了 Chauncey:那没办法,你要用示波器量下了。量一下看看到底有没有,看下那个IIC设备的IIC时序,他是不是会发应答,响应时间会有多少。 回复
Chauncey 回复了 18218811680:字节写入AT24C02应该返回的都是应答才对。。。主要是这块板子是自己画的,用杜邦线接过去,就没法插逻辑分析仪了 回复
Chauncey 回复了 18218811680:会不会是没有上拉的原因啊,以前学arduino的时候读取输入信号都是要上拉的,不过51没这个设置吧 回复
电子老工程师 回复了 :V=干包选项 回复

其他答案 数量:4
  • 你吧return false注释掉,这个函数始终返回true=1;那么你这个if条件始终成立,就是始终拉低五秒啊?有什么问题吗?
    • 发布于2017-11-27
    • 举报
    • 评论 2
    • 0
    • 0
Chauncey 回复了 18218811680 :我ture定义的是0。。。 回复
电子老工程师 回复了  :MV57123 详细说明 红色LED指示-离散2V径向 毫烛光等级:4mcd 原型号10mcd 回复

  • 我觉得可能你这个从机地址有问题 就是那个I2C_ID_EEPROM 0xa0

    I2C的从机地址是7位的 你把它右移一位 即改成0x50试试先

    • 发布于2017-11-27
    • 举报
    • 评论 2
    • 0
    • 0
Chauncey 回复了 _落雪千寒灬 :I2C本身没问题,可以进行通信,就是没有响应 回复
电子老工程师 回复了  :同一家 回复

  • 你的I2C_Write 因为响应速度之类问题,可能会一直返回true(执行到末尾),所以会出现问题

    你要重新写那个函数啊,按前面的要大量改造。

    • 发布于2017-11-27
    • 举报
    • 评论 2
    • 0
    • 0
Chauncey 回复了 xdsnet :能和我说说具体怎么重新写吗?? 回复
电子老工程师 回复了  :6 = Industrial temperature range(工业级温度范围), - 40 to 85 °C (105 °C junction) 3 = Industrial temperature range(工业级温度范围), - 40 to 125 °C (130 °C junction) 回复

  • 兄弟,你Ture变量是0啊,也就是I2C_Write()执行到最后返回的是0,而如果从机有应答,I2C_Write()返回的是1,返回1的时候的时候if里面的语句生效,就执行P0置低5秒的操作,有什么问题吗?

    • 发布于2017-11-28
    • 举报
    • 评论 3
    • 0
    • 0
Chauncey 回复了 donatello :非应答才返回1啊,应答了应该返回0才对。字节写入应该返回的都是应答才对,if()里面的判断应该是0啊,应该不执行if后的指令才对啊 回复
donatello 回复了 Chauncey :你看清楚I2C_Write()到底是返回什么先吧,用串口打印一下看看? 回复
电子老工程师 回复了  :K代表版本,不带的不是完整的型号,完整的型号都带版本的,可能是供应商便于发货,版本都随机发,最好与供应商确认一下 回复

相关问题

问题达人换一批

if判断函数的返回值,关于iic的一个问题