獨(dú)立can控制器sja1000采用


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