[STM8]

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

[复制链接]
4549|19
手机看帖
扫描二维码
随时随地手机跟帖
通宵敲代码|  楼主 | 2016-12-18 21:38 | 显示全部楼层 |阅读模式

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

先上主从机通信的逻辑分析仪截图
无标题.png



通宵敲代码|  楼主 | 2016-12-18 21:49 | 显示全部楼层

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

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

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

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

使用特权

评论回复
通宵敲代码|  楼主 | 2016-12-18 21:59 | 显示全部楼层

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

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

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



使用特权

评论回复
icecut| | 2016-12-19 16:32 | 显示全部楼层
建议不要初始化,看看死机的时候sclk是不是低电平,或者看看是不是丢信号了。

使用特权

评论回复
icecut| | 2016-12-19 16:35 | 显示全部楼层
尽量抓到司机的时序,发出来

使用特权

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

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

使用特权

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

使用特权

评论回复
icecut| | 2016-12-19 21:02 | 显示全部楼层
通宵敲代码 发表于 2016-12-19 17:51
恩,SCL是低电平,SDA时高电平,
是总线阻塞了。

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

使用特权

评论回复
linqing171| | 2016-12-19 21:16 | 显示全部楼层
从机不好做。
死机的时候看看状态寄存器是什么。

使用特权

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


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

使用特权

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

一切正常,
就是busy

使用特权

评论回复
huaiqiao| | 2016-12-21 21:10 | 显示全部楼层
通宵敲代码 发表于 2016-12-21 12:18
主机通信可以,
当从机不行

32也是如此?

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

使用特权

评论回复
Soraka| | 2016-12-21 21:54 | 显示全部楼层
死机的时候sclk是不是低电平

使用特权

评论回复
通宵敲代码|  楼主 | 2016-12-22 12:28 | 显示全部楼层
Soraka 发表于 2016-12-21 21:54
死机的时候sclk是不是低电平

恩,是的

使用特权

评论回复
iec1004| | 2016-12-22 15:27 | 显示全部楼层
一个有BUG 的东西 ,大家硬要去 完善它。

使用特权

评论回复
通宵敲代码|  楼主 | 2016-12-23 12:20 | 显示全部楼层
iec1004 发表于 2016-12-22 15:27
一个有BUG 的东西 ,大家硬要去 完善它。


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

使用特权

评论回复
通宵敲代码|  楼主 | 2016-12-23 12:20 | 显示全部楼层
iec1004 发表于 2016-12-22 15:27
一个有BUG 的东西 ,大家硬要去 完善它。


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

使用特权

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

使用特权

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

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

使用特权

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


顶你一下,大佬,哈哈

使用特权

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

本版积分规则

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

301

主题

7532

帖子

67

粉丝