OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4753|回复: 6

有人研究过硬件IIC吗,读文档有疑惑,能聊聊吗

[复制链接]

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
发表于 2013-9-3 14:50:46 | 显示全部楼层 |阅读模式
花了很长的时间试着去理解STM32关于IIC接口的文档,,途中也有看看镇南电子的视频。由于还没有开始编过程序,就纸上谈一下。我觉得最难的部分就是主模式下的接收了,STM32用了很大的篇幅去说明操作的步骤和时序,还讲了个什么Method 1,Method 2什么的,但是都是在讲中断时的处理,那里有些不明白的地方,还有利用DMA去实现接收也有点不明白。
先问问第一个问题,


这里所谓的方法1、2,说实话其实我没太看懂,怎么从处理的步骤和时序就看的出方法2不需要最高的中断优先级而方法1就需要呢?说来连IIC为什么要谈论最高优先级这个问题我都不太理解?能大概说说吗?方法2那里还为接收数据量n(n=1,n2,n>2)分别作了讨论,真是不明觉厉了。。。。

第二个问题就是利用DMA接收了,其实还是和上面的问题有些关联。我的理解是,不管是方法1还是方法2,利用中断,在最后一个数据传输完成前(即倒数第二个数据接收后),设置NACK和STOP,从而使最后一个数据被接收到以后产生NACK应答和停止信号。哪么用DMA时有如何实现设置NACK和STOP呢?因为等DMA产生传输完成中断时,传输不是都已经要结束了吗,怎么在倒数第二个数据接收后设置NACK和STOP呢?除非DMA传输的数量比实际要传送的数量少1,那么才可以在DMA中断中设置NACK和STOP吧?是我理解的那样吗?请指教
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-3 15:58:44 | 显示全部楼层
回复 支持 反对

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2013-9-3 16:09:48 | 显示全部楼层
第一种方法说的是速度快的中断方式。第二种方法说的是速度较慢的轮询。
你意思是说发送最后需要再发送NACK和STOP么?那就DMA设置长度比你要发送的少几位,当DMA发送完这些数据会进入DMA发送完成中断,你可以在DMA发送完成的中断函数里发送IIC停止位。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
 楼主| 发表于 2013-9-3 17:11:18 | 显示全部楼层
回复【3楼】feilusia:
---------------------------------
朋友,能不能说的再明确一点呢,还是不懂啊。方法2不也是运用中断的吗,只是优先级不需要设置为最高了而已,文档中重头到尾都没有提起速度什么的,虽然我也觉得传输速度肯定有所影响。
关于第二个问题我突然发现自己看漏了一个点,还有一个控制位叫做LAST位,原文:“Master receiver: when the number of bytes to be received is equal to or greater than two, the DMA controller sends a hardware signal, EOT_1, corresponding to the last but one data byte (number_of_bytes – 1). If, in the I2C_CR2 register, the LAST bit is set, I2C automatically sends a NACK after the next byte following EOT_1. The user can generate a Stop condition in the DMA Transfer Complete interrupt routine if enabled”
      对于这段的理解,我觉得是:在DATA_N-1(倒数第二个数据)被收到,dma作用后产生一个EOT_1信号,以这个信号为标志,去设置LAST位的话,在收到DATA_N数据(即最后一个数据)后就会自动产生NACK应答,而且在DMA传输完成后所产生的传输完成中断中去产生STOP信号。
     但是对于自己的理解又有不肯定的地方:1、EOT_1是什么东西来的?2、停止信号的产生是由控制位CR1->STOP控制的,原文“Stop generation after the current byte transfer or after the current Start condition is sent”,那么在编程时,在DMA中断中设置STOP=1;就能产生停止信号了吗?不是应该和方法1,方法2那样在最后一个数据还没有传输完成前就设置才行的吗?
回复 支持 反对

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2013-9-3 17:29:18 | 显示全部楼层
回复【4楼】烂泥桑:
---------------------------------
中断方式是指数据发送过程中或发送结束后进入中断,优先级当然要高。轮询是指你自己一直去查标志位,看是否数据发送完毕,这样很占用CPU。STM32的IIC我没做过,你去把文档中IIC部分看个几遍,每看一遍你都会加深一些理解。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
 楼主| 发表于 2013-9-4 10:25:42 | 显示全部楼层
回复【5楼】feilusia:
---------------------------------
嗯,但是真的有读不懂的地方,这个“EOT_1”,全文档搜索,就只在这一章一节中找到,在DMA那节找了很久都没有,到底这是什么呢?
回复 支持 反对

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2013-9-4 14:20:23 | 显示全部楼层
回复【6楼】烂泥桑:
---------------------------------
EOT(End?of?Transfer)
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-13 13:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表