AT91SAM9263 CAN驅(qū)動(dòng)調(diào)試
遂借其CAN調(diào)試工具回來(lái)捯飭,久未果 查其為ZLG公司的產(chǎn)品,遂前往之。遇到周立功公司一個(gè)大牛,CAN專家,號(hào)稱沒(méi)有他解決不了的CAN問(wèn)題,事實(shí)證明,卻是有料,周立功公司的CAN 分析儀就是他們一幫人弄的,現(xiàn)在不做研發(fā),轉(zhuǎn)做服務(wù)了。拿Can分析儀查之,發(fā)現(xiàn)我們的CPU發(fā)出的CAN波形 波特率對(duì)不上,雖然設(shè)置為500K,可是由于CPU時(shí)鐘頻率非常規(guī)頻率,分頻以后,CAN時(shí)鐘再512K左右,ZLG公司的CAN調(diào)試工具是標(biāo)準(zhǔn)品,他們一般要求時(shí)序是比較嚴(yán)格的,所以我們的設(shè)備跟他的調(diào)試工具之間通信通不上,但是網(wǎng)上購(gòu)買的USB轉(zhuǎn)CAN的調(diào)試工具則將SJW域設(shè)置的比較大 3或者4 左右,可以跟大部分的CAN通信上,即使是對(duì)方的CAN波特率不精確,存在比較大的誤差。
本文引用地址:http://cafeforensic.com/article/201611/320036.htmCAN問(wèn)題絕大部分呢,應(yīng)該就是出在波特率的精確度上,但是一般情況下沒(méi)有那么精準(zhǔn)的測(cè)試儀器,所以搞的大家一頭霧水。適當(dāng)調(diào)整SJW 同步跳轉(zhuǎn)寬度的大小,可以一定程度的解決這個(gè)問(wèn)題,但是不是最佳的解決方案。雖然現(xiàn)象上看到,哦,通信正常了,我發(fā)的包對(duì)方可以收到,對(duì)方發(fā)的數(shù)據(jù)包我也可以收到,但是,事實(shí)是,這里面有了多次的重發(fā),得益于CAN協(xié)議,重發(fā),應(yīng)答等等。
下面簡(jiǎn)單描述下CAN波特率的分析
比如說(shuō)500K波特率,一個(gè)比特被分為16個(gè)時(shí)間因子
500K * 16 = 8M
所以CAN時(shí)鐘應(yīng)該盡量使8M的倍數(shù)。誤差盡量小。
同理推算其他波特率跟時(shí)鐘的對(duì)應(yīng)關(guān)系。
在我們的9263應(yīng)用中,MCLK = PLLA/2,CAN時(shí)鐘從MCLK分頻而來(lái)。
所以PLLA的取值應(yīng)為16M的整數(shù)倍。我們的PLLA一般設(shè)置再200M---150M,所以PLLA可取192M 176M 160M等。
WinCE下設(shè)置就比較簡(jiǎn)單了,Eboot啟動(dòng)后,空格可以進(jìn)入eboot配置菜單,可以直接設(shè)置CPU的主頻 跟 分頻,不贅述。
裸奔的程序 則需要自己去設(shè)置倍頻跟分頻系數(shù),從ATMEL官網(wǎng)下載了PLL計(jì)算工具,幫了不上忙,可能沒(méi)有那么精準(zhǔn),但是盡量接近就好。
#define BOARD_MCK ((16367660 * 98 / 10) / 2) /*160M*/
如上設(shè)置為160M的設(shè)置
除了這個(gè)宏定義的修改以為,在board_lowlevel.c中也需要做一些修改,
#define BOARD_MULA (AT91C_CKGR_MULA & (97 << 16))
#define BOARD_DIVA (AT91C_CKGR_DIVA & 10)
就是那兩個(gè)系數(shù),注意分頻系數(shù)不變,但是倍頻系數(shù)減一了,原因看數(shù)據(jù)手冊(cè)就明白。
原來(lái)以為這樣就可以了,可是還有一個(gè)地方忽略了,看代碼
void LowLevelInit( void )函數(shù)中
void LowLevelInit( void )
{
…….
#if !defined(sdram)
/* Initialize main oscillator
初始化主振蕩器,時(shí)鐘等一系列操作
#endif //#if !defined(sdram)
。。。。。。。。。。。
}
整個(gè)過(guò)程包含在了對(duì)sdram宏的判斷內(nèi),如果定義了sdram則不做下面的處理,乖乖,你不做這個(gè)處理怎么可以呢,遂注釋掉上面兩個(gè)宏定義。
這個(gè)宏定義不是在文件中定義的,而是在編譯器的工程設(shè)置里面,
Options-àC/C++ Compiler Preprocessor選項(xiàng)卡,最下面 Defined symbols
也可以直接把sdram去掉。
一直在糾結(jié)SDRAM的初始化是在什么地方進(jìn)行的?
評(píng)論