打印

I2C从初始化到稳定接收数据要多少时间

[复制链接]
6072|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fangui|  楼主 | 2009-2-2 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2C和DMA从初始化到稳定接收数据要多少时间?跟系统时钟的关系如何?比如我的系统时钟是36M和72M有什么区别么?找不到具体资料,哪位有这方面的知识告诉在下,不胜感激!
沙发
lut1lut| | 2009-2-2 17:12 | 只看该作者

lz是说用DMA的方式进行I2C的接收吧

如果是作为I2C主设备,初始化后,自己发送了从设备地址得到应答后开始接收收据;

如果是作为I2C从设备,也要等到总线上的地址和自己匹配了,才开始接收数据。

没有特定的一个时间间隔吧。毕竟不像有些外设,初始化好立马开始数据传输,也许需要初始化后等一下;I2C还有一个起始位+地址+应答的阶段啊。

使用特权

评论回复
板凳
香水城| | 2009-2-2 17:32 | 只看该作者

STM32的I2C结束初始化后立刻即可以稳定地进行数据传输(收或

所有STM32的内置外设在初始化后都不需要任何稳定时间,立刻就可以开始正常的操作。只有振荡器和PLL在启动之后需要一定的稳定时间。

使用特权

评论回复
地板
lut1lut| | 2009-2-2 17:39 | 只看该作者

好像STM32的can要等一下哎

使用特权

评论回复
5
fangui|  楼主 | 2009-2-2 17:42 | 只看该作者

DMA+I2C作为从设备

您的意思是这个间隔取决于主机的时序咯?初始化之后,如果主机发送了起始位+地址,从机接收应答后就可以收数据了么?这种情况从机可不可以接收到数据呢:
在主机发送了起始位+地址,从机接收应答后接收了一部分数据后,紧接着从机初始化DMA和I2C,那主机后续发的数据和结束位从机还能不能收到呢?

使用特权

评论回复
6
lut1lut| | 2009-2-2 17:54 | 只看该作者

I2C从设备利用DMA方式接收

首先,主机发送起始位+地址,随后对这个地址的应答是丛机发的,不是“从机接收应答后就可以收数据了”

丛机先收了一部分收据,然后“紧接着从机初始化DMA和I2C”是什么意思呢?是要改变DMA的destination,还是buffersize之类的?I2C为什么又要重新初始化呢。能把这个应用环境说一下么?

使用特权

评论回复
7
fangui|  楼主 | 2009-2-2 18:08 | 只看该作者

I2C的应用环境

I2C的应用环境一时也说不清楚,楼上的可不可以留下个QQ或者电话之类的,可以和您私下聊!

使用特权

评论回复
8
香水城| | 2009-2-2 18:26 | 只看该作者

LZ如果对I2C的工作过程有疑问,最好去看看I2C的协议

如果对如何使用STM32的I2C模块有疑问,可以具体地提出来,我们一起讨论;你还可以下载发表过的例子和函数库,通过程序的实现,更好地理解如何使用STM32。
相关链接:https://bbs.21ic.com/club/bbs/showEssence.asp?id=10188&page=1

使用特权

评论回复
9
fangui|  楼主 | 2009-2-2 19:28 | 只看该作者

还有个疑问

I2C的协议是看了的,关键不是对I2C协议的不理解,是对stm32的实现机制有一些疑问而已,我现在想问个问题就是:DMA_GetCurrDataCounter在I2C使用DMA方式的时候作为从机是判断停止位后它的数值才会变,还是在主机发送起始位+地址后发再数据,从机的DMA一接收到数据DMA_GetCurrDataCounter的值就会变而不等停止位呢?简而言之,GetCurrDataCounter在I2C的数据传输过程中什么情况下才会变化?

使用特权

评论回复
10
香水城| | 2009-2-2 21:24 | 只看该作者

在每个RxNE事件后,DMA数据计数寄存器将被递减

请看STM32参考手册中有关的片断:

使用特权

评论回复
11
lut1lut| | 2009-2-3 10:12 | 只看该作者

RxNE事件后,硬件自动会按DMA配置的那样

1.
把I2C的DR中的内容放到预先指定的内存区域;同时CNDTR自减一次。

比如利用DMA接收10个数据,每收到一个数据,CNDTR自减一次,跟stop位有什么关系,stop位要10个数据接收完后才出现在总线上啊。

2.
使用DMA方式进行从设备的接收,有个通信长度的问题。

最简单的就是从设备本来就知道一次通信有几个数据要接收,于是在DMA初始化时便可以设定好。

如果从设备并不知道每次通信有几个数据,只能把DMA的BufferSize放到最大,好像是64K,但是需要打开ITEVTEN中断,来监测stop位,以便及时停止DMA。

3.
从lz5楼的问题“从机接收应答后接收了一部分数据后,紧接着从机初始化DMA和I2C,那主机后续发的数据和结束位从机还能不能收到呢”

比如先收了10个数据,然后从设备只是重新配置DMA,比如改变内存中的目的地址,或者做其它一些比较耗时的处理。在这个处理的过程中,master继续发送第11个数据,从设备硬件把11th放在DR中,同时置位RxNE标志;如果从设备还在处理自己的事情,master又发送第12个数据了,从设备硬件把12th放在移位寄存器中,同时置位BTF标志。然后这个从设备就可以按照I2C协议说的那样,把时钟线拉底,并保持。这样master就不会再发了。直到从设备处理完自己的事情,然后11th和12th数据后,master才会继续发送。

但是如果收了一部分数据后,STM32重新配置自己的I2C,(不知道lz为什么会有这种要求),后续还会再接收数据么,是怎样的,没有试过。

使用特权

评论回复
12
fangui|  楼主 | 2009-2-3 22:02 | 只看该作者

多谢解答

多谢解答,我们想了其他办法解决了,我在接收一部分数据的时候需要初始化DMA的时候还会等待一定的时间,在这个时间内看有没有后续的数据过来,如果没有数据过来后才初始化DMA,初始化I2C是由于我遇到了一种情况,就是主机发数据过来,但是从机的I2C端口不接收数据了,有点像吊死的情况!所以初始化DMA的时候连I2C一块初始化了。

使用特权

评论回复
13
sf116| | 2013-2-23 15:23 | 只看该作者

使用特权

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

本版积分规则

29

主题

87

帖子

0

粉丝