打印

I2C波形上的SPIKE

[复制链接]
2845|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CPU上的I2C托3个从设备(3个器件,只能作为设备),发现SDA波形(黄色方波)上会有一些尖峰脉冲,目前对功能的实现没有影响,但是还是想将这个处理掉,不知道原因,望大家赐教。硬件上就是单纯的2根线,上拉电阻目前使用的是2K,中途更换为4.7K无效果。

相关帖子

沙发
cool_coder| | 2014-2-10 13:24 | 只看该作者
都是对齐到时钟下降沿的,确实不会对功能造成影响。这些尖峰都和时钟下降沿有明确的对应关系,应该不难查。

使用特权

评论回复
板凳
tyw| | 2014-2-10 13:37 | 只看该作者
本帖最后由 tyw 于 2014-2-10 14:03 编辑

检测到时钟边沿后适当延时(做几个nop空操作)再读写数据试试.下例是I/O口模拟的SCL,用于读写HT2201 E2Prom,供参考.

;**********************
;* ◆字节读出子程序◆ *
;* 出口: A←读出内容  *
;**********************
RBYTE:          SET     SCL             ;时钟脚_/ ̄
                SET     SDA_C           ;定义数据脚为输入口
                MOV     A,08H
                MOV     DATA_8,A        ;设传输数据长度8
RBYTE1:         SET     SCL             ;时钟脚_/ ̄
                NOP
                NOP
                NOP
                NOP
                NOP                     ;延时
                CLR     SCL             ;时钟脚 ̄\_
                NOP
                NOP
                NOP
                NOP
                NOP                     ;延时
                RL      READ_OUT        ;读出数据字节左环移一位,准备下一位数据
                CLR     READ_OUT.0      ;读入数据字节最低位←"0" (从低位到高位)
                SZ      SDA             ;检查数据线状态,="0"?                 
                SET     READ_OUT.0      ;≠"0",则读入数据字节最低位←"1"
                SDZ     DATA_8          ;数据长度减一,并检查是否为"0"
                JMP     RBYTE1          ;≠"0",转RBYTE1循环
                MOV     A,READ_OUT      ;A←读出内容
                RET

;**********************
;* ◆字节写入子程序◆ *
;* 入口: A←待写内容  *
;**********************
WBYTE:          MOV     BYTE_DAT,A      ;待写内容暂存于A
                CLR     SCL             ;时钟脚 ̄\_
                CLR     SDA_C           ;定义数据脚为输出口
                MOV     A,08H
                MOV     DATA_8,A        ;预置写入数据长度计数器
WBYTE1:         CLR     SDA             ;数据脚←"0"
                SZ      BYTE_DAT.7      ;检查待写内容最高位=?
                SET     SDA             ;最高位≠"0",则数据脚←"1"
                SET     SCL             ;时钟脚_/ ̄\_ ,发送当前数据位
                CLR     SCL
                RL      BYTE_DAT        ;待写内容字节左环移一位,准备下一位数据
                SDZ     DATA_8          ;写入数据长度减一,并检查是否为"0"
                JMP     WBYTE1          ;≠"0",转WBYTE1循环
                SET     SDA_C           ;定义数据脚为输入口
                SET     SCL             ;时钟脚_/ ̄,CPU准备收2201的应答信号
WBYTE2:         SZ      SDA             ;检查数据脚状态
                JMP     WBYTE2          ;≠"0",转WBYTE2,等待应答信号
                RET

使用特权

评论回复
地板
legend_yuan|  楼主 | 2014-2-13 18:03 | 只看该作者
tyw 发表于 2014-2-10 13:37
检测到时钟边沿后适当延时(做几个nop空操作)再读写数据试试.下例是I/O口模拟的SCL,用于读写HT2201 EProm,供 ...

这个直接是CPU里面的I2C控制器在操作,不是用GPIO模拟出来的,我只能设置寄存器,但是貌似I2C控制器寄存器无相关设置

使用特权

评论回复
5
flylike| | 2014-2-13 18:20 | 只看该作者
尝试过加电容了么?在I2C的每个脚上加下拉电容,可以滤除噪声,一般标准设计是上拉电阻(看有多少个外设)1K-4.7K不等,串联电阻33R-100R,下拉电容33pF-100pF

使用特权

评论回复
6
legend_yuan|  楼主 | 2014-2-14 17:14 | 只看该作者
flylike 发表于 2014-2-13 18:20
尝试过加电容了么?在I2C的每个脚上加下拉电容,可以滤除噪声,一般标准设计是上拉电阻(看有多少个外设)1 ...

这个应该是治标不治本的方法,还是想从根源上处理这个问题,而且感觉pF级的电容对这种脉宽的spike应该是没有抵抗力的吧。一切工作都正常,就是波形不正常

使用特权

评论回复
7
flylike| | 2014-2-17 13:37 | 只看该作者
我觉得PF级别的电容对这些脉冲应该有很好的抑制功能。因为我们经常在机顶盒的接口处接上PF级别的电容用来防止ESD。一切都工作正常也是情理之中,因为读数是在CLK为高电平的时候去读DATA(不论是模拟I2C的还是硬件I2C的都会有延时读数----也就是信号稳定的时候去读数),看你的波形都在CLK的下降沿有脉冲。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

303

帖子

0

粉丝