对STM32的CAN1模块的总结

来源:互联网 发布:thinkpad摄像头软件 编辑:程序博客网 时间:2024/06/06 15:39

作者:CY中草药

转自:http://blog.csdn.net/c823443337/article/details/8450931


从12月中旬到现在一直都在调试板子,把F107上的CAN1(PD0,PD1)转移到F105上的CAN1(PB8,

PB9),本来以为会是很简单的进行重映射就行了,但是生活处处是

充满“惊喜”啊!

在进行了重映射后发现CAN进不了中断,很郁闷!仔细检查了两个端点CAN的连接口后发现是没错的,但还是进

不了中断。那只能进行单步调试了,最后发现是在CAN的初始化模式成功后要进入正常模式时失败了,CAN的处理工

程是:

初始化模式:设置CAN_MCR 寄存器的INRQ 位为’1’ ,请求bxCAN进入初始化模式,然后等待硬件对CAN_MSR

 寄存器的INAK 位置’1’ 来进行确认。当bxCAN处于初始化模式时,禁止报文的接收和发送,并且CANTX引脚输出隐

性位(高电平)。 初始化模式的进入,不会改变配置寄存器。

正常模式:在初始化完成后,软件应该让硬件进入正常模式,以便正常接收和发送报文。软件可以通

CAN_MCR 寄存器的INRQ 位清’0’ ,来请求从初始化模式进入正常模式,然后要等待硬件对CAN_MSR 寄存器的

INAK 位置’0’ 的确认。在跟CAN总线取得同步,即在CANRX引脚上监测11个连续的隐性位(等效于总线空闲)后,

bxCAN才能正常接收和发送报文。

但就是在我的程序里,在INRQ清“0”了以后就在等待INAK的清零,直到超过定时退出返回CANINITFAILED,而

没有返回CANINITOK,所以也就是说我的CAN1模块初始化成功后根本就没有进入正常模式,又怎么会进入中断呢!

但是我在程序里分明按着例程来进行修改的,也进行了重映射了,检查多次后我把错误定位在硬件的接收电路,因为

在上面的模式解释处说到了关于CAN的Tx和Rx应该出现的高低电平,但是我用万用表测量我的Tx端是却是出现了低

电平,所以我又对CAN的收发设计电路进行了一番仔细的研究,电路应该是没错的。他妈究竟是哪错啊,要弄死人

啊!

在不经意间我把一个例程跑了,这个例程用到了两个CAN,我的硬件里有两路CAN的使用,而且硬件也是一模一

样的,但是我的CAN2电路还没有进行硬件的焊接,居然我的CAN2成功的进入了正常模式,因此我更肯定了是硬件的

问题,因为程序是一样的。但再次的硬件分析完了之后还是感觉硬件是没错的,那就只有先把焊了的电路先断了一

下,再进行调试,结果还是不行,看来还真不是错在硬件啊!

没办法了,只能是拿着万用表来查究竟是在哪一句在执行的时候把Tx脚的电平给拉低了,好不容易定位在

GPIO_INIT()程序里发现了电平变低的语句,但是在对比了CAN_BSRR和CAN_ODR两个寄存器后发现程序是对

的,搞毛啊!

最后突然想到在网上输入STM32、CAN、PB9进行查询,在百度文库的一篇文章里看到了人家对这个端口的重

映射的程序,偶然发现到了自己一个地方弄错了,一个很细小的地方,经修改,总算是解决了我的问题,怎么说吧,

希望后人不要犯我这种低级错误。

在这半个多月,我基本逛遍了所有的电子论坛,但是就没有人能帮忙解决,说没有也有一个帖子说了跟我同样的

问题,我也找到了他本人的QQ,想向他请教,有时候人是一直奇怪的动物,很欠抽的。我连续几天向他发消息,说

我的问题(这几天他一直没上线)语气很客气,一个字的回答没有,难得今天看见他上线了,再次发了我问题,还是

有回答,我就火了,问候了一下他全家,果然来效果了,马上把我拉黑了!大家说这是安的什么心啊,不懂或者是

忘了的,是个正常人都会回一下,不要给人希望,浪费人家时间,欠抽的!

所以在此也希望大家有看到这的,希望大家以后在逛论坛的时候要是碰到有人提问,自己也懂的尽量的帮助一下

别人,你自己也可以有几分嘛!


以下一个链接是一个我的帖子,里面有我的程序和解决方法:

http://bbs.21ic.com/forum.php?mod=viewthread&tid=407287&page=1&extra=#pid2638733


原创粉丝点击