2025-08-04 12:04:59

[STM32]

怎么根据时序参数确定IIC的延时啊

[复制链接]

6201|18

手机看帖扫描二维码随时随地手机跟帖

c834706901

当前离线

关注TA

发消息

13

主题29

帖子78

积分

初级技术员

初级技术员, 积分 78, 距离下一级还需 22 积分

初级技术员, 积分 78, 距离下一级还需 22 积分

积分78

在线时间31 小时

精华0

注册时间2018-11-18

最后登录2025-7-18

电梯直达

楼主

c834706901|

楼主

|

2018-11-18 23:04

|

只看该作者

|只看大图

|倒序浏览

|阅读模式

iic, 时序, ic, 读写

各位,我想知道怎么根据这些时序参数来确定IIC启动或者读写数据的时候延时多少啊,我看网上很多程序都是4us这个不适用吧

IIC2.png

(347.36 KB )

下载附件

2018-11-18 23:03 上传

IIC1.png

(389.78 KB )

下载附件

2018-11-18 23:03 上传

使用特权

评论回复

赏

标题置顶

标题高亮

点赞共0人点赞

相关下载

• 野火3.0突然没法用了是怎么回事啊?.mht

• 联想电脑不支持ghost怎么备份.pdf

• 时序电路的等价验证方法及其在FPGA中的应用.rar

• 基于FPGA的多路脉冲时序控制电路设计与实现.rar

• 异步时序逻辑电路

• 经典系统时序基础理论

• 时序电路的等价验证方法

• 同步时序逻辑电路

• 功能仿真平台构建及静态时序分析

相关帖子

• microchip单片机程序能在线升级吗?

• F2芯片SysTick老跳不准?

• LATTICE HW-USBN-2B 高速下载器VCC 如何供电

• SPI刷屏老出问题咋整?

• 【APM32F402R Micro-EVB开发板测评】3、硬件SPI驱动LCD

c834706901

当前离线

关注TA

发消息

13

主题29

帖子78

积分

初级技术员

初级技术员, 积分 78, 距离下一级还需 22 积分

初级技术员, 积分 78, 距离下一级还需 22 积分

积分78

在线时间31 小时

精华0

注册时间2018-11-18

最后登录2025-7-18

沙发

c834706901|

楼主

|

2018-11-18 23:17

|

只看该作者

有人教教我吗,教会我50元红包 加Q直接发

使用特权

评论回复

赏

点赞共0人点赞

ayb_ice

当前离线

关注TA

发消息

222

主题1万

帖子4万

积分

技术总监

技术总监, 积分 48243, 距离下一级还需 1757 积分

技术总监, 积分 48243, 距离下一级还需 1757 积分

积分48243

在线时间8097 小时

精华2

注册时间2006-7-16

最后登录2025-8-4

打赏0.00受赏10.00

板凳

ayb_ice|

|

2018-11-19 08:40

|

只看该作者

最简单的方法,高低电平各延时2US,读取数据时延时1US

使用特权

评论回复

赏

点赞共0人点赞

c834706901

当前离线

关注TA

发消息

13

主题29

帖子78

积分

初级技术员

初级技术员, 积分 78, 距离下一级还需 22 积分

初级技术员, 积分 78, 距离下一级还需 22 积分

积分78

在线时间31 小时

精华0

注册时间2018-11-18

最后登录2025-7-18

地板

c834706901|

楼主

|

2018-11-19 10:45

|

只看该作者

ayb_ice 发表于 2018-11-19 08:40

最简单的方法,高低电平各延时2US,读取数据时延时1US

你是怎么判断延时这么长时间的呢

使用特权

评论回复

赏

点赞共0人点赞

ayb_ice

当前离线

关注TA

发消息

222

主题1万

帖子4万

积分

技术总监

技术总监, 积分 48243, 距离下一级还需 1757 积分

技术总监, 积分 48243, 距离下一级还需 1757 积分

积分48243

在线时间8097 小时

精华2

注册时间2006-7-16

最后登录2025-8-4

打赏0.00受赏10.00

5楼

ayb_ice|

|

2018-11-19 11:39

|

只看该作者

c834706901 发表于 2018-11-19 10:45

你是怎么判断延时这么长时间的呢

上面不是写的

