新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AT91SAM9263 CAN驅動調試

        AT91SAM9263 CAN驅動調試

        作者: 時間:2016-11-22 來源:網絡 收藏
        之前調試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波特率不精確,存在比較大的誤差。

        本文引用地址:http://www.104case.com/article/201611/320036.htm

        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的初始化是在什么地方進行的?



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 台东市| 酒泉市| 金昌市| 龙胜| 庆阳市| 明光市| 永康市| 新丰县| 黄骅市| 瓮安县| 健康| 平度市| 永州市| 水城县| 石嘴山市| 黎城县| 榆树市| 阿拉善盟| 天等县| 霞浦县| 昌图县| 奈曼旗| 昆山市| 襄垣县| 来宾市| 林口县| 吉木乃县| 扎囊县| 潜江市| 喀喇沁旗| 长白| 南陵县| 墨玉县| 曲阳县| 高密市| 德阳市| 栾城县| 克什克腾旗| 长顺县| 隆林| 海原县|