OpenEdv-开源电子网

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

STM32的IO模拟I2C主机,硬件I2C从机

[复制链接]

11

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-4-30
在线时间
44 小时
发表于 2016-10-4 19:08:49 | 显示全部楼层 |阅读模式
本帖最后由 stayhungry 于 2016-10-10 15:27 编辑

这几天做的一个项目,需要用到两块STM32之间的I2C通讯。
网上查了一堆,大多数只有STM32作主机操作FLASH什么的(软件模拟和硬件都有,不过硬件作主机有人说BUG,我没深入研究),很少有用STM32作为从机,所以在做的时候也遇到一些问题。这里我就分享一下,STM32主机用IO模拟I2C,从机使用STM32本身的硬件I2C的一些见解。

PS:我是用原子的最简模板和I2C驱动(有一些小改动),做了两个工程,在附件里面,跑系统也能用。读从机和写从机功能都写了,大家可以通过用/**/注释来进行选择。
例如:主机程序中的“read”段对应从机程序中的“1”段,主机程序中的“write”段对应从机程序中“0”段。



有什么想不清楚的就读一下这个地方:

主机读从机,从机需要发送数据:

1、通过一字节地址(7位地址+1位R/W)控制读从机还是写从机,STM32在这个地方遵循标准I2C协议。

2、STM32能够识别NACK和ACK(网上有的说不能识别NACK,然后什么需要加发一个无用数据什么的,我没遇到这种问题)。
在收到NACK后,是不能响应STOP指令的,STM32F10X参考手册说的(经过自己验证的确如此),所以用户使用STM32作从机时候自己写的协议与标准I2C协议有出入,因为I2C标准协议是收到NACK后,等待主机再发送一个STOP指令结束通信。

解决办法:
        (1)从机收到NACK后,硬件会自动关闭这次的通信,所以可以减少等待STOP指令这一步骤(因为已经自动结束这次通信了,所以不需要STOP也不会响应STOP)。

        (2)主机不发送NACK,只发送ACK,主机收完最后一个数据后,直接发送STOP指令,强行中断通信,启动新一次通信。
        (3)只发送ACK,发完之后,直接重新初始化从机硬件I2C,启动一次全新的通信。

经实验验证,第1种方法更加简单,而且稳定,若是出现传输数据错误,很有可能是因为没接外部上拉。第3种也非常稳定,就是这样配置感觉非常不合理。

3、STM32从机的发送时序是主机控制的(经过验证)
STM32F10X参考手册上对DR寄存器的描述是,当给从机发送器DR赋值时,从机发送器"自动启动数据传输",让人误以为从机获得了数据总线的控制权和时钟线控制权,自主发送,违背了I2C标准协议。而实际现象是给从机发送器DR赋值之后,从机进入“准备状态”,仍然在等待主机的时钟,主机每给一个时钟,从机发送一次数据。(我是通过更改IIC_Read_Byte里面的时钟脉冲时间来验证的)。

4、在主机发送完地址给从机之后,必须delay一段时间,因为从机处理地址(R/W)位时候需要时间(我是从网上看到的说法,忘记在哪了,实测不加delay会崩)。

5、每次主机读取一字节数据时候,必须delay一段时间,delay时间的长短取决于从机发送数据之后需要做多少东西,遵循主机在读取下一个字节数据时候,从机必须处于在while( !I2C_CheckEvent(I2C1,I2C_EVENT_SLAVE_BYTE_TRANSMITTED ));里面。否则,传输数据出错。

主机写从机,从机需要接收数据:

1、每次主机写一字节数据时候,必须delay一段时间,delay时间的长短取决于从机接收数据之后需要做多少东西,遵循主机在写下一个字节数据时候,从机必须处于在while( !I2C_CheckEvent(I2C1,I2C_EVENT_SLAVE_BYTE_RECEIVED ));里面。否则,传输数据出错。

追更:当使用硬件I2C的时候,记得使用外部上拉,记得使用外部上拉,记得使用外部上拉。

上面都是些个人见解和心得,如有错误地方还望指出,同时想问一个问题。
在开发中,经常会遇到参考手册和数据手册没有说明的问题,然后之前有见到一些前辈会参考一些官方英文手册,部分内容有类似于对一个寄存器的某个标志位有更加深入的解释,这种类型的手册叫什么东西?我应该在官网的哪些地方能找到呢?








STM32的IO模拟I2C主机_硬件I2C从机.zip

9.37 MB, 下载次数: 52544

两个工程文件

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

47

主题

212

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2016-1-2
在线时间
80 小时
发表于 2016-10-4 23:49:35 | 显示全部楼层
回复 支持 反对

使用道具 举报

7

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
245
金钱
245
注册时间
2016-4-11
在线时间
54 小时
发表于 2016-12-19 17:12:33 | 显示全部楼层
这意思时说,软件模拟IIC 不用加上拉电阻也可以了!!
回复 支持 反对

使用道具 举报

7

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
245
金钱
245
注册时间
2016-4-11
在线时间
54 小时
发表于 2016-12-19 17:14:52 | 显示全部楼层
开漏输出和外接上拉电阻   和     推腕上拉输出 一样把
回复 支持 反对

