打印
[STM8]

STM8S2主从机I2C通信,却是个坑啊

[复制链接]
5074|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
通宵敲代码|  楼主 | 2016-12-18 21:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

上次通过用STM8S的I2C驱动OLED,多少有了点基础,
不过驱动OLED没有用到I2C做从机的知识,
最近因为项目需要,就学习了一下I2C的主从机通信,
不得不说,STM8的I2C经历了这么多年的改进,
进步确实是有的,不过优化的空间也还是不小的。

先上主从机通信的逻辑分析仪截图




沙发
通宵敲代码|  楼主 | 2016-12-18 21:49 | 只看该作者

首先说明一下,我们使用的是硬件I2C,
主机发送程序跟驱动OLED的基本一样,具体可以参考这个帖子。
https://bbs.21ic.com/icview-1650832-1-1.html
从机我们是用事件中断方式进行处理,下面详细进行介绍,
从上图也可以看出,程序读取还存在bug,目前还在查找原因。

主机初始化,外部使用8MHz晶振,不需要开启中断。


主机发送数据,一次发送8个字节,从全局数组中读取,
此处用全局数组的好处是可以再其他程序共同访问,
方便程序各模块间的对接,也符合模块化编程的需求。


主机读取函数,同样是8字节,使用全局数组进行存储。

使用特权

评论回复
板凳
通宵敲代码|  楼主 | 2016-12-18 21:59 | 只看该作者

从机初始化函数,同样适用8MHz晶振,
此处使用中断进行处理,所以打开了所有的中断功能。


下面是从机的中断处理部分,分为接和读取两部分
按不同的事件相应不同的中断功能。
因在测试中发现,连续通信过程中I2C存在死机现象,
所以在每次通信完成后都重新初始化一次I2C,
图中画横线便是初始化函数,效果有一定改善。


下面是I2C中断中的所有事件,由此标出了对应的事件编号,
可以与用户手册中的通信协议对应起来,大家自行理解吧。




使用特权

评论回复
地板
icecut| | 2016-12-19 16:32 | 只看该作者
建议不要初始化,看看死机的时候sclk是不是低电平,或者看看是不是丢信号了。

使用特权

评论回复
5
icecut| | 2016-12-19 16:35 | 只看该作者
尽量抓到司机的时序,发出来

使用特权

评论回复
6
通宵敲代码|  楼主 | 2016-12-19 17:51 | 只看该作者
icecut 发表于 2016-12-19 16:32
建议不要初始化,看看死机的时候sclk是不是低电平,或者看看是不是丢信号了。 ...

恩,SCL是低电平,SDA时高电平,
是总线阻塞了。

使用特权

评论回复
7
huaiqiao| | 2016-12-19 20:21 | 只看该作者
一直说32和8 的硬件iic都不是太好。
但是我之前参考野火的例子,操作过at24c08,感觉还行。。。。。不知道是不是数据不多的缘故还是

使用特权

评论回复
8
icecut| | 2016-12-19 21:02 | 只看该作者
通宵敲代码 发表于 2016-12-19 17:51
恩,SCL是低电平,SDA时高电平,
是总线阻塞了。

iic 多 master 规定,如果从机拉低 scl,则主机会等待....等待....

使用特权

评论回复
9
linqing171| | 2016-12-19 21:16 | 只看该作者
从机不好做。
死机的时候看看状态寄存器是什么。

使用特权

评论回复
10
通宵敲代码|  楼主 | 2016-12-21 12:18 | 只看该作者
huaiqiao 发表于 2016-12-19 20:21
一直说32和8 的硬件iic都不是太好。
但是我之前参考野火的例子,操作过at24c08,感觉还行。。。。。不知道 ...


主机通信可以,
当从机不行

使用特权

评论回复
11
通宵敲代码|  楼主 | 2016-12-21 12:19 | 只看该作者
linqing171 发表于 2016-12-19 21:16
从机不好做。
死机的时候看看状态寄存器是什么。

一切正常,
就是busy

使用特权

评论回复
12
huaiqiao| | 2016-12-21 21:10 | 只看该作者
通宵敲代码 发表于 2016-12-21 12:18
主机通信可以,
当从机不行

32也是如此?

我反正就是往at24c08z中存了数据。

使用特权

评论回复
13
Soraka| | 2016-12-21 21:54 | 只看该作者
死机的时候sclk是不是低电平

使用特权

评论回复
14
通宵敲代码|  楼主 | 2016-12-22 12:28 | 只看该作者
Soraka 发表于 2016-12-21 21:54
死机的时候sclk是不是低电平

恩,是的

使用特权

评论回复
15
iec1004| | 2016-12-22 15:27 | 只看该作者
一个有BUG 的东西 ,大家硬要去 完善它。

使用特权

评论回复
16
通宵敲代码|  楼主 | 2016-12-23 12:20 | 只看该作者
iec1004 发表于 2016-12-22 15:27
一个有BUG 的东西 ,大家硬要去 完善它。


不撞南墙不回头
为撞南墙可没头

使用特权

评论回复
17
通宵敲代码|  楼主 | 2016-12-23 12:20 | 只看该作者
iec1004 发表于 2016-12-22 15:27
一个有BUG 的东西 ,大家硬要去 完善它。


不撞南墙不回头
为撞南墙不要头

使用特权

评论回复
18
LinKiFF| | 2017-9-9 10:19 | 只看该作者
大哥,您好,我用您的I2C从机程序,跟STM32主机通讯,主机发送完第二个字节,从机无ACK应答是什么情况?

使用特权

评论回复
19
SarahHXC| | 2018-9-12 16:30 | 只看该作者
LinKiFF 发表于 2017-9-9 10:19
大哥,您好,我用您的I2C从机程序,跟STM32主机通讯,主机发送完第二个字节,从机无ACK应答是什么情况? ...

可以看看从机是否合理供电,有时候从机的供电电压不足会起不来。。。

使用特权

评论回复
20
略略u| | 2018-9-12 23:55 | 只看该作者
通宵敲代码 发表于 2016-12-18 21:59
从机初始化函数,同样适用8MHz晶振,
此处使用中断进行处理,所以打开了所有的中断功能。


顶你一下,大佬,哈哈

使用特权

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

本版积分规则

个人签名:年轻不是资本,奋斗才是良策!

302

主题

7540

帖子

69

粉丝