SCL高电平时间吗,最小0.6,可以大于这个时间,不可以小于这个时间,所以2US是合适的。。。

使用特权

评论回复

赏

点赞共0人点赞

ningling_21

当前离线

关注TA

发消息

5014

主题1万

帖子3万

积分

版主

积分39192

在线时间6622 小时

精华1

注册时间2009-4-8

最后登录2025-8-2

打赏9.18受赏530.10

6楼

ningling_21|

|

2018-11-19 11:54

|

只看该作者

c834706901 发表于 2018-11-18 23:17

有人教教我吗,教会我50元红包 加Q直接发

不能小于0.6US,可以大于

使用特权

评论回复

赏

点赞共0人点赞

c834706901

当前离线

关注TA

发消息

13

主题29

帖子78

积分

初级技术员

初级技术员, 积分 78, 距离下一级还需 22 积分

初级技术员, 积分 78, 距离下一级还需 22 积分

积分78

在线时间31 小时

精华0

注册时间2018-11-18

最后登录2025-7-18

7楼

c834706901|

楼主

|

2018-11-19 12:15

|

只看该作者

ayb_ice 发表于 2018-11-19 11:39

上面不是写的

SCL高电平时间吗,最小0.6,可以大于这个时间,不可以小于这个时间,所以2US是合适的。。。 ...

下面的sda保持时间和有效时间是什么意思是,有什么作用吗

使用特权

评论回复

赏

点赞共0人点赞

ningling_21

当前离线

关注TA

发消息

5014

主题1万

帖子3万

积分

版主

积分39192

在线时间6622 小时

精华1

注册时间2009-4-8

最后登录2025-8-2

打赏9.18受赏530.10

8楼

ningling_21|

|

2018-11-19 13:35

|

只看该作者

本帖最后由 ningling_21 于 2018-11-19 13:36 编辑

c834706901 发表于 2018-11-19 12:15

下面的sda保持时间和有效时间是什么意思是,有什么作用吗

保持时间:MCU输出数据到SDA线,并要维持该数据电平的时间长度有效时间:MCU输出的数据电平,能被外部器件识别到的时间长度,不在这个时间范围内可能识别不了

使用特权

评论回复

赏

点赞共0人点赞

雪山飞狐D

当前离线

关注TA

发消息

24

主题3812

帖子1万

积分

资深工程师

资深工程师, 积分 11903, 距离下一级还需 8097 积分

资深工程师, 积分 11903, 距离下一级还需 8097 积分

积分11903

在线时间5221 小时

精华1

注册时间2008-6-23

最后登录2024-2-15

9楼

雪山飞狐D|

|

2018-11-19 16:55

|

只看该作者

c834706901 发表于 2018-11-19 10:45

你是怎么判断延时这么长时间的呢

I2C 大部分器件是SCL 100K ,小部分高速是400K,为了通用,SCL频率要小于100K即可

使用特权

评论回复

赏

点赞共0人点赞

雪山飞狐D

当前离线

关注TA

发消息

24

主题3812

帖子1万

积分

资深工程师

资深工程师, 积分 11903, 距离下一级还需 8097 积分

资深工程师, 积分 11903, 距离下一级还需 8097 积分

积分11903

在线时间5221 小时

精华1

注册时间2008-6-23

最后登录2024-2-15

10楼

雪山飞狐D|

|

2018-11-19 17:02

|

只看该作者

本帖最后由 雪山飞狐D 于 2018-11-19 17:46 编辑

c834706901 发表于 2018-11-19 12:15

下面的sda保持时间和有效时间是什么意思是,有什么作用吗

SDA的保持时间是指I2C时钟进入到0电位时,MUC上数据SDA保持上一次的逻辑电平不改变的时间,以便I2C器件进行数据采样输入有一个稳定性

使用特权

评论回复

赏

点赞共0人点赞

雪山飞狐D

当前离线

关注TA

发消息

24

主题3812

帖子1万

积分

资深工程师

资深工程师, 积分 11903, 距离下一级还需 8097 积分

资深工程师, 积分 11903, 距离下一级还需 8097 积分

积分11903

在线时间5221 小时

精华1

注册时间2008-6-23

最后登录2024-2-15

11楼

雪山飞狐D|

|

2018-11-19 17:11

|

只看该作者

本帖最后由 雪山飞狐D 于 2018-11-19 17:14 编辑

