STM8S BUG的一点总结

来源:本站
导读:目前正在解读《STM8S BUG的一点总结》的相关信息,《STM8S BUG的一点总结》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《STM8S BUG的一点总结》的详细说明。
简介:除了I2C本身的BUG 据我目前所知,I2C和外部中断也有冲突,具体是I2C和GPIOA的外部中断,这个在Erratasheet里也有提到。当这两个中断同事要响应时GPIOA的中断不会被响应,而是等I2C的中断结束一段时间后,才开始响应。

CNTSW大侠写的很透彻给大家分享一下

意法半导体的STM8S 系列单片机价格很便宜,外围资源很丰富,开始就果断选择了这款单片机 (STM8S103F3P)没使用不知道,使用后心里各种不爽。主要就是它的I2C热的祸。不知道是不是专利原因,意法的I2C做的很复杂,很别扭。官网上公布的Erratasheet就不搬过来了。针对I2C总线总是被锁死的情况,我目前采取的办法是(功能是主机向从机发送一个字节的数据):

主机:(STM32F103)

1.开启事件中断,关闭缓存中断。

2.通过BTF被置位引起的中断来写下一字节的数据。

中断响应函数中仅仅判断三个点:

1.Start发送完后的SB置位,按手册说的写地址到DR寄存器后清除该事件;

2.地址发送完后的ADDR位,按手册说的,读SR2寄存器清除改事件;然后写第一字节的数据

3.BTF触发中断,发送STOP

4.关闭I2C外设,防止干扰信号导致I2C锁死。如果中断处理函数中遇到其他情况就RESET下I2C。

从机:(STM8S103F3P)

只开事件中断

中断响应函数:

static u8 progress来记下当前的进程,用Switch语句,有点类似于Verilog HDL里写状态机的那个,让进程只能按照switch里的顺序执行,如果有问题就RESET,看下面的。

uchar dat;

static uchar progress;

EXIT_PD_DISABLE

switch(progress)

{

case 0:

if(I2C_SR1_ADDR==1) //地址匹配

{

if(I2C_SR3_TRA==1) //发送

progress=1;

else

progress=2;

}

else //ERROR

{

Reset();

progress=0;

}

break;

case 1://发送模式

Reset();

progress=0;

break;

case 2://接收模式

dat=I2C_DR;

if(dat>0xa0) dat=0xa0;

Reset();

progress=0;

break;

}

除了I2C本身的BUG 据我目前所知,I2C和外部中断也有冲突,具体是I2C和GPIOA的外部中断,这个在Erratasheet里也有提到。当这两个中断同事要响应时GPIOA的中断不会被响应,而是等I2C的中断结束一段时间后,才开始响应。

另外还有一个,就是如果I2C的中断被打开后GPIOD如果有设置为输入口的,GPIOD的外部中断会自动被打开,即使GPIOD的CR2寄存器全为0 不知道怎么回事,目前还没更加具体的去查找是什么原因。但是这个在Erraratasheet里面没有提及。

总之,得出了一个结论

1、用STM8S 尽量不要去碰硬件I2C,好多麻烦,STM32确实有人很好的绕过BUG而且用的也很好,很稳定。不知道怎么弄得。

2、以后再做什么东西,要先下载那个单片机的Erratasheet,大致翻下心里有个数,这样至少不会让自己一直陷入一个死胡同,最后却发现是硬件BUG的原因。

3、看英文原版的DataSheet,英文要练好啊,什么东西让人翻译过来反而更加难理解。甚至我用的STM8S里的寄存器手册里还有致命的翻译所悟,弄得我搞了半天没搞好。

提醒:《STM8S BUG的一点总结》最后刷新时间 2024-03-14 01:09:43,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《STM8S BUG的一点总结》该内容的真实性请自行鉴别。