背景:
最近一直在使用C8051F340 + SJA1000來實現CAN通信,就SJA1000部分做個記錄。
正文:
整個系統結構拓撲圖如下:
兩路CAN,C8051F340作為CPU,處理CAN與USB數據。
轉入正題,關於SJA1000的中斷。
SJA1000的/INT腳與單片機的外部中斷輸入腳相連,平時/INT保持高電平,當SJA1000內部有中斷時,/INT腳及變為低電平(單片機外部輸入中斷引腳設置為低電平有效邊沿觸發),等待單片機進行處理。
SJA1000中斷部分應該關注兩個寄存器“IR”(Interrupt Register),“IER”(Interrupt Enable Register)。顧名思義,“IER”為使能相應中斷,“IR”為指示中斷狀態,應當注意的是:當單片機讀取了SJA1000的“IR”寄存器后,/INT腳重新變為高電平,“IR”寄存器所有位復位為0!
還有一個值得注意的是:為了保險起見,應該要將“IER”清零,然后根據需要配置相應位。
為此,我也郁悶了許久,過程如下:為了測試,於是將2路CAN相互接通,當通過SJA1000_1發送數據時,按照邏輯來說,SJA1000_1發送數據,SJA1000_2過濾接收該條數據並產生接收完成中斷,可是這個SJA1000_1竟然與SJA1000_2同時產生中斷!而我中斷使能使用的是“或”的方式配置了“總線錯誤中斷”、“數據溢出中斷”“錯誤報警中斷”、“接收中斷”,SJA1000_1不應該會在這個時候產生中斷!SJA1000_1難道會過濾接收自己發的數據?這是首先被懷疑的,查了資料后發現,處於發送狀態的節點是不會接收數據的。排除!折騰了許久才發現SJA1000_1發送完畢產生了發送完成中斷,因此可以確認“發送使能中斷”不清零的話,是有可能被打開的(SJA1000的官檔並未說明每一位的默認值),其它“使能中斷”亦如此,
記錄地點:深圳WZ
記錄時間:2016年3月16日