新唐火神板開箱實作(五):CAN通訊測試
一、前言
本篇要用Python寫程式,從個人電腦連接的Kvaser Leaf Light v2透過CAN傳送資料至NuMaker-Volcano接收,並從serial port觀測資料。
二、CAN bus的結構
如下圖,如果我們要使用CAN介面,需要有CAN Controller以及CAN Transceiver。CAN Controller負責的是CAN的通訊協定,CAN Controller會依序傳輸或接收資料,並且內建CRC、ACK、中斷等邏輯電路,CPU只需要存取他的暫存器即可進行收發。這一步當然可以用軟體刻出時序,不過有獨立硬體會讓CPU輕鬆一點。現在我們在做新的專案通常會直接挑有內建CAN Controller的MCU,像是新唐的M0A23、NUC131、M482、M453都有內建。NUC131目前已經有AEC-Q101的版本了,M0A23未來應該也會有。
CAN Controller輸出的都還只是共模信號,必須透過CAN Transceiver轉換電氣特性為差動信號。新一點的CAN Transceiver除了轉換電氣特性以外,還會有超時保護、突波及ESD防護,其中超時保護是為了避免該節點的軟體或硬體出現問題,使TXD長時間保持在LOW的時候,CAN Transceiver會把輸出級的電晶體給釋放掉,避免該節點長時間保持在顯性信號占用並阻斷其他節點的通訊。此外為了因應很多新出的MCU工作電壓都是3.3V,再新一點的CAN Transceiver也會將bus端的5V (VCC)與CAN TX/RX端的電源(VIO)區隔開來。幾個推薦的系列: NXP TJA1051T、TI TCAN1042、Microchip MCP2551。TJA1051T和TCAN1042有分不同版本(速度、VIO、EN等等),記得要去讀一下datasheet,看一下尾數的涵義。MCP2551就很經典很便宜,不過他就沒有VIO。
現在帶VIO的1051、1042市場都缺料,交期都排到好幾個月。好在新唐的M0A23工作電壓可以到5V,做東西用MCP2551就可以了~
三、行前準備
1. NuMaker-Volcano要焊上排針,以利我們用杜邦線連接到CAN Transceiver
2. 準備CAN Transceiver模組,兩年前還很好買到的TCAN1042V-Q1
3. DB9母頭,要在後面焊上排針,到時候也要插杜邦線把CAN_H、CAN_L拉出來。
從範例程式第152行可以看出CAN_TX和CAN_RX分別是PB7和PB5,NuMaker-Volcano背面也直接印了GPIO的名稱。
SYS->GPB_MFP1 = (SYS->GPB_MFP1 & ~(SYS_GPB_MFP1_PB5MFP_Msk | SYS_GPB_MFP1_PB7MFP_Msk)) | (SYS_GPB_MFP1_PB5MFP_CAN0_RXD | SYS_GPB_MFP1_PB7MFP_CAN0_TXD);
from canlib import canlib, Frame import time ch = canlib.openChannel( channel=0, flags=canlib.Open.EXCLUSIVE, bitrate=canlib.canBITRATE_250K ) # Set the CAN bus driver type to NORMAL. ch.setBusOutputControl(canlib.Driver.NORMAL) # Activate the CAN chip. ch.busOn() # Transmit a message with (11-bit) CAN id = 123, length 6 and contents # (decimal) 72, 69, 76, 76, 79, 33. frame = Frame(id_=0x7ff, data=b'HELLO!', dlc=6) try: while True: ch.write(frame) time.sleep(1) except KeyboardInterrupt: pass ch.busOff() ch.close()
留言
張貼留言