c834706901 发表于 2018-11-19 12:15

下面的sda保持时间和有效时间是什么意思是,有什么作用吗

SDA 有效时间是指,当SLC时钟跳变成0电平时,I2C器件会在这个有效时间内进行逻辑电平跳变,输出下一个数据,你的数据手册上描述对象应该是指I2C本身器件的特性,按照这个特性给单片机适量的延迟就可以了,12周期的51单片机可能都不需要延迟,本身指令周期都是1uS 了,最好买个USB逻辑分析仪,边写边对着时序就容易调通了

使用特权

评论回复

赏

点赞共0人点赞

玄德

当前离线

关注TA

发消息

153

主题5968

帖子1万

积分

资深工程师

资深工程师, 积分 19125, 距离下一级还需 875 积分

资深工程师, 积分 19125, 距离下一级还需 875 积分

积分19125

在线时间3014 小时

精华3

注册时间2002-4-22

最后登录2025-8-3

打赏0.00受赏45.00

12楼

玄德|

|

2018-11-20 21:18

|

只看该作者

启动或者读写数据的时候延时多少

这句话是什么意思? 你究竟想知道什么参数?

使用特权

评论回复

赏

点赞共0人点赞

Prry

当前离线

关注TA

发消息

0

主题892

帖子2767

积分

初级工程师

初级工程师, 积分 2767, 距离下一级还需 233 积分

初级工程师, 积分 2767, 距离下一级还需 233 积分

积分2767

在线时间1200 小时

精华0

注册时间2017-3-12

最后登录2025-7-20

打赏0.00受赏7.00

13楼

Prry|

|

2018-11-21 00:26

|

只看该作者

将时序抽象出来,方便移植。一般i2c器件都是标准400K,用100K基本通用所有器件。

参考:

https://blog.csdn.net/qq_20553613/article/details/78878211

使用特权

评论回复

赏

点赞共0人点赞

qinlu123

当前离线

关注TA

发消息

187

主题2097

帖子6346

积分

高级工程师

高级工程师, 积分 6346, 距离下一级还需 1654 积分

高级工程师, 积分 6346, 距离下一级还需 1654 积分

积分6346

在线时间1279 小时

精华2

注册时间2014-4-24

最后登录2025-8-4

14楼

qinlu123|

|

2018-11-21 10:17

|

只看该作者

让IIC一直发用示波器看着SCL和SDA调就行了,计算+实验。

使用特权

评论回复

赏

点赞共0人点赞

c834706901

当前离线

关注TA

发消息

13

主题29

帖子78

积分

初级技术员

初级技术员, 积分 78, 距离下一级还需 22 积分

初级技术员, 积分 78, 距离下一级还需 22 积分

积分78

在线时间31 小时

精华0

注册时间2018-11-18

最后登录2025-7-18

15楼

c834706901|

楼主

|

2018-11-23 09:07

|

只看该作者

玄德 发表于 2018-11-20 21:18

启动或者读写数据的时候延时多少

这句话是什么意思? 你究竟想知道什么参数?

我就是想知道delay(4) delay(2)这些延时是怎么得出来的

使用特权

评论回复

赏

点赞共0人点赞

玄德

当前离线

关注TA

发消息

153

主题5968

帖子1万

积分

资深工程师

资深工程师, 积分 19125, 距离下一级还需 875 积分

资深工程师, 积分 19125, 距离下一级还需 875 积分

积分19125

在线时间3014 小时

精华3

注册时间2002-4-22

最后登录2025-8-3

打赏0.00受赏45.00

16楼

玄德|

|

2018-11-23 14:33

|

只看该作者

一定要先搞明白:

这个时间是芯片自己的行为,还是芯片对你的要求。这很重要。

比如 tsu 这个参数,它是 对“Data In”的规定,所以是对外界、对工程师的要求,

你操作芯片时必须满足这个要求,芯片才能正常接受你的数据。

最小值是 100ns ,意思是:

你在发出 SCL 的上升沿之前,必须把数据的值提前放在 SDA 线上,而且至少提前 100ns;

芯片只关心最小值,所以没有给出最大值,你提前比如 200ns、300ns、1000ns 甚至 1 秒都可以。自己看情况,选个合适的数。

比如 tvd:

这是芯片自身的行为, SCL 的下降沿是“你”提供的,芯片将在这个时间里,把内部数据放在 SDA 线上;

在这个时间内,芯片不能保证 SDA 的数据是正确的;

所以,工程师要在这个时间以后再读取 SDA 的数值。

按说,这个值只会给出最大值。很显然,只有最大值才有意义。

使用特权

评论回复

赏

共1人点赞

雪山飞狐D

当前离线

关注TA

发消息

24

主题3812

帖子1万

积分

资深工程师

资深工程师, 积分 11903, 距离下一级还需 8097 积分

资深工程师, 积分 11903, 距离下一级还需 8097 积分

积分11903

在线时间5221 小时

精华1

注册时间2008-6-23

最后登录2024-2-15

17楼

雪山飞狐D|

|

2018-11-24 12:30

|

只看该作者

c834706901 发表于 2018-11-23 09:07

我就是想知道delay(4) delay(2)这些延时是怎么得出来的

图片是24CXX的中文数据手册,可以看到,只有电压在5V时,24C系列才能达到400K的时钟速率,2.5V 左右的速率只有100K,IO模拟的时序只有按照100K的速率去写,才能保证兼容,而这个I2C的程序模块可以兼容400K的器件,所以才会出现delay4 us......

QQ图片20181124122237.png

(312.58 KB )

下载附件

2018-11-24 12:27 上传

使用特权

评论回复

赏

点赞共0人点赞

雪山飞狐D

当前离线

关注TA

发消息

24

主题3812

帖子1万

积分

资深工程师

资深工程师, 积分 11903, 距离下一级还需 8097 积分

资深工程师, 积分 11903, 距离下一级还需 8097 积分

积分11903

在线时间5221 小时

精华1

注册时间2008-6-23

最后登录2024-2-15

18楼

雪山飞狐D|

|

2018-11-25 19:45

|

只看该作者

本帖最后由 雪山飞狐D 于 2018-11-26 01:34 编辑

复制#include "stc15f2k60s2.h"

#include

#include "Delay.h"

#include "I2C.h"

void Start_I2c(void);

void Stop_I2c(void);

unsigned char I2c_wait_ack(void);

void Ack_I2c(void);

void Nack_I2c(void);

void SendByte(unsigned char );

unsigned char RcvByte();

//起动总线函数

//Start_I2c();

//功能:启动I2C总线,即发送I2C起始条件.

void Start_I2c()

{

SCL=1;

Delay5us(); //tSU:STA

SDA=0; //发送起始信号

Delay5us(); //tHD:STA

SCL=0; //条件保持SCL处于0状态才能进行写入

}

//结束总线函数

//Stop_I2c();

//功能:结束I2C总线,即发送I2C结束条件.

void Stop_I2c()

{

SCL=0;

SDA=0;

Delay5us(); //tSU:STO

SCL=1; //结束条件建立时间大于4μs

Delay5us(); //tBUF总线空闲时间大于4.7us

SDA=1; //发送I2C总线结束信号

}

//等待应答信号到来

//返回值:1,接收应答失败

// 0,接收应答成功

u8 I2c_wait_ack(void)

{

u8 Time=0;

SCL=0;

SDA=1; //准备接收应答位

Delay5us(); //tAA tLOW

SCL=1;

Delay5us(); //tHIGH

while(SDA)

{

Time++;

if(Time>250)

{

Stop_I2c();

return 1; //超时检测无应答返回1

}

}

SCL=0; //时钟输出0

return 0; //有应答返回0

}

复制

//字节数据发送函数

//SendByte(u8 DAT);

//功能: 将数据DAT发送出去,可以是地址,也可以是数据

void SendByte(u8 DAT)

