I2C上升沿时间过长过缓解决办法

关于I2C,对于硬件工程师来说,属于低速信号,一般也不会有什么问题,最常见的问题也就是在测试信号质量时发现I2C的上升沿过缓,不符合I2C的标准,那么一般如何解决呢?

先看下图信号要求(来自I2C标准协议)

 

如上图,I2C分为标准模式和快速模式

标准模式通信速率最大是100Khz,上升沿最大是1000ns,bus电容最大400pF

快速模式通信速率最大是400kHz,上升沿最大是300ns,bus电容最大400pF

I2C 总线上数据的传输速率在标准模式下可达 100kbit/s 在快速模式下可达 400kbit/s。 

上拉电阻取值范围来龙去脉:

1、I2C上拉电阻的下限有一个计算公式:

Rmin={Vdd(max)-0.4V}/3mA  (根据协议,vdd为电源的最大值,Vmax=1.1*Vdd,3mA为驱动最大电流为3mA)

在电源为1.8V时:Rmin=527Ω

在电源为3.3V时:Rmin=1.07K

在电源为5V时:Rmin=1.7K

那上拉电阻的上限如何确定呢?
首先我们需要明白上升沿的时间是如何来的。I2C的总线结构如下图,是一个漏极开路的结构。也就是说SDA/SCL由低电平变到高电平,是通过关闭MOS管,通过Rp上拉到电源。

 

而I2C总线上接入设备时,肯定是会引入电容的,接的设备越多,引入的电容也越多。所以输出高电平的过程,实际上是一个RC充电的电路,如下图,电源Vdd通过上拉电阻Rp对负载电容Cb充电的过程。

 

电平有0.1Vdd充到0.9Vdd(上升沿)的时间计算公式

Tr= RC*Ln[(Vdd-0.1Vdd)/(Vdd-0.9Vdd)]

Tr=2.2RC

标准模式:由Tr<1000ns 得 R<1000ns/2.2C

快速模式:由Tr<300ns 得 R<300ns/2.2C

不同电路,C的值肯定是不同的,所以要根据实测信号上升沿来确定。

注意:协议中最大电阻与负载电容的曲线,对应Tr是很宽松的,应是取的Tr为0.3Vdd上升到0.7Vdd的时间(协议中低电平门限0.3Vdd,高电平门限0.7Vdd),可能与上述公式有些出入,上述公式取的是0.1Vdd上升到0.9Vdd。

综上所述,如果我们发现I2C的上升沿过缓,可以通过减小上拉电阻Rp来实现,但不应超过对应的Rmin;或者降低总线电容(减少总线上的设备数量);最后还可以通过增加器件来实现(详见I2C标准协议第41页)


 

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果在Vue中使用html2canvas进行截图时遇到时间过长的问题,可以尝试以下方法来解决: 1. 添加延时:在循环截图的过程中,可以在每次截图之间添加一定的延时,以降低截图的频率,从而减少总体的截图时间。可以使用setTimeout方法来实现延时。 ```javascript async function captureScreenshots() { const container = document.getElementById('screenshot-container'); // 替换为你需要截图的容器元素ID const screenshots = []; for (let i = 0; i < 10; i++) { // 循环次数,根据实际需求修改 await new Promise((resolve) => { setTimeout(resolve, 1000); // 每次截图之间的延时时间,根据实际需求修改 }); const canvas = await html2canvas(container); screenshots.push(canvas.toDataURL('image/png')); // 在这里可以将截图结果进行处理,比如保存到本地或者发送到服务器 // ... console.log(`截图${i + 1}完成`); } console.log('所有截图完成'); } // 调用函数开始循环截图 captureScreenshots(); ``` 在上述代码中,通过使用setTimeout方法,在每次截图之间等待1秒钟的延时。 2. 分批截图:如果循环截图的次数过多,可以考虑将截图任务分批进行,以避免一次性截图过多导致的时间过长问题。可以根据实际需求,将截图任务分成多个小批次进行循环截图。 ```javascript async function captureScreenshots() { const container = document.getElementById('screenshot-container'); // 替换为你需要截图的容器元素ID const screenshots = []; const batchSize = 5; // 每批次截图的数量,根据实际需求修改 for (let i = 0; i < 10; i += batchSize) { // 循环次数和每批次数量,根据实际需求修改 await new Promise((resolve) => { setTimeout(resolve, 1000); // 每批次截图之间的延时时间,根据实际需求修改 }); const batchScreenshots = await Promise.all( Array.from({ length: batchSize }, (_, index) => html2canvas(container) ) ); screenshots.push(...batchScreenshots.map((canvas) => canvas.toDataURL('image/png'))); // 在这里可以将每批次的截图结果进行处理,比如保存到本地或者发送到服务器 // ... console.log(`第${i + 1}批次截图完成`); } console.log('所有截图完成'); } // 调用函数开始循环截图 captureScreenshots(); ``` 在上述代码中,通过设置`batchSize`参数来指定每批次截图的数量,然后使用Promise.all方法将每批次的截图任务同时进行,以提高截图效率。 希望以上方法能够帮助您解决Vue中使用html2canvas截图时间过长的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值