标题:
求助:关于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调试是没有响应的吗?一定要烧录到开发板后才有反应?
/*******************************************************************************
* 函数名 : I2cSendByte(unsigned char dat)
* 函数功能 : 通过I2C发送一个字节。在SCL时钟信号高电平期间,保持发送信号SDA保持稳定
* 输入 : num
* 输出 : 0或1。发送成功返回1,发送失败返回0
* 备注 : 发送完一个字节SCL=0,SDA=1
*******************************************************************************/
unsigned char I2cSendByte(unsigned char dat)
{
unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。
for(a=0;a<8;a++)//要发送8位,从最高位开始
{
SDA=dat>>7; //起始信号之后SCL=0,所以可以直接改变SDA信号
dat=dat<<1;
Delay10us();
SCL=1;
Delay10us();//建立时间>4.7us
SCL=0;
Delay10us();//时间大于4us
}
SDA=1;
Delay10us();
SCL=1;
while(SDA)//等待应答,也就是等待从设备把SDA拉低
{
b++;
if(b>200) //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
{
SCL=0;
Delay10us();
return 0;
}
}
SCL=0;
Delay10us();
return 1;
}
复制代码
作者:
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