{

u8 i=0;

SCL=0;

for(i=0;i<8;i++) //要传送的数据长度为8位

{

if((DAT<

{

SDA=1; //判断发送位 发送是由高位开始发送

}

else

{

SDA=0;

}

Delay5us();

SCL=1; //置时钟线为高,通知被控器开始接收数据位

Delay5us();

SCL=0; //出函数保持SLC=0

_nop_(); //tHD 数据输出保持时间0ns

}

}

//功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),

//发完后请用应答函数应答从机。

u8 RcvByte()

{

u8 Dat=0;

u8 i=0;

for(i=0;i<8;i++)

{

SCL=0; //置时钟线为低,准备接收数据位

_nop_(); //tDH从器件数据输出保持时间100ns

SDA=1; //释放总线准备接收数据位

Delay5us();

SCL=1; //置时钟线为高使数据线上数据有效

Dat<<=1; //最后一位不需要移位,所以移位放在此处

if(SDA==1)

{

Dat|=0x01; //读数据位,接收的数据位放入Dat中

}

Delay5us();

}

SCL=0; //出函数保持SLC=0

_nop_(); //tDH从器件数据输出保持时间100ns

return Dat;

}

//应答子函数

//主机应答

void Ack_I2c(void)

{

SCL=0;

SDA=0;

Delay5us();

SCL=1;

Delay5us();

SCL=0; //清时钟线,钳住I2C总线以便继续接收

}

//主机不应答

void Nack_I2c(void)

{

SCL=0;

SDA=1;

Delay5us();

SCL=1;

Delay5us();

SCL=0;

}

复制 /*************************此部分为AT2402的驱动程序使用I2C总线连接*************************************/

#include "stc15f2k60s2.h"

#include "Delay.h"

#include "24C04.h"

#include "I2C.h"

//24c 默认的硬件地址都是 0xa0 即 1010 然后A2 A1 A0 最后一位 为读写位 1读 0写

//24c02 256x8 bit

//24c04 512x8 bit

//而子地址 只是8位的 即最大也就256个字节 那么24c04 就要占用2个256个字节

//这里24c04硬件上采用的是 分页方法 即有24c02里有A2 A1 A0 当是24c04时 A0做为分页位

//当A0为0 表示第一页 写入第一页256字节

//当A0为1 表示第二页 写入第二页256字节

//在AT24CXX指定地址读出一个数据

//Addr:开始读数的地址

//返回值 :读到的数据

u8 AT24C_Rcvone(u8 Addr)

{

u8 temp=0;

Start_I2c(); //启动总线

SendByte(0xa0); //发送器件I2C地址,写模式

I2c_wait_ack(); //等待应答

SendByte(Addr); //发送器件存储地址

I2c_wait_ack(); //等待应答

Start_I2c(); //重新启动总线

SendByte(0xa1); //设置为读操作

I2c_wait_ack(); //等待应答;

temp=RcvByte(); //读字节

Nack_I2c(); //非应答

Stop_I2c(); //结束总线

return temp;

}

//在AT24CXX指定地址写入一个数据 此函数只限于 c02-c16

//Addr:写入数据的目的地址

//Data:要写入的数据

void AT24C_Sendone(u8 Addr,u8 Data)

{

Start_I2c(); //启动总线

SendByte(0xa0); //发送写命令

I2c_wait_ack(); //等待应答

SendByte(Addr); //发送地址

I2c_wait_ack(); //等待应答

SendByte(Data); //发送字节数据

I2c_wait_ack(); //等待应答

Stop_I2c(); //结束总线

Delay10ms(); //tWR 周期,等待I2C器件写完毕

}

楼主搞定了没,你对着我严格按datasheet写24C04的100K SCL程序,注意红色的标注的地方,不同器件参数不太一样,要全部通用的话可以统一延迟为1us, 那么就可以对应上你的器件上的最大900ns

QQ图片20181125194220.png

(368.08 KB )

下载附件

2018-11-25 19:43 上传

捕获.PNG

(271.65 KB )

下载附件

2018-11-25 19:48 上传

使用特权

评论回复

赏

点赞共0人点赞

天风立马

当前离线

关注TA

发消息

12

主题314

帖子1036

积分

助理工程师

助理工程师, 积分 1036, 距离下一级还需 964 积分

助理工程师, 积分 1036, 距离下一级还需 964 积分

积分1036

在线时间236 小时

精华1

注册时间2011-5-6

最后登录2022-11-26

19楼

天风立马|

|

2018-12-2 13:29

|

只看该作者

本帖最后由 天风立马 于 2018-12-2 13:32 编辑

我喜欢追渔的人. 去找我QQ, 你应该能找到. 我教你, 不收费. 你也可以去下载我之前分享的一个资料自己学.

使用特权

评论回复

赏

点赞共0人点赞

Copyright © 2088 英式橄榄球世界杯_世界杯女篮 - tylpr.com All Rights Reserved.
友情链接