ESP32(6) CAN Transceiver 挑選心得
[什麼是CAN bus]
簡單說,就是在車上用的BUS,如果想做點什麼放在車上,很難不跟CAN bus打交道;另外我的瑞典同事也在家裡部署的CAN Bus,他不是很信賴WiFi這類的東西(安全),CAN bus只有兩根線,差動信號夠可靠,而且也簡單
[CAN Bus Transceiver]
如前面描述的,CAN bus一對信號線是差動信號(differential pair),處理這信號的線路一定不會做在SOC裡面,因為不是所有人都要CAN bus,所以這東西放在IC裡,用不到的人就是垃圾,等於在浪費面積不划算;以這顆ESP32來說,WiFi收發機倒是直接內建了,因為這是他的賣點,對吧
所以一般是在SOC外部擺上一顆CAN bus收發晶片,他處理完差動信號後,轉成TX/RX一組線再連到MCU。常見的CAN bus收發晶片,或是我常用的,主要是底下這種SO8封裝
這裡就直接給上答案:如果design要放CAN bus,那我會大力推薦TJA1042/3。後面我會給出原因,這些原因會幫助你挑對Transceiver
[5V CAN元件]
汽車CAN bus網路大概還會是5v系統,差動信號平常在2.5v,傳送資料會拉到3.5v/2.5v。注意這個是工業標準,ISO11898-2,電壓是沒得選的
您可能會問,TI的SN65HVD231這種3.3v元件用在車上行不行?我測試結果:可以。原因一時半刻有點難解釋,用著總是擔心相容性(煩),建議就別折騰了,順著標準走
[VIO設計]
請再回到上面的圖,中間那顆pin5的VIO。舊式CAN transceiver打出來的TX/RX都是5v,拿來對接3.3v的MCU會不會有問題?我測過STM32和ESP32都OK。一般MCU的邏輯是,拿3.3v除以2,用1.65V區分0/1,所以吃0v/5v只要沒過大電流都還好。另一方面,MCU輸出0v/3.3v,到了CAN Transceiver用2.5v當分界區分0/1,這裡有點吃design margin,因為3.3v離2.5v有點近,倒也是不能運作
如果用上更低電壓MCU,只有1.8v的時候,上述策略就真的不會動了!另外這些電壓不匹配,終究是在吃design margin,何苦要為難自己?
所以這顆TJA1042/3有個Vio pin,可以告訴CAN收發晶片的邏輯電壓位準,這樣TX/RX電壓就會是我們指定的電壓,用得心安理得沒有問題
[省電設計]
再回去看CAN收發晶片,他的pin#8叫STANDBY,能讓CAN收發晶片進入Standby mode,這時候耗電會非常非常低。比如我做的VOLVO+放在車上,無時無刻會抽汽車電池的電,low power一定要很小心處理。這顆在standby mode只抽10uA的電流,放在車上可以接受了
MCU可以看到CAN bus沒有封包一段時間後,讓CAN transceiver進入standby,也讓MCU自己睡著
上述那段話,另一面是如何喚醒。TJA1042在省電模式下,CAN bus有擾動(出現dominate,bit#0)會在RX pin產生high-to-low transition。MCU可以在睡下去的時候,讓CAN-RX那根pin設成GPIO並且透過這個high-to-low transition喚醒
我能用上述的機制,實現睡覺/喚醒的設計
圍繞著省電/喚醒的機制,常見的CAN收發晶片也有這種14pin的設計。他會有根INHIBIT pin可以打開/關閉系統的電壓來源。設計的理念是,當系統進入睡眠狀態,會把MCU供電的線路全部都切斷,全系統只剩這顆Transceiver在低耗電運作(一種站哨的概念)
當CAN bus出現任何活動紀錄,CAN收發器再去打開電源元件,喚醒整個系統。這題我大概只看過人家這樣使用,簡單理解原理而已(甚至可能錯),沒有很深入研究了
[相容品]
做功課時,也看過中國的SIT1042/3,有沒有發現名字跟TJA1042/3很像!這個確實是pin-to-pin相容;另外Microchip的MCP2562/E也有這種IC可以使用
那本文就到這裡,如果想玩CAN bus,買開發板可以用我的幾個標準看看
留言