您的位置 首页 主动

AT91SAM9263 CAN驱动调试

之前调试CAN设备,一般用的是一个从淘宝上买的USB转CAN的调试工具,100K–800K波特率基本没有什么问题,我们也就没有过多的去考虑一些

之前调试CAN设备,一般用的是一个从淘宝上买的USB转CAN的调试东西,100K — 800K波特率根本没有什么问题,咱们也就没有过多的去考虑一些细节的问题。忽一日,某客户说咱们的CAN驱动有问题,跟他们的CAN调试设备通讯不上,疑虑ing.遂带东西前往之,试之,公然….

遂借其CAN调试东西回来捯饬,久未果 查其为ZLG公司的产品,遂前往之。遇到周建功公司一个大牛,CAN专家,声称没有他处理不了的CAN问题,事实证明,却是有料,周建功公司的CAN 剖析仪便是他们一帮人弄的,现在不做研制,转做服务了。拿Can剖析仪查之,发现咱们的CPU宣布的CAN波形 波特率对不上,尽管设置为500K,但是因为CPU时钟频率非常规频率,分频今后,CAN时钟再512K左右,ZLG公司的CAN调试东西是规范品,他们一般要求时序是比较严厉的,所以咱们的设备跟他的调试东西之间通讯通不上,但是网上购买的USB转CAN的调试东西则将SJW域设置的比较大 3或许4 左右,能够跟大部分的CAN通讯上,即使是对方的CAN波特率不准确,存在比较大的差错。

CAN问题绝大部分呢,应该便是出在波特率的准确度上,但是一般情况下没有那么精准的测验仪器,所以搞的咱们一头雾水。恰当调整SJW 同步跳转宽度的巨细,能够必定程度的处理这个问题,但是不是最佳的处理方案。尽管现象上看到,哦,通讯正常了,我发的包对方能够收到,对方发的数据包我也能够收到,但是,事实是,这儿面有了屡次的重发,得益于CAN协议,重发,应对等等。

下面简略描绘下CAN波特率的剖析

比如说500K波特率,一个比特被分为16个时刻因子

500K * 16 = 8M

所以CAN时钟应该尽量使8M的倍数。差错尽量小。

同理核算其他波特率跟时钟的对应联系。

在咱们的9263使用中,MCLK = PLLA/2,CAN时钟从MCLK分频而来。

所以PLLA的取值应为16M的整数倍。咱们的PLLA一般设置再200M—150M,所以PLLA可取192M 176M 160M等。

WinCE下设置就比较简略了,Eboot发动后,空格能够进入eboot装备菜单,能够直接设置CPU的主频 跟 分频,不赘述。

裸奔的程序 则需求自己去设置倍频跟分频系数,从ATMEL官网下载了PLL核算东西,帮了不上忙,或许没有那么精准,但是尽量挨近就好。

#define BOARD_MCK ((16367660 * 98 / 10) / 2) /*160M*/

如上设置为160M的设置

除了这个宏界说的修正认为,在board_lowlevel.c中也需求做一些修正,

#define BOARD_MULA (AT91C_CKGR_MULA & (97 << 16))

#define BOARD_DIVA (AT91C_CKGR_DIVA & 10)

便是那两个系数,留意分频系数不变,但是倍频系数减一了,原因看数据手册就理解。

本来认为这样就能够了,但是还有一个当地疏忽了,看代码

void LowLevelInit( void )函数中

void LowLevelInit( void )

{

…….

#if !defined(sdram)

/* Initialize main oscillator

初始化主振荡器,时钟等一系列操作

#endif //#if !defined(sdram)

。。。。。。。。。。。

}

整个进程包含在了对sdram宏的判别内,假如界说了sdram则不做下面的处理,乖乖,你不做这个处理怎样能够呢,遂注释掉上面两个宏界说。

这个宏界说不是在文件中界说的,而是在编译器的工程设置里边,

Options-àC/C++ Compiler Preprocessor选项卡,最下面 Defined symbols

也能够直接把sdram去掉。

一直在纠结SDRAM的初始化是在什么当地进行的?

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部