CAN總線控制器的初始化程序
| ||
摘 要:介紹了can總線控制器sja1000芯片,并給出用c51語言編寫sja1000總線控制器的初始化程序,方便使用者學習和掌握。 關鍵詞:sja1000;can總線;c51;寄存器
0 引 言 隨著自動化底層設備通信的需要,使現場總線技術得到了迅速的發展,各廠家都紛紛推出自己的總線控制器。sja1000 就是philips公司推出的一種高性能的can總線控制器,它得到了廣泛的應用,但是有關sja1000初始化的文章比較少見,介紹的程序也不完全,這給使用者增加了難度。為了方便使用者掌握和使用can總線,本文作者成功地運用c51語言初始化sja1000為核心的can總線控制器,縮短了程序開發周期,提高了工作效率。
1 sja1000的新功能與內部結構 1.1 sja1000的主要新功能 sja1000是philips公司早期can總線控制器pca82c200的替代品,功能更強大,與pca82c200相比,具有許多優點,詳見文獻[4]. 1.2 sja1000的內部寄存器 sja1000的寄存器和管腳配置允許它使用于各種各樣的集成的或分立的can 收發器,這使不同微控制器之間的接口能夠被靈活運用。若要正確、靈活的運用sja1000,就必須了解內部寄存器的地址、功能和作用。sja1000內部寄存器的結構如表1所示(具體每一位的作用,請參閱文獻[2]). 1.3 sja1000與89c52的連線原理 為了連接到主控制器,sja1000提供一個復用的地址/數據總線和附加的讀/寫控制信號,見圖1.sja1000能被看作外圍存儲器并為主控制器映射i/o設備。為了保證系統的同步,本電路使用了一個24 mhz的晶振作為sja1000的振蕩器,用它的7號引腳(clkout)作為89c52的時鐘脈沖。本文中sja1000的片選由微控制器的p2.7口控制,其內部寄存器的地址由p0口和p2口共同來決定,p0口為低8位,p2口為高8位。 圖1 原理接線圖
2 程 序
緩沖器的寄存器和一部份ram的地址窗口,就象是外圍的寄存器。 sja1000初始化的流程圖如圖2所示。 為了讓工程技術人員更加深入的學習和使用can總線,這里完整的給出了sja1000的初始化程序。 程序如下: #define crxbyte[0x8000] // 控制寄存器地址 #define cmrxbyte[0x8001] // 命令寄存器地址 #define srxbyte[0x8002] // 狀態寄存器地址 #define irxbyte[0x8003] // 中斷寄存器地址 #define acrxbyte[0x8004] // 驗收碼寄存器地址 #define amrxbyte[0x8005] // 驗收屏蔽寄存器地址 #define btr0xbyte[0x8006] // 總線定時寄存器0地址 #define btr1xbyte[0x8007] // 總線定時寄存器1地址 #define ocrxbyte[0x8008] // 輸出控制寄存器地址 #define trxbyte[0x8009] // 測試寄存器地址 #define transbuffer1xbyte[0x800a] // 發送緩沖器 #define transbuffer2xbyte[0x800b] #define transbuffer3xbyte[0x800c] #define transbuffer4xbyte[0x800d] #define transbuffer5xbyte[0x800e] #define transbuffer6xbyte[0x800f] #define transbuffer7xbyte[0x8010] #define transbuffer8xbyte[0x8011] #define transbuffer9xbyte[0x8012] #define transbuffer10xbyte[0x8013] #define rxbuffer1xbyte[0x8014] // 接收緩沖器 #define rxbuffer2xbyte[0x8015] #define rxbuffer3xbyte[0x8016] #define rxbuffer4xbyte[0x8017] #define rxbuffer5xbyte[0x8018] #define rxbuffer6xbyte[0x8019] #define rxbuffer7xbyte[0x801a] #define rxbuffer8xbyte[0x801b] #define rxbuffer9xbyte[0x801c] #define rxbuffer10xbyte[0x801d] #define cdrxbyte[0x801f] // 時鐘頻分寄存器 #include “at89x52.h” #include “stdio.h” #include “math.h” #include “intrins.h” #include “ctype.h” #include “mylib.h” #include “absacc.h” void init­_can(void) // 初始化sja1000主控制器子函數 { cr=0x01; // 控制寄存器為復位 cdr=0; // 設置時鐘分頻器 acr=0; // 驗收碼寄存器 amr=0xff; // 驗收屏蔽寄存器 btr0=0x31; // 總線定時寄存器0 btr1=0x18; & |
文章版權歸西部工控xbgk所有,未經許可不得轉載。