11091|17

3404

帖子

6

TA的资源

裸片初长成(初级)

楼主
 

这样的毛刺会影响IIC时序吗? [复制链接]

 
本帖最后由 jishuaihu 于 2015-5-19 10:50 编辑

用430G2332模拟IIC时序,下面是波形,总是在收到ACK信号后有个毛刺,如果是在SCL的低电平时候应该是没有问题。但是刚才在SCL的下降沿,感觉不会有问题,但总感觉不舒服。正常想办法解决,大家也说一下


黄色的是SCL,绿色的是SDA,SCL看不太清,下载下来应该可以

最新回复

主机一直等待,会把时钟线拉低,暂停数据传输。用示波器什么也看不到啊. 我用的突发方式传输,我每发完一个字节,需要把主机改为接收模式等待应答吗?还是一等发完以字节就继续发送下一个啊   详情 回复 发表于 2015-5-23 08:37
 
点赞 关注

回复
举报

1193

帖子

0

TA的资源

纯净的硅(高级)

推荐
 
第一个毛刺应该是主机速度比从机快造成的,主机释放了SDA线,等待从机发送ACK/NACK,如果从机发送的是ACK,那么会重新拉低SDA。
间隔时间较短,在示波器上就体现为毛刺。
第二个毛刺是从机释放ACK信号,准备接收数据。恰好主机发送的第一位数据也是低,于是又见到毛刺了。只是,这回为何从机比主机快了?

赞赏

1

查看全部赞赏

 
 

回复

449

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
知道数字电路为什么抗干扰强吗?那是因为他只有0和1,也就是低电平和高电平。比如3.3V电路中,3.3V是高电平,3V也是高电平。当一个信号电平中存在3V~3.3V之间的变化时,看上去就是毛刺,但无论如何都是高电平。也就是说,只要毛刺在高电平范围内,那一般是不会出问题的。除非毛刺过大,在高低电平之间变化,那就有问题了。

赞赏

1

查看全部赞赏

 
 
 

回复

6040

帖子

203

TA的资源

版主

板凳
 
关键部分代码贴上来看看?
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

4
 
本帖最后由 jishuaihu 于 2015-5-19 11:36 编辑

这个问题已经解决了。这个其实是昨天下班前的问题,刚才通过调整代码解决了。


IIC写代码

  1. unsigned char I2Cwrite(unsigned char data)
  2. {
  3.         unsigned char bitMask;

  4.         unsigned char State;

  5.         SDA_OUT;

  6.         //SCL = 0;
  7.         SCL_LOW;                                                        //Ensure the clock line is low before putting the first bit on the bus


  8.         //Loop through 8 bit periods.  The variable bitMask will have a 1 at the location of the next bit to be processed.
  9.     for (bitMask = 0x80; bitMask > 0; bitMask >>=1)
  10.     {
  11.                 if ((bitMask & data) > 0)                //Check the relevant bit of the data variable.  If it is 1, let SDA float high
  12.                 {
  13.                         SDA_HIGH;

  14.                 }
  15.                 else
  16.                 {
  17.                         //SDA = 0;                                        //If the relevant bit of data was 0, pull the SDA line low.
  18.                         SDA_LOW;
  19.                 }

  20.                 //__delay_cycles(1);                                //Delay half a period
  21.                 SCL_HIGH;                                                //Release the SCL line to float high
  22.                 __delay_cycles(1);                                //Delay half a period

  23.                 //SCL = 0;
  24.                 SCL_LOW;                                                //Pull the SCL line low before putting the next bit on the SDA line

  25.     }


  26.         //Get ACK or NACK from the slave
  27.         SDA_HIGH;                                             //Release data line to float high
  28.         //__delay_cycles(1);                                        //Delay half a period
  29.         SDA_IN;

  30.         SCL_HIGH;                               //Release clock line to float high
  31.         __delay_cycles(1);
  32.         if ((P1IN&BIT2) == BIT2)
  33.         {
  34.                 State = 0;//return(0);                                                //A NACK was received
  35.         }

  36.         if ((P1IN&BIT2) == 0)
  37.         {
  38.                 SDA_LOW;
  39.                 State = 1;//return(1);                                                //An ACK was received

  40.         }
  41.         //
  42.         SDA_OUT;
  43.         //SCL = 0;
  44.         SCL_LOW;                                                        //Pull clock line low to prepare for next operation



  45.         return        (State);
  46. }
复制代码
现在发现如果第一个指令是写,接下来还是写的话IIC写函数倒数第四行哪儿需要切换一个IO方向,这样就没有毛刺了,但是这样的话在第一个指令是写,第二个是读的时候就会有毛刺。反过来也一样,反正在IO切换过程中可能会有毛刺。我打算把这个写函数分开或者加一个标识来防止这个毛刺,虽然感觉这个毛刺对时序没有影响。


 
 
 

回复

1488

帖子

2

TA的资源

纯净的硅(中级)

6
 
楼上回答挺专业
 
个人签名专业从事于在线监测振动、转速、轴振动、位移等,设备管理及故障检测振动诊断系统在线监测点巡检系统-现场动平衡仪-测振仪、便携式测振仪
 
 

回复

846

帖子

0

TA的资源

纯净的硅(中级)

7
 
楼主实际程序运行结果怎么样啊?不过毛刺的存在总是感觉怪怪的,你的防毛刺防止程序写好了没有?来共享一下学习学习?
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

8
 
lkl0305 发表于 2015-5-19 12:54
楼主实际程序运行结果怎么样啊?不过毛刺的存在总是感觉怪怪的,你的防毛刺防止程序写好了没有?来共享一下学习学习?

这个最好亲自试过在知道,我就是把这个函数分成两个了,启动IIC后的第一个指令肯定是写地址,如果接下来是输出(仍然是写指令),就在读函数里面最后把SDA设置成输出。如果接下来是输入(读指令),就不管了,因为在查询ACk信号的时候已经设置成输入了。
 
 
 

回复

846

帖子

0

TA的资源

纯净的硅(中级)

9
 
多谢楼主的指点,描述的非常清楚,回头的确要亲自试试,这样才能理解更加深刻
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

10
 
jishuaihu 发表于 2015-5-19 11:31
这个问题已经解决了。这个其实是昨天下班前的问题,刚才通过调整代码解决了。


IIC写代码

现在发现如果第一个指令是写,接下来还是写的话IIC写函数倒数第四行哪儿需要切换一个IO方向,这样就没有毛刺了,但是这样的话在第一个指令是写,第二个是读的时候就会有毛刺。反过来也一样,反正在IO切换过程中可能会有毛刺。我打算把这个写函数分开或者加一个标识来防止这个毛刺,虽然感觉这个毛刺对时序没有影响。

不管是主机还是从机,都在时钟上升沿(或者高电平期间)采样,在时钟低电平期间改变信号。

从你的图上看,毛刺全部出现在时钟低电平期间,出现这样的毛刺本来就是正常的,没有必要刻意去消除。

图中出现的毛刺对数据传输毫无影响。
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(初级)

11
 
说的真好
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

12
 
嗯,问题解决了就好啊。只是觉得,时钟信号,高电平的占空比比较小。一般时候,读I2C,高脉冲相对会宽一些。
 
 
 

回复

578

帖子

0

TA的资源

纯净的硅(初级)

13
 
毛刺位于时钟为低的时候,理论上是不会有什么影响的,但是看到楼主通过修改程序解决了,那当然是最好了,学习一下楼主的经验
 
个人签名刻苦学习,共同进步
 
 

回复

81

帖子

0

TA的资源

一粒金砂(中级)

14
 
本帖最后由 qiushenghua 于 2015-5-22 17:31 编辑
qiushenghua 发表于 2015-5-19 11:39
第一个毛刺应该是主机速度比从机快造成的,主机释放了SDA线,等待从机发送ACK/NACK,如果从机发送的是ACK,那么会重新拉低SDA。
间隔时间较短,在示波器上就体现为毛刺。
第二个毛刺是从机释放ACK信号,准备接收数据。恰好主机发送的第一位数据也是低,于是又见到毛刺了。只是,这回为何从机比主机快了?

分析能力真强。我就是遇到问题不会找问题。我用的是M4C129,与外接芯片DAC5571进行通信。做了详细注释,给我看看吧!


  1. SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1); //I2C1模块使能
  2. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
  3. GPIOPinConfigure(GPIO_PG0_I2C1SCL);//时钟线和数据线配置
  4. GPIOPinConfigure(GPIO_PG1_I2C1SDA);  
  5. GPIOPinTypeI2C(GPIO_PORTG_BASE,  GPIO_PIN_1);
  6. GPIOPinTypeI2CSCL(GPIO_PORTG_BASE, GPIO_PIN_0);
  7. I2CMasterEnable(I2C1_BASE);//使能I2C主机模块
  8. IntEnable(I2C_INT_MASTER);//历程好像都么有用中断,我只要通信就行,那种方式都可以,就先凑上了
  9. I2CMasterIntEnable(I2C1_BASE);
  10. IntMasterEnable();
  11. I2CMasterInitExpClk(I2C1_BASE, 40000000,false);   //传输速度100kbps
  12. I2CMasterSlaveAddrSet(I2C1_BASE,SLAVE_ADDRESS,false); //从机地址设置
  13. I2CMasterDataPut(I2C1_BASE, WRITE_ADDRESS); //我向数模转换器件DAC里写数据,用指定写入地址吗?
  14. I2CMasterControl(I2C1_BASE,I2C_MASTER_CMD_BURST_SEND_START);//发送一系列数据给DAC。
  15. while(I2CMasterBusy(I2C1_BASE));
  16. for(i = 0;i < DataNum;i++ )
  17.        {
  18.               I2CMasterDataPut(I2C1_BASE,DataTx);
  19.               i== DataNum - 1 ?
  20.               I2CMasterControl(I2C1_BASE,I2C_MASTER_CMD_BURST_SEND_FINISH):
  21.               I2CMasterControl(I2C1_BASE,I2C_MASTER_CMD_BURST_SEND_CONT);

  22.               while(I2CMasterBusy(I2C1_BASE));//到这主机一直忙,没法继续了。。。。。为什么啊
  23.        }
复制代码


好多疑问。我ARM做主机,DAC做从机。主机给从机发数据,我程序里不用写从机吧,只要像上面,把主机代码实现是不是就可以啊。从机应答自动?
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

15
 
应该会,这个是你软件来模拟的是吗?
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

16
 
huaiqiao 发表于 2015-5-22 17:37
应该会,这个是你软件来模拟的是吗?

嗯,后后来调整程序后毛刺只在SCL的低电平时才有,一开始的时候正好在切SCL的下降沿,所以有点儿不放心。不过根据IIC时序来看确实是不会有影响的
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

17
 
1301120345 发表于 2015-5-22 16:35
分析能力真强。我就是遇到问题不会找问题。我用的是M4C129,与外接芯片DAC5571进行通信。做了详细注释,给我看看吧!




好多疑问。我ARM做主机,DAC做从机。主机给从机发数据,我程序里不用写从机吧,只要像上面,把主机代码实现是不是就可以啊。从机应答自动?

刚刚看了一遍程序,没发现什么问题。对于库函数的操作我不大清楚,表面上看没啥问题。

建议上示波器/逻辑分析仪看波形,对于这种通信协议的东西,一抓图就一目了然了。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(中级)

18
 
qiushenghua 发表于 2015-5-23 00:15
刚刚看了一遍程序,没发现什么问题。对于库函数的操作我不大清楚,表面上看没啥问题。

建议上示波器/逻辑分析仪看波形,对于这种通信协议的东西,一抓图就一目了然了。

主机一直等待,会把时钟线拉低,暂停数据传输。用示波器什么也看不到啊.

我用的突发方式传输,我每发完一个字节,需要把主机改为接收模式等待应答吗?还是一等发完以字节就继续发送下一个啊
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表