2508|5

14

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

STC98LE52模拟 I2C通信 这个波形为什么会出现中间的电平,怎么消除? [复制链接]

STC98LE52模拟 I2C通信 带1个负载,上拉电阻是R202,这个波形为什么会出现中间的电平,怎么消除啊?求帮助
图后附模拟I2C程序

                                                 //状态标志
bit ack;                     //应答标志位
void Delay50us()        //@12.000MHz
{
    unsigned char i;

    _nop_();
    i = 22;
    while (--i);
}

//                     起动总线函数               
//函数原型: void  Start_I2c();  
//功能:       启动I2C总线,即发送I2C起始条件.
  
void start_i2c()
{
  sda=1;           //发送起始条件的数据信号
  sck=1;
 Delay50us(); 
  sda=0;           //发送起始信号
 Delay50us();     
  sck=0;           //钳住I2C总线,准备发送或接收数据 
 Delay50us();
}


//        结束总线函数               
//函数原型: void  Stop_I2c();  
//功能:       结束I2C总线,即发送I2C结束条件.

void stop_i2c()
{
  sda=0;          //发送结束条件的数据信号
  sck=1;          //结束条件建立时间大于4μs
 Delay50us();
  sda=1;          //发送I2C总线结束信号
 Delay50us();
}


//                 字节数据传送函数               
//函数原型: void  SendByte(unsigned char c);
//功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
//     此状态位进行操作.(不应答或非应答都使ack=0 假)     
//     发送数据正常,ack=1; ack=0表示被控器无应答或损坏。

void  sendbyte(unsigned char c)
{
 unsigned char BitCnt;
 
 for(BitCnt=0;BitCnt<8;BitCnt++)          //要传送的数据长度为8位
    {
     if((c<<BitCnt)&0x80)sda=1;           //判断发送位
       else  sda=0;                
     sck=1;             //置时钟线为高,通知被控器开始接收数据位
     Delay50us();        
     sck=0; 
    }
    
   Delay50us();
    sda=1;              //8位发送完后释放数据线,准备接收应答位
   Delay50us();  
    sck=1;
    Delay50us();
    if(sda==1)ack=0;     
       else ack=1;      //判断是否接收到应答信号
    sck=0;
    Delay50us();
}

 

此帖出自模拟电子论坛

最新回复

IIC的上拉一般2.2到10K,一般选个4.7K,然后引脚注意设置   详情 回复 发表于 2024-5-1 08:53
点赞 关注

回复
举报

6105

帖子

4

TA的资源

版主

沙发
 

上拉电阻是R202 是200欧。 太小了吧。4.7k看看。

此帖出自模拟电子论坛
 
 

回复

7186

帖子

2

TA的资源

版主

板凳
 

SDA那个波形看着确实奇怪,你要不换一个引脚测量一下呢?

此帖出自模拟电子论坛
 
 
 
 

回复

6105

帖子

4

TA的资源

版主

4
 

for(BitCnt=0;BitCnt<8;BitCnt++)          //要传送的数据长度为8位
    {
     if((c<<BitCnt)&0x80)sda=1;           //判断发送位
       else  sda=0;             //这里太快了吧,要不要延时一下  Delay50us();  
     sck=1;             //置时钟线为高,通知被控器开始接收数据位
     Delay50us();        
     sck=0; 
    }

此帖出自模拟电子论坛
 
 
 
 

回复

320

帖子

0

TA的资源

纯净的硅(初级)

5
 

波形确实不正常,是不是延时设置的不对,加大点延时试试看,或者换一组

此帖出自模拟电子论坛
 
 
 
 

回复

6470

帖子

9

TA的资源

版主

6
 

IIC的上拉一般2.2到10K,一般选个4.7K,然后引脚注意设置

此帖出自模拟电子论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表