登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

I2C总线问题求救!

作者:alike 栏目:单片机
I2C总线问题求救!
功能:按下按键,执行e2prom-at24c02写入操作,
现象:mcu死机

死机有可能是进入死循环等待状态,i2c程序是网上下的,全部代码可见于:http://www.fjmcu.com/article_view.asp?id=1

程序好像死在红色标记处:while(F0==1);。
void wrnbyta(uchar slaw,uchar gg[],uchar n)
{
do{
sta( );
wrbyt(slaw);
cack( );
}while(F0==1);
wrbyt(gg[n]);
cack( );
}

F0在cack()函数中赋值,实际情况是在调用cack()函数过程中,实际上语句  F0=1 被执行;但按分析i2c在响应应答过程中,SDA 应该被赋 0,从而F0=1 应该不被执行才对。
而且,量SDA管脚电平为低电平(0.6V),也就是说,硬件SDA已经为低,但仍然执行了if(SDA==1) F0=1;
为什么?想不通!

void cack( )/*应答位检查*/
{
SDA=1;
SCL=1;
F0=0;
if(SDA==1)
F0=1;
SCL=0;
nop( );
}

另外,此段函数如果在单片机刚上电初始化时调用,不会有问题。
是什么原因造成的呢 ?

谢谢!


2楼: >>参与讨论
涤纶
/-
ISDA=1;
I2CWAIT();/DELAY  _nop_  _nop_
ISCL=1;
I2CWAIT();
ACK=ISDA;
ISCL=0;
I2CWAIT();
RETURN ACK;
是不是时序不够安全。

* - 本贴最后修改时间:2006-3-29 13:19:26 修改者:涤纶

参与讨论
昵称:
讨论内容:
 
 
相关帖子
大人请进,外围驱动器一问!
大家来说一下中断吧
关于仿真器
彻底搞定8051(寄存器篇)
请问用过DS1302的朋友,如何将时钟设置成0-24或0-12的格式
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号