您的位置 首页 FPGA

STM8S BUG的一点总结

意法半导体的STM8S系列单片机价格很便宜,外围资源很丰富,开始就果断选择了这款单片机(STM8S103F3P)没使用不知道,使用后心里各种不爽

意法半导体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还能够。
2、今后再做什么东西,要先下载那个单片机的Erratasheet,大致翻下心里有个数,这样至少不会让自己一向堕入一个死胡同,最终却发现是硬件BUG的原因。
3、看英文原版的DataSheet,英文要练好啊,什么东西让人翻译过来反而愈加难了解。乃至我用的STM8S里的寄存器手册里还有丧命的翻译所悟,弄得我搞了半天没搞好。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/259356.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部