找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2008|回复: 7
收起左侧

求助:关于IIC总线响应的问题

[复制链接]
ID:345303 发表于 2018-6-13 23:23 | 显示全部楼层 |阅读模式
初学单片机求大神指点迷津。我按照教程抄了个EEPROM的读写程序,对EEPROM写入一个字节后挂起SDA=1,然后置SCL=0等待SDA响应(即SDA会变为0).
可是我用Keil4做单步运行,发现SDA=1后SDA就一直为1, SCL=0后SDA也还是为0. 这究竟是怎么回事? 难道用Keil4调试是没有响应的吗?一定要烧录到开发板后才有反应?
  1. /*******************************************************************************
  2. * 函数名         : I2cSendByte(unsigned char dat)
  3. * 函数功能                 : 通过I2C发送一个字节。在SCL时钟信号高电平期间,保持发送信号SDA保持稳定
  4. * 输入           : num
  5. * 输出                  : 0或1。发送成功返回1,发送失败返回0
  6. * 备注           : 发送完一个字节SCL=0,SDA=1
  7. *******************************************************************************/

  8. unsigned char I2cSendByte(unsigned char dat)
  9. {
  10.         unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。               
  11.         for(a=0;a<8;a++)//要发送8位,从最高位开始
  12.         {
  13.                 SDA=dat>>7;         //起始信号之后SCL=0,所以可以直接改变SDA信号
  14.                 dat=dat<<1;
  15.                 Delay10us();
  16.                 SCL=1;
  17.                 Delay10us();//建立时间>4.7us
  18.                 SCL=0;
  19.                 Delay10us();//时间大于4us               
  20.         }
  21.         SDA=1;
  22.         Delay10us();
  23.         SCL=1;
  24.         while(SDA)//等待应答,也就是等待从设备把SDA拉低
  25.         {
  26.                 b++;
  27.                 if(b>200)         //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
  28.                 {
  29.                         SCL=0;
  30.                         Delay10us();
  31.                         return 0;
  32.                 }
  33.         }
  34.         SCL=0;
  35.         Delay10us();
  36.         return 1;               
  37. }
复制代码






回复

使用道具 举报

ID:329253 发表于 2018-6-14 01:09 来自手机 | 显示全部楼层
不清楚了,我没试过
回复

使用道具 举报

ID:341045 发表于 2018-6-14 02:21 | 显示全部楼层
I2C有时序要求的, 不能单步调试.
回复

使用道具 举报

ID:164602 发表于 2018-6-14 07:21 | 显示全部楼层
等待响应,不是你的单片机响应,而是I2C设备响应,你在调试时,没有那个设备,当然就不会响应了,所以,SDA不会为零的。
回复

使用道具 举报

ID:351634 发表于 2018-6-14 10:13 | 显示全部楼层
调试卡住了吗
回复

使用道具 举报

ID:7485 发表于 2018-6-14 10:56 | 显示全部楼层
等的信号是外部器件返回的,你没有接实际的外部电路,怎么可能又返回信号呢?

就像你在等按键按下,但是你没有按键(你是软件模拟的)怎么能有按下的信号呢?

当然你也可以在“keil”中的“外围设备”的“port”中手动模拟外围设备的返回信号。
回复

使用道具 举报

ID:351932 发表于 2018-6-14 15:58 | 显示全部楼层
不要对时序做调试,你单片机可以等,对面芯片不会等。还是对整个波形进行分析吧,用示波器抓波形分析问题。
回复

使用道具 举报

ID:345303 发表于 2018-6-14 18:05 | 显示全部楼层
ahshmj 发表于 2018-6-14 10:56
等的信号是外部器件返回的,你没有接实际的外部电路,怎么可能又返回信号呢?

就像你在等按键按下,但是 ...

其实这个教学程序的作用是写一个字节到EEPROM, 然后读出来并显示在数码管上. 我把标准程序烧录到开发板上并不能达到这样的效果,所以想单步调试看看在写入时字节有没有写入EEPROM ,看看到底是哪里出了问题. 如果无法用Keil4模拟的话,有什么好的方法察看是否成功写入吗?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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