标题: 求助:关于IIC总线响应的问题 [打印本页]

作者: sefawg    时间: 2018-6-13 23:23
标题: 求助:关于IIC总线响应的问题
初学单片机求大神指点迷津。我按照教程抄了个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. }
复制代码







作者: 134849694164151    时间: 2018-6-14 01:09
不清楚了,我没试过
作者: lzts88    时间: 2018-6-14 02:21
I2C有时序要求的, 不能单步调试.
作者: HC6800-ES-V2.0    时间: 2018-6-14 07:21
等待响应,不是你的单片机响应,而是I2C设备响应,你在调试时,没有那个设备,当然就不会响应了,所以,SDA不会为零的。
作者: data_123    时间: 2018-6-14 10:13
调试卡住了吗
作者: ahshmj    时间: 2018-6-14 10:56
等的信号是外部器件返回的,你没有接实际的外部电路,怎么可能又返回信号呢?

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

当然你也可以在“keil”中的“外围设备”的“port”中手动模拟外围设备的返回信号。
作者: 熊文涛110    时间: 2018-6-14 15:58
不要对时序做调试,你单片机可以等,对面芯片不会等。还是对整个波形进行分析吧,用示波器抓波形分析问题。
作者: sefawg    时间: 2018-6-14 18:05
ahshmj 发表于 2018-6-14 10:56
等的信号是外部器件返回的,你没有接实际的外部电路,怎么可能又返回信号呢?

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

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




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1