獨立can控制器sja1000采用


SJA1000是Philips(現NXP)推出的一款經典獨立CAN控制器,廣泛應用于工業控制、汽車電子、嵌入式系統等領域。它支持CAN 2.0A/B協議,提供靈活的配置選項和強大的錯誤處理能力。以下是圍繞SJA1000的詳細應用說明,涵蓋硬件接口、軟件配置、通信流程及常見問題解決。
**1. SJA1000核心特性
**(1) 主要功能
協議支持:兼容CAN 2.0A(11位標識符)和CAN 2.0B(29位標識符)。
通信速率:最高支持1Mbps(與總線長度和負載相關)。
錯誤處理:內置錯誤計數器(TEC/REC)、錯誤警告和總線關閉恢復機制。
接收過濾:支持單濾波器(BasicCAN模式)或雙濾波器(PeliCAN模式)。
**(2) 工作模式
BasicCAN模式:兼容PCA82C200,適合簡單應用。
PeliCAN模式:擴展功能(如可編程錯誤限制、接收FIFO增強等)。
**(3) 硬件接口
并行總線接口:8位數據總線(AD0-AD7)、地址總線(A0-A4)、控制信號(RD、WR、CS、ALE等)。
CAN總線接口:TXD、RXD(需外接CAN收發器,如TJA1050)。
中斷輸出:INT引腳,用于通知MCU處理CAN事件。
**2. 硬件連接與外圍電路
**(1) 典型連接圖
MCU (如STM32) <--> SJA1000 <--> CAN收發器 (如TJA1050) <--> CAN總線
MCU與SJA1000:
數據總線:MCU的8位數據線(如PA0-PA7)連接SJA1000的AD0-AD7。
地址總線:MCU的地址線(如PC0-PC4)連接SJA1000的A0-A4(通過譯碼器或直接連接)。
控制信號:MCU的GPIO控制SJA1000的RD、WR、CS、ALE等引腳。
SJA1000與CAN收發器:
TXD(SJA1000)→ TXD(TJA1050)
RXD(SJA1000)← RXD(TJA1050)
CAN總線端接:
總線兩端各接一個120Ω終端電阻。
**(2) 關鍵注意事項
電氣隔離:
在工業環境中,建議使用數字隔離器(如ADuM1201)隔離MCU與SJA1000,防止地電位差損壞芯片。
靜電保護:
在CAN_H和CAN_L上添加TVS二極管(如PESD1CAN),防止ESD沖擊。
時鐘源:
SJA1000需外接16MHz晶振,確保時鐘穩定。
**3. 軟件配置與通信流程
**(1) 初始化流程
復位SJA1000:
通過控制寄存器(CR)的復位位(CR.0=1)將SJA1000置于復位模式。
配置時鐘分頻寄存器(CDR):
選擇工作模式(BasicCAN/PeliCAN)、關閉CLKOUT引腳等。
設置驗收濾波器(ACR/AMR或ACR0-ACR3/AMR0-AMR3):
在BasicCAN模式下配置ACR和AMR;在PeliCAN模式下配置4組濾波器。
配置總線定時寄存器(BTR0/BTR1):
設置波特率(如500kbps)、同步跳轉寬度(SJW)、采樣點等。
配置輸出控制寄存器(OCR):
設置CAN總線的輸出模式(正常、斜率控制等)。
退出復位模式:
將CR.0置0,SJA1000進入工作模式。
**(2) 發送報文流程
檢查發送緩沖區狀態:
讀取命令寄存器(CMR)的
TR
位或狀態寄存器(SR)的TBS
位,確認發送緩沖區空閑。寫入報文到發送緩沖區:
將標識符、數據長度(DLC)、數據字節寫入發送緩沖區(地址0x00-0x09)。
啟動發送:
向CMR寫入
TR
位(0x01),觸發發送。監控發送狀態:
通過SR的
TCS
位(發送完成)和TBS
位(緩沖區空閑)確認發送結果。
**(3) 接收報文流程
檢查接收緩沖區狀態:
讀取SR的
RBS
位(接收緩沖區狀態)或中斷寄存器(IR)的RI
位(接收中斷)。讀取報文:
從接收緩沖區(地址0x10-0x19)讀取標識符、DLC和數據字節。
釋放接收緩沖區:
向CMR寫入
RRB
位(0x04),釋放緩沖區以接收下一幀。
**(4) 錯誤處理
監控錯誤計數器:
通過讀取接收錯誤計數器(REC)和發送錯誤計數器(TEC)的值,判斷節點狀態。
若TEC > 127,節點進入消極錯誤狀態;若TEC > 255,節點進入總線關閉狀態。
錯誤恢復:
在總線關閉狀態下,需等待128個總線空閑周期(11位隱性位)后自動恢復,或通過軟件復位強制恢復。
**4. 代碼示例(基于51單片機)
**(1) 初始化SJA1000
void SJA1000_Init(void) { // 進入復位模式 SJA1000_WriteReg(CR, 0x01); // CR.0 = 1 // 配置時鐘分頻寄存器(PeliCAN模式,關閉CLKOUT) SJA1000_WriteReg(CDR, 0x88); // 配置驗收濾波器(接收所有報文) SJA1000_WriteReg(ACR0, 0x00); SJA1000_WriteReg(AMR0, 0x00); // 配置總線定時寄存器(500kbps,假設晶振16MHz) SJA1000_WriteReg(BTR0, 0x01); // SJW=1, BRP=1 SJA1000_WriteReg(BTR1, 0x1C); // TSEG1=13, TSEG2=2, SAM=1 // 配置輸出控制寄存器(正常輸出模式) SJA1000_WriteReg(OCR, 0xAA); // 退出復位模式 SJA1000_WriteReg(CR, 0x00); // CR.0 = 0 }
**(2) 發送報文
void SJA1000_SendMsg(uint32_t id, uint8_t *data, uint8_t len) { // 等待發送緩沖區空閑 while (!(SJA1000_ReadReg(SR) & 0x04)); // TBS=1 // 寫入標識符(標準幀) SJA1000_WriteReg(TXB_ID0, (id >> 3) & 0xFF); SJA1000_WriteReg(TXB_ID1, (id << 5) & 0xE0); // 寫入數據長度和數據 SJA1000_WriteReg(TXB_DLC, len); for (uint8_t i = 0; i < len; i++) { SJA1000_WriteReg(TXB_DATA0 + i, data[i]); } // 啟動發送 SJA1000_WriteReg(CMR, 0x01); // TR=1 }
**(3) 接收報文
uint8_t SJA1000_ReceiveMsg(uint32_t *id, uint8_t *data) { // 檢查接收緩沖區狀態 if (!(SJA1000_ReadReg(SR) & 0x01)) return 0; // RBS=0,無報文 // 讀取標識符(標準幀) *id = ((SJA1000_ReadReg(RXB_ID1) >> 5) & 0x07) << 8; *id |= SJA1000_ReadReg(RXB_ID0); // 讀取數據長度和數據 uint8_t len = SJA1000_ReadReg(RXB_DLC) & 0x0F; for (uint8_t i = 0; i < len; i++) { data[i] = SJA1000_ReadReg(RXB_DATA0 + i); } // 釋放接收緩沖區 SJA1000_WriteReg(CMR, 0x04); // RRB=1 return len; }
**5. 常見問題與解決方案
問題現象 | 可能原因 | 解決方案 |
---|---|---|
無法發送報文 | 發送緩沖區未釋放 | 確保上一幀發送完成后(TCS=1)再發送 |
接收不到報文 | 驗收濾波器配置錯誤 | 檢查ACR/AMR寄存器,或臨時設為全接收 |
頻繁進入總線關閉狀態 | 物理層問題(如終端電阻缺失) | 添加120Ω終端電阻,檢查布線 |
波特率不匹配 | BTR0/BTR1配置錯誤 | 根據晶振頻率和目標波特率重新計算 |
中斷未觸發 | 中斷使能位未設置 | 在ICR寄存器中使能接收中斷(RIE=1) |
**6. 總結與建議
適用場景:
SJA1000適合對成本敏感、對CAN功能需求較基礎的應用(如工業傳感器網絡)。
升級替代:
若需更高級功能(如CAN FD、時間觸發通信),可考慮MCP2515或NXP的TJA1145。
調試技巧:
使用CAN分析儀(如PCAN-USB)實時監控總線報文,快速定位問題。
通過以上內容,可系統性地掌握SJA1000的硬件連接、軟件配置和通信流程。SJA1000雖為經典芯片,但通過合理設計仍能滿足許多現代CAN總線應用的需求。
責任編輯:Pan
【免責聲明】
1、本文內容、數據、圖表等來源于網絡引用或其他公開資料,版權歸屬原作者、原發表出處。若版權所有方對本文的引用持有異議,請聯系拍明芯城(marketing@iczoom.com),本方將及時處理。
2、本文的引用僅供讀者交流學習使用,不涉及商業目的。
3、本文內容僅代表作者觀點,拍明芯城不對內容的準確性、可靠性或完整性提供明示或暗示的保證。讀者閱讀本文后做出的決定或行為,是基于自主意愿和獨立判斷做出的,請讀者明確相關結果。
4、如需轉載本方擁有版權的文章,請聯系拍明芯城(marketing@iczoom.com)注明“轉載原因”。未經允許私自轉載拍明芯城將保留追究其法律責任的權利。
拍明芯城擁有對此聲明的最終解釋權。