使用道具 举报

11

主题

94

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2016-12-12
在线时间
55 小时
发表于 2016-12-19 17:44:00 | 显示全部楼层
大赞啊 ,正研究这个呢,现谢过了!!
回复 支持 反对

使用道具 举报

8

主题

550

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2861
金钱
2861
注册时间
2016-5-13
在线时间
180 小时
发表于 2017-3-8 16:10:10 | 显示全部楼层
大赞啊 ,正研究这个呢,先谢了。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复 支持 反对

使用道具 举报

19

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2015-12-6
在线时间
47 小时
发表于 2017-3-8 17:18:36 | 显示全部楼层
楼主你好:我也正在看这个,我遇到的问题是,可以写数据,但是没有读到数据,想参考一下你的代码的。但是我下载下来之后解压不了。出现错误了。可以发我一份吗?谢谢啊我的邮箱是:563376881@qq.com
回复 支持 反对

使用道具 举报

8

主题

550

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2861
金钱
2861
注册时间
2016-5-13
在线时间
180 小时
发表于 2017-3-10 09:10:23 | 显示全部楼层
我是520老谢 发表于 2017-3-8 17:18
楼主你好:我也正在看这个,我遇到的问题是,可以写数据,但是没有读到数据,想参考一下你的代码的。但是我 ...

我这个是下载楼主的,并且清理过临时文件的,比较小。代码内容是一样的。

STM32的IO模拟I2C主机_硬件I2C从机.rar

556.69 KB, 下载次数: 515

iic

虽然不明白你们在说什么,但感觉很厉害的样子。
回复 支持 反对

使用道具 举报

19

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2015-12-6
在线时间
47 小时
发表于 2017-3-14 14:58:59 | 显示全部楼层
电脑小白 发表于 2017-3-10 09:10
我这个是下载楼主的,并且清理过临时文件的,比较小。代码内容是一样的。

谢谢:我还遇到了一个问题,需要加将近10ms的延时。我猜测我是不是哪里没有配置好
http://www.openedv.com/thread-95872-1-1.html
回复 支持 反对

使用道具 举报

19

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2015-12-6
在线时间
47 小时
发表于 2017-3-14 15:01:40 | 显示全部楼层
楼主:你好,我写的代码遇到了同样的问题,就是主机和从机通讯的时候需要加入延时,但是我加入的延时很长,读写切换需要3ms,读完数据需要延时7ms。是否楼主也需要花费这么长的时间。我用的是硬件从机。硬件中断处理这些数据。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2017-5-25
在线时间
1 小时
发表于 2017-5-25 15:24:49 | 显示全部楼层
xiexie ,xuexi xuexi
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-7-20
在线时间
3 小时
发表于 2017-7-20 20:09:08 | 显示全部楼层
请问怎么同时进行主从机发送和接收?
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-7-20
在线时间
3 小时
发表于 2017-7-21 09:25:21 | 显示全部楼层
请问怎么同时进行主从机发送和接收,主从机的双向通信呢?
回复 支持 反对

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2019-3-27
在线时间
21 小时
发表于 2019-12-24 09:01:26 | 显示全部楼层
楼主你好,请问怎么同时进行主从机发送和接收,主从机的双向通信呢?用两个STM32F103C8最小系统板相连接可以通信吗?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-3-25
在线时间
5 小时
发表于 2020-3-25 17:45:39 | 显示全部楼层
411772111 发表于 2019-12-24 09:01
楼主你好,请问怎么同时进行主从机发送和接收,主从机的双向通信呢?用两个STM32F103C8最小系统板相连接可 ...

你好!我的mcu也是stm32f103c8t6,今天把楼主主要代码移植过来,发现没有应答,请问你的主从通信成功了吗
回复 支持 反对

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-10-7
在线时间
8 小时
发表于 2020-5-19 23:43:04 | 显示全部楼层
感谢,这段时间也在玩这个,被硬件IIC的中断搞得头大。楼主这个从机虽然没用到中断,但确实也够用了。
回复 支持 反对

使用道具 举报

0

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2017-11-24
在线时间
18 小时
发表于 2020-11-9 14:51:52 | 显示全部楼层
好东西,学习了,谢谢
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2019-7-16
在线时间
19 小时
发表于 2020-12-8 10:12:35 | 显示全部楼层
好东西,用楼主的代码和I2C上位机直接能通信了,感谢
回复 支持 反对

使用道具 举报

5

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2020-11-24
在线时间
33 小时
发表于 2020-12-8 10:40:59 | 显示全部楼层
pwm 发表于 2016-12-19 17:12
这意思时说,软件模拟IIC 不用加上拉电阻也可以了!!

小心点,两边都push-pull output,一边输出高、一边输出低的时候,电源到地就短路了
回复 支持 反对

使用道具 举报

32

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2013-1-16
在线时间
131 小时
发表于 2022-3-6 22:22:49 | 显示全部楼层
IO口模拟I2C从机实现过么
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 02:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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