在编写I2C器件的驱动时,经常会看到手册中提及该器件的最高传输速率,如:

而在配置寄存器实现I2C中也是需要配置I2C的传输速率,如:

但模拟I2C的速率该如何计算?

首先一般I2C速率的单位是kbit/s,I2C传输速率的定义:每秒传输的比特位数。
先把代码贴出来(这里的代码在之前的日志中贴出来过):

#define I2C_DELAY()  I2CSysCtlDelay(30)  //!<I2C速率约为237Kb/s(若为40,则速率约为178Kb/s)/** @brief  SysCtlDelay* @param  ulCount 延时值,必须大于0* @retval (3/(120M))s = 40MHz*/
void I2CSysCtlDelay(unsigned long ulCount)
{__asm("    subs    r0, #1\n""    bne.n   I2CSysCtlDelay\n""    bx      lr");}/*!*  @brief   I2C1起始信号*  @param  none*  @return none*  @note   数据:D  时钟:C  高:H  低:L  输出:O  输入:I  延时:_*  @note DOCO_DHCH_DL__CL*/
void I2C1_Start(void)
{I2C1_SDA_OUT(); I2C1_SCL_OUT(); I2C_DELAY();I2C1_SDA_H();  I2C1_SCL_H(); I2C_DELAY();  I2C1_SDA_L();I2C_DELAY();I2C_DELAY();I2C1_SCL_L();
}/*!*  @brief  I2C1结束信号*  @param  none*  @return none*  @note   数据:D  时钟:C  高:H  低:L  输出:O  输入:I  延时:_*  @note DOCO_DLCL_CH___DH__*/
void I2C1_Stop(void)
{I2C1_SDA_OUT(); I2C1_SCL_OUT();I2C1_SDA_L();  I2C1_SCL_L(); I2C_DELAY();I2C1_SCL_H();I2C_DELAY();  I2C_DELAY();I2C_DELAY();I2C1_SDA_H();I2C_DELAY();I2C_DELAY();
}/*!*  @brief  主机向I2C1总线发送一个字节*  @param   data:数据*  @return  0:失败  1:成功*  @note 数据:D  时钟:C  高:H  低:L  输出:O  输入:I  延时:_  读取:R*  @note   (_DH/L_CH__CL)*8_DHDI_CH_DR_CL_DO*/
uint8 I2C1_Send_byte(uint8 data)
{uint8 k;for(k=0;k<8;k++){//!<发送8bit数据I2C_DELAY();if(data&0x80){I2C1_SDA_H();}else{I2C1_SDA_L();}data=data<<1;I2C_DELAY();I2C1_SCL_H();I2C_DELAY();I2C_DELAY();I2C1_SCL_L();}I2C_DELAY();//!<延时读取ACK响应I2C1_SDA_H();I2C1_SDA_IN();//!<设为输入I2C_DELAY();I2C1_SCL_H();   I2C_DELAY();k=I2C1_SDA_READ();//读取ACK/NACKI2C_DELAY();I2C1_SCL_L();I2C_DELAY();I2C1_SDA_OUT();if(k){ NACK响应return 0;}return 1;
} 

我们计算的方法是:首先计算模拟I2C发送一个字节所需要多长时间,之后除以8,以算出发送一位需要多长时间。

由于寄存器操作的时间可忽略不计,故主要计算其中的延时时间。
在开始信号 start()中,含有 4个delay,设1个delay占用的时间为n(之后再计算),则一个start()占用4n。
在停止信号stop()中,含有 6个delay,则一个stop()占用6n。
发送一个字节中有 8* 4n+5n,占用37n。

一般最简单的I2C时序是,开始->发送一个字节->结束,故发送一个字节的总时间为47n.

然后准备计算n,一个delay函数执行一次需要三个时钟周期,当前使用的时钟为120M,故执行一个delay占用[1/(40M)]s,
所以  I2CSysCtlDelay(30)所占用3/4 us.

综上,发送一个字节所需要 35.25us=141/4 us,1bit需要141/32 us,所以I2C的发送速率为32/141 Mbit/s ≈227kbit/s
同理可以算出接收速率,然后选一个较小值,就可以当做当前模拟I2C的速率,注意这里的值也是大致的值,做参考。

另外若不清楚当前使用的时钟是否确为120M,可以使用以下简单暴力的方法哦:

在main函数中,采用点灯计时:

while(1)
{I2CSysCtlDelay(1000*10000);LED_ON();I2CSysCtlDelay(1000*10000);LED_OFF();
} 

通过计时,LED灯亮灭十下约为5s。
故函数执行一次,所用的时间为5/10/(1000*10000*2)  = 1/(40M) s
 所以时钟周期为 1/(40M)/3 = 1/(120M)s,所以时钟频率为120M

计算模拟I2C的传输速率相关推荐

  1. linux下IO口模拟I2C的一些总结

    2019独角兽企业重金招聘Python工程师标准>>> 以前一直在用I2C接口,因为总是有线程的例子就一直没有去深入的了解,今天分析了一下在linux下通用GPIO模拟I2C的程序. ...

  2. S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动

    目录:一. 说明 二. 驱动程序说明及问题 三. 案例一       四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...

  3. STM32 通用GPIO模拟I2C实现

    STM32 通用GPIO模拟I2C实现 通用GPIO模拟I2C通信实现样例 1 GPIO初始化 #ifdef HW_I2C1 //硬件I2C初始化//PA8-I2C1_SCLGPIO_StructIn ...

  4. stm32_GPIO模拟I2c读写EEPROM

    /* 下面给出STM32通过GPIO模拟I2C读写EEPROM程序 */ #define SCL_H GPIOB->BSRR = GPIO_Pin_6 #define SLC_L GPOIB-& ...

  5. 【龙芯1c库】封装模拟I2C接口和使用示例

    龙芯1c库是把龙芯1c的常用外设的常用功能封装为一个库,类似于STM32库.Git地址:https://gitee.com/caogos/OpenLoongsonLib1c I2C接口是常用的接口之一 ...

  6. STM32快速读写AT24C16 代码 模拟I2C

    本帖只适用AT24C16及以下的芯片,AT24C32及以上的芯片读写方式不一样,故不适用!!! 如果你的代码可以正常读写24C01/02,直接拿来读取24C16是可以的,但是只能读取256字节. AT ...

  7. STM32模拟I2C协议获取MLX90615红外温度传感器测温数据(Open Drain管脚配置)

    STM32模拟I2C协议获取MLX90615红外温度传感器测温数据(Open Drain管脚配置) STM32的GPIO管脚可以配置为Open Drain输出模式,并且有两个功能: 可以设置内部上拉, ...

  8. 遇事不决,量子力学:谷歌量子计算模拟化学反应登上Science封面

    视学算法报道 编辑:张倩.杜伟 转载自公众号:机器之心 原子和分子是受量子力学控制的系统,用量子计算模拟化学反应,或许是最好的方法. 去年 10 月,谷歌宣布实现「量子优越性」的论文登上了<自然 ...

  9. GPIO模拟I2C程序实现

    GPIO模拟I2C程序实现. I2C是由Philips公司发明的一种串行数据通信协议,仅使用两根信号线:SerialClock(简称SCL)和SerialData(简称SDA).I2C是总线结构,1个 ...

最新文章

  1. ansible自动化运维(三)——Playbook实战
  2. 苹果电脑怎么设置佳博标签打印机_热销斑马标签打印机恢复出厂设置的方法
  3. android+5.0+ble,android5.0(Lollipop) BLE Peripheral牛刀小试(示例代码)
  4. atom 安装 xdebug 调试 php 代码
  5. 在Linux以及Mac OS X启用F#
  6. DELL电脑自检代码错误提示含义
  7. 解决Linux里面未启用网卡的问题
  8. Drupal的登陆用户Cache功能
  9. 兔子未来的方向在哪里
  10. H5 video 播放器demo代码
  11. 计算机硬件专业实习日志,计算机维护实习日记总汇
  12. 2018-2019赛季多校联合新生训练赛第三场题解和补题(中石油)
  13. Java | Comparable接口和Comparator接口比较
  14. 【c++程序】求解一元二次方程
  15. 4.网络配置与系统管理
  16. activiti-api-impl
  17. Apache poi如何在word中的表格中插入表格,图片等操作
  18. 三消游戏的一个重要帮助函数
  19. APM飞控学习之路:3 APM系统介绍与开发环境搭建
  20. 【实践】随机森林算法参数解释及调优(含Python代码)

热门文章

  1. Non-local:用于捕获长距离依赖关系
  2. 猿人学第五题上---代码
  3. html5 舰c 手机,我国最新款导弹驱逐舰052D,主力战舰的不二之选,中国厉害了!...
  4. python 制作正态分布图,画出拒绝域
  5. 基于JAVA环巢湖区域旅游网站计算机毕业设计源码+数据库+lw文档+系统+部署
  6. 谈谈登录注册的如何实现
  7. mysql水平拆分查询_MYSQL水平拆分与垂直拆分
  8. 培育共识信用土壤 起航数字经济海洋
  9. 计算机用户怎么配置漫游,Windows下漫游用户配置和强制漫游用户配置详细过程...
  10. 信道检测手机软件 ios_3.2、《无线通信基础》--点对点通信:检测、分集与信道的不确定性--时间分集...