历史上的今天
今天是:2025年04月02日(星期三)
2019年04月02日 | 计算模拟I2C的传输速率
2019-04-02 来源:eefocus
在编写I2C器件的驱动时,经常会看到手册中提及该器件的最高传输速率,如:

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

但模拟I2C的速率该如何计算?
首先一般I2C速率的单位是kbit/s,I2C传输速率的定义:每秒传输的比特位数。
先把代码贴出来(这里的代码在之前的日志中贴出来过):
#define I2C_DELAY() I2CSysCtlDelay(30) //! /* * @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/NACK I2C_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从机挂死分析和解决方法
史海拾趣
|
边干边学LabVIEW仪器控制——献给初入自动化测试领域的工程师 伟大的军事指挥官林彪把复杂的战术总结出了“一点两面”、“四快一慢”、“三三制”等,从田里、山里出来的战士们在这些浅显的道理面前,特别容易懂也特别容易用,这些浅显的战术道理,把四野铸就成了一支攻无不克,战无不胜的虎狼之师。 &n ...… 查看全部问答> |
|
正在学习AVR单片机C语言,想用单片机做一个小工具进行感应器触发时间采集和温度采集,时间最好能到ms级,存储数据格式为 2009-03-20-18:33:235, 23.4度, 每天有4000组数据,存在u盘上面(500)块,最终想做到用无线实时传输方式传 ...… 查看全部问答> |
|
欢迎使用我的产品,谢谢! 1. c8051f 单片机(c2 ,jtag)和at89s5x单片机(isp)二合一串口编程下载线,速度极快,支持3伏(c8051f 单片机),5伏(at89s5x单片机)电源,设计新颖,可靠稳定,成本低廉!!!目前通过实际验证可编程下载的芯片:c8051 ...… 查看全部问答> |
|
软件延时貌似就是执行空指令 那硬件延时又是整样的啊? 能给个8051的硬件延时图吗? 还有如果用硬件延时延时的话 #include #define uint unsigned int #define uchar unsigned char void dlms(void) { uint j; uint i; for( ...… 查看全部问答> |
|
Easy51单片机开发板支持Atmel AT89S51/52/53、STC89C51/52/53等多种标准51单片机,是集学习、实验、开发于一体的初学者快速入门套件,是嵌入式入门的最佳选择。 Easy51单片机开发板提供了键盘、数码管、蜂鸣器、液晶 ...… 查看全部问答> |
|
大家写久了HDL都希望自己写的代码能够有良好的重用性,最好只改变部分参数即可满足新的需求。在附件中的资料中介绍了Verilog-2001编写参数化模块的新方法,Verilog-2001在Q2和ISE中现在都是支持的,大家可以尝试下。… 查看全部问答> |




