單芯片解決方案,開啟全新體驗——W55MH32高性能以太網單片機
W55MH32是WIZnet重磅推出的高性能以太網單片機,它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身,具體來說,一顆W55MH32內置高性能Arm? Cortex-M3核心,其主頻最高可達216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數據處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協議棧、內置MAC以及PHY,擁有獨立的32KB以太網收發緩存,可供8個獨立硬件socket使用。如此配置,真正實現了All-in-One解決方案,為開發者提供極大便利。
在封裝規格上,W55MH32提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復雜工控場景設計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設資源,能夠輕松應對工業控制中多樣化的連接需求,無論是與各類傳感器、執行器的通信,還是對復雜工業協議的支持,都能游刃有余,成為復雜工控領域的理想選擇。同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網關模組等場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網站或者私信獲取。
此外,本W55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網絡通信安全再添保障。
為助力開發者快速上手與深入開發,基于W55MH32L這顆芯片,WIZnet精心打造了配套開發板。開發板集成WIZ-Link芯片,借助一根USB C口數據線,就能輕松實現調試、下載以及串口打印日志等功能。開發板將所有外設全部引出,拓展功能也大幅提升,便于開發者全面評估芯片性能。
若您想獲取芯片和開發板的更多詳細信息,包括產品特性、技術參數以及價格等,歡迎訪問官方網頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。
第三十六章 CAN——控制器局域網絡接口
控制器局域網(Controller Area Network, CAN)作為工業自動化和汽車電子領域的核心通信技術,以其高可靠性和實時性著稱。下面我們將基于W55MH32以太網單片機的bxCAN(基本擴展 CAN)模塊,系統講解CAN通信的原理、架構及實際應用要點,和大家一起學習和使用這一技術。
1CAN通信概述
1.1簡介
CAN(Controller Area Network)是一種用于實時控制的串行通信總線,由博世公司開發,廣泛應用于汽車電子、工業自動化等領域。
1.2功能特點
CAN接口有以下特點:
多主通信機制:網絡中所有節點均可在任意時刻主動發送數據,無需中央控制器協調。當多個節點同時發送時,通過標識符仲裁決定優先級,確保高優先級消息優先傳輸。
非破壞性總線仲裁:仲裁過程基于標識符的二進制值,數值越小優先級越高。仲裁失敗的節點會自動停止發送,避免總線沖突。
錯誤處理:集成CRC校驗、應答校驗等多種錯誤檢測機制,檢測到錯誤時自動發送錯誤幀,并通過錯誤計數器實現故障界定(主動錯誤、被動錯誤、離線狀態)。
實時性保障:通信速率最高可達1Mbps(短距離),滿足實時控制場景需求。
1.3CAN幀結構與類型
CAN協議定義了四種幀類型,每種幀具有特定的結構和功能:
幀類型 | 作用 | 結構特點 |
數據幀 | 傳輸數據 | 包含幀起始、仲裁段、控制段、數據段、CRC段、應答段和幀結束,數據長度0-8字節。 |
遠程幀 | 請求其他節點發送數據 | 無數據段,仲裁段標識符用于標識請求的消息,接收節點接收到遠程幀后發送對應數據幀。 |
錯誤幀 | 檢測到錯誤時發送 | 由錯誤標志(6個連續顯性位)和錯誤界定符(8個隱性位)組成,所有節點檢測到錯誤時發送。 |
過載幀 | 通知其他節點自身接收緩沖器滿 | 用于延緩數據傳輸,由過載標志和過載界定符組成。 |
1.4標識符與優先級
CAN幀通過標識符(ID)確定優先級,ID越小優先級越高。
W55MH32支持兩種幀格式:
標準幀:11位ID。
擴展幀:29位ID。
標識符不代表節點地址,而是與消息內容相關。例如,汽車中“發動機轉速”的消息可能對應標識符0x100,所有訂閱該消息的節點均可接收。
2W55MH32的bxCAN模塊詳解
2.1功能特點
W55MH32集成的 bxCAN(Basic Extended CAN)模塊是一款高性能 CAN控制器,專為減輕 CPU負荷設計,其關鍵特性包括:
協議兼容性:完全支持CAN 2.0A和2.0B主動模式,波特率最高1Mbps。
發送處理能力:3個獨立發送郵箱,支持優先級配置和時間戳記錄(發送幀起始時刻的定時器值)。
接收管理機制:2個3級深度的接收FIFO(FIFO0和FIFO1),硬件自動管理報文存儲,減少CPU干預。
靈活的過濾系統:14個可配置的過濾器組,支持32位或16位過濾寬度,可設置為屏蔽位模式或標識符列表模式。
時間觸發通信:支持TTCM模式,內部16位定時器為報文添加時間戳,適用于對實時性要求極高的場景。
2.2硬件資源與內存映射
bxCAN模塊的硬件資源包括:
引腳連接:通過CANTX和CANRX引腳連接外部收發器(如TJA1050),總線需接120Ω終端電阻。
寄存器組:包含控制寄存器(CAN_MCR)、狀態寄存器(CAN_MSR)、發送狀態寄存器(CAN_TSR)、接收FIFO寄存器(CAN_RF0R/CAN_RF1R)等,共32個32位寄存器,地址范圍0x00至0x31C。
共享內存:與USB模塊共用512字節SRAM,用于數據收發緩沖,二者不可同時使用。
2.3時鐘與波特率
bxCAN的時鐘源自APB1總線,其波特率計算公式為:
波特率 =系統時鐘 / [2 × CAN_BRP × (CAN_SJW + 1 + CAN_BS1 + 1 + CAN_BS2 + 1)]
CAN_BRP:波特率分頻器,范圍1~1024。
CAN_SJW:重新同步跳躍寬度,決定總線相位誤差的補償能力。
CAN_BS1/CAN_BS2:時間段1和時間段2,用于定義采樣點位置和位時序。
例如,當系統時鐘為72MHz,設置CAN_BRP=9、CAN_SJW=1、CAN_BS1=6、CAN_BS2=3時,波特率為1Mbps,采樣點位于75%位時間處,兼顧抗干擾性和同步能力。
3bxCAN工作模式與狀態轉換
3.1工作模式
bxCAN支持三種主要工作模式,通過CAN_MCR寄存器配置:
初始化模式
進入條件:軟件設置CAN_MCR.INRQ=1,等待CAN_MSR.INAK=1確認。
功能:僅在此模式下可配置波特率(CAN_BTR寄存器)、過濾器組參數(位寬、模式、FIFO關聯等)。
注意事項:初始化完成后需退出該模式才能正常通信,退出時需等待總線空閑(檢測到11個連續隱性位)。
正常模式
工作狀態:支持完整的收發功能,節點與總線同步后即可發送和接收報文。
同步機制:通過檢測幀起始位(SOF)的上升沿實現位同步,后續通過重新同步調整相位誤差。
典型應用:工業控制中的數據交互、汽車ECU間的實時通信。
睡眠模式
低功耗設計:時鐘停止,僅保留喚醒邏輯,功耗顯著降低。
喚醒方式:軟件清CAN_MCR.SLEEP位,或硬件檢測到總線活動(需設置CAN_MCR.AWUM=1)。
應用場景:電池供電設備的節能模式,如車載傳感器的待機狀態。
3.2測試模式:靜默與環回
為便于開發調試,bxCAN支持兩種測試模式,需在初始化模式下配置CAN_BTR寄存器:
靜默模式(SILM=1)
特性:可接收數據幀和遠程幀,但發送時僅輸出隱性位,不影響總線狀態。
用途:用于分析總線活動,不干擾現有通信,如故障診斷時的總線監聽。
環回模式(LBKM=1)
特性:發送的報文直接在內部回環至接收端,忽略CANRX引腳輸入。
用途:自測試場景,無需外部硬件即可驗證收發功能,如模塊出廠前的自測。
環回靜默模式(SILM=1+LBKM=1)
組合特性:兼具環回和靜默功能,發送報文不影響外部總線,僅內部回環測試。
安全測試:適用于"熱自測試",避免干擾實際總線通信。
4報文發送與接收處理機制
4.1發送處理流程
bxCAN的發送流程由硬件自動管理,軟件只需配置郵箱并請求發送:
郵箱選擇:3個發送郵箱(郵箱0~2),空閑時可選擇任意郵箱。
參數配置:設置標識符(STDID/EXID)、幀類型(數據幀/遠程幀)、數據長度(DLC)和數據內容。
發送請求:置位CAN_TIxR.TXRQ位,郵箱狀態變為"掛號",等待仲裁。
仲裁與發送:仲裁成功后進入"發送中"狀態,發送完成后CAN_TSR.TXOK位置1,郵箱重置為空閑。
發送優先級規則
標識符優先:CAN_MCR.TXFP=0時,標識符數值小的報文優先發送;標識符相同時,郵箱號小的優先。
FIFO優先:CAN_MCR.TXFP=1時,按發送請求的先后順序排隊,適用于分段發送場景。
4.2接收管理與FIFO機制
接收處理通過2個3級深度FIFO實現,完全由硬件管理:
有效報文判定:正確接收(無CRC錯誤、格式錯誤等)且通過過濾器檢查的報文為有效報文。
FIFO存儲:有效報文按接收順序存入FIFO,FIFO0和FIFO1各自獨立,可通過過濾器配置關聯到不同FIFO。
狀態標識:CAN_RF0R/FIFO1R中的FMP[1:0]位指示FIFO中的報文數量(0~3),滿時FULL位被置1。
溢出處理:可配置FIFO鎖定模式(CAN_MCR.RFLM=1),此時新報文會被丟棄;否則最新報文覆蓋舊報文。
時間戳與過濾器匹配序號
時間戳:每個接收報文記錄幀起始時刻的16位定時器值,存入CAN_RDTxR.TIME[15:0],用于分析報文延遲。
過濾器匹配序號(FMI):記錄匹配的過濾器組編號,存入CAN_RDTxR.FMI[7:0],軟件可據此快速區分報文類型。
5標識符過濾系統解析
5.1過濾機制的核心價值
CAN網絡中,節點通常只關注部分報文,過濾器的作用是硬件層面篩選有效報文,減輕CPU負荷。bxCAN的過濾系統具有以下特點:
14個過濾器組:每個組可獨立配置,支持標準幀和擴展幀過濾。
可變位寬:每個組可設置為32位單過濾器或2個16位過濾器。
雙模式配置:屏蔽位模式或標識符列表模式,靈活適應不同場景。
5.2屏蔽位模式與列表模式
屏蔽位模式
工作原理:每個過濾器組包含1個標識符寄存器和1個屏蔽寄存器,屏蔽位為1的位置需嚴格匹配,為0的位置"不關心"。
典型應用:過濾一組相關報文,如標識符0x100~0x1FF的標準幀,可設置標識符為0x100,屏蔽碼為0x0FF。
標識符列表模式
工作原理:兩個寄存器均作為標識符寄存器,報文必須與其中一個完全匹配才會通過過濾。
典型應用:精確過濾特定報文,如只接收標識符為0x200的擴展幀,可設置兩個寄存器均為0x200的擴展幀格式。
5.3過濾器優先級規則
當報文匹配多個過濾器時,優先級由以下規則決定:
位寬優先:32位過濾器優先級高于16位過濾器。
模式優先:列表模式優先級高于屏蔽位模式。
編號優先:過濾器組編號小的優先級高(0-13)。
例如,32位列表模式的過濾器組0優先級高于16位屏蔽位模式的過濾器組1,確保關鍵報文優先處理。
6錯誤管理與總線健康監測
6.1錯誤檢測與計數器機制
bxCAN通過發送錯誤計數器(TEC)和接收錯誤計數器(REC)實現故障界定:
錯誤類型:支持位錯誤、填充錯誤、CRC錯誤、格式錯誤、應答錯誤等,錯誤碼存入CAN_ESR.LEC[2:0]。
計數器更新:
發送錯誤時TEC加1,接收錯誤時REC加1。
成功發送/接收時,TEC和REC減1(超過127時減至120)。
狀態轉換:
TEC或REC > 127時進入錯誤被動狀態,此時發送錯誤幀為隱性位。
TEC > 255時進入離線狀態,無法收發報文,需通過自動恢復或軟件干預重新上線。
6.2離線恢復機制
離線狀態的恢復方式由CAN_MCR.ABOM位決定:
自動恢復(ABOM=1):檢測到128次11個連續隱性位后自動恢復為錯誤主動狀態。
手動恢復(ABOM=0):軟件需先請求進入初始化模式,再退出,等待總線同步后恢復。
6.3錯誤中斷與狀態監控
通過CAN_IER寄存器可配置多種錯誤中斷:
錯誤警告中斷(EWGIE=1):TEC或REC ≥ 96時觸發,提示總線可能出現異常。
錯誤被動中斷(EPVIE=1):進入錯誤被動狀態時觸發,需關注總線穩定性。
離線中斷(BOFIE=1):進入離線狀態時觸發,需啟動恢復流程。
上次錯誤碼中斷(LECIE=1):每次錯誤時更新錯誤碼并觸發中斷,便于快速定位問題。
7應用場景
7.1工業自動化網絡
多設備協同控制:如PLC與傳感器、執行器間的實時數據交互,通過CANopen協議實現設備聯網。
抗干擾設計:采用隔離收發器(如CTM1051)和屏蔽雙絞線,總線兩端接120Ω終端電阻,降低電磁干擾影響。
7.2汽車電子系統
車載網絡:連接發動機控制單元(ECU)、ABS、儀表盤等,遵循J1939或CANopen協議。
低功耗需求:利用睡眠模式和喚醒功能,減少待機功耗,滿足汽車電源管理要求。
8注意事項
8.1硬件連接與終端配置
總線兩端必須接入120Ω終端電阻,中間節點無需額外電阻,避免阻抗不匹配導致信號反射。
工業場景建議使用隔離收發器(如CTM1051)和屏蔽雙絞線,屏蔽層單點接地以降低電磁干擾。
8.2波特率一致性配置
所有節點的波特率參數(CAN_BRP、BS1、BS2、SJW)必須完全一致,建議通過寄存器硬編碼避免計算誤差。
長距離通信(>100m)需降低波特率至50kbps以下,并將采樣點后移至80%位時間處(增大BS1參數)。
8.3過濾器與FIFO管理
未使用的過濾器組需設置為非激活狀態(CAN_FA1R對應位清0),避免無效報文占用資源。
接收FIFO需定期查詢或啟用中斷(如FMPIE),防止因軟件處理延遲導致報文溢出。
8.4錯誤處理與恢復機制
監控發送/接收錯誤計數器(TEC/REC),超過96時觸發預警,超過127時切換至降級模式。
離線恢復時,若使用手動模式(ABOM=0),需確保退出初始化模式后等待總線同步完成(CAN_MSR.INAK=0)。
8.5低功耗模式操作規范
進入睡眠模式前需確認所有發送郵箱為空(CAN_TSR.TME=1),喚醒時優先使用硬件總線活動檢測(AWUM=1)以降低功耗。
9程序設計
9.1CAN_LoopBack例程
CAN_LoopBack例程實現了CAN總線回環測試程序,通過串口接收指令控制CAN數據發送,并自動接收回環數據進行打印輸出,用于驗證CAN控制器功能。以下是實現過程和結果驗證:
9.1.1CAN初始化
CAN_Mode_Init()函數是W55MH32的CAN總線初始化函數,內容如下:
uint8_t CAN_Mode_Init(uint8_t tsjw,uint8_t tbs2,uint8_t tbs1,uint16_t brp,uint8_t mode) { GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; #if CAN_RX0_INT_ENABLE NVIC_InitTypeDef NVIC_InitStructure; #endif RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//reuse push pull GPIO_Init(GPIOB,&GPIO_InitStructure); //initialize io GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;//pull up input GPIO_Init(GPIOB,&GPIO_InitStructure); //initialize io //CAN unit settings CAN_InitStructure.CAN_TTCM= DISABLE;//non time triggered communication mode CAN_InitStructure.CAN_ABOM= DISABLE;//software automatic offline management CAN_InitStructure.CAN_AWUM= DISABLE;//Sleep mode Wake up via software (clear the SLEEP bit of CAN- > MCR) CAN_InitStructure.CAN_NART= ENABLE; //prohibit automatic transmission of messages CAN_InitStructure.CAN_RFLM= DISABLE;//message not locked new overwrite old CAN_InitStructure.CAN_TXFP= DISABLE;//priority is determined by the message identifier CAN_InitStructure.CAN_Mode= mode; //Mode settings: mode: 0, normal mode; 1, loop mode; //set baud rate CAN_InitStructure.CAN_SJW = tsjw; //Resynchronize jump width (Tsjw) to tsjw + 1 time unit CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq CAN_InitStructure.CAN_BS1 = tbs1; //Tbs1=tbs1+1 unit of timeCAN_BS1_1tq ~CAN_BS1_ CAN_InitStructure.CAN_BS2 = tbs2; //Tbs2=tbs2+1 unit of timeCAN_BS2_1tq ~ CAN_ CAN_InitStructure.CAN_Prescaler= brp; //The frequency division factor (Fdiv) is brp + 1 CAN_Init(CAN1,&CAN_InitStructure); //Initialize CAN1 CAN_FilterInitStructure.CAN_FilterNumber =0; //filter0 CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;//shielding mode CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;//32 bit width CAN_FilterInitStructure.CAN_FilterIdHigh =0x0000; //32 bit id CAN_FilterInitStructure.CAN_FilterIdLow =0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh =0x0000; //32 bit mask CAN_FilterInitStructure.CAN_FilterMaskIdLow =0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; //filter 0 is associated with fifo0 CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //activate filter 0 CAN_FilterInit(&CAN_FilterInitStructure); //filter initialization #if CAN_RX0_INT_ENABLE CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);//FIFO0 message registration interruption allowed. NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;// the primary priority is 1 NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;// the secondary priority is 0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); #endif return0; }
該函數通過配置GPIOB引腳(PB8接收上拉、PB9發送復用)和CAN1控制器,設置工作模式(含回環測試)、位時序參數(同步段、位段1/2、分頻系數)以確定波特率,使用32位ID屏蔽過濾器接收所有消息,并可選擇性開啟FIFO0中斷(需定義CAN_RX0_INT_ENABLE),最終完成CAN總線的初始化配置,為通信做準備。
9.1.2CAN數據發送
Can_Send_Msg()為CAN總線數據發送函數:
uint8_tCan_Send_Msg(uint8_t*msg,uint8_t len) { uint8_t mbox; uint16_t i=0; CanTxMsgTxMessage; TxMessage.StdId=0x12; // standard identifier TxMessage.ExtId=0x12; // set extension identifier TxMessage.IDE = CAN_Id_Standard;// standard frame TxMessage.RTR = CAN_RTR_Data; // data frame TxMessage.DLC = len; // the length of the data to be sent for(i=0; i< len; i++) TxMessage.Data[i]?= msg[i]; mbox?= CAN_Transmit(CAN1,?&TxMessage); i? =?0; while?((CAN_TransmitStatus(CAN1, mbox)?== CAN_TxStatus_Failed)?&&?(i??0XFFF)) i++;?//waiting for the end of sending if?(i??>=0XFFF)return1; return0; }
此程序首先配置CAN幀參數(標準ID為0x12、標準數據幀、數據長度由參數指定),將待發送數據填充至發送緩沖區,然后調用發送函數并通過郵箱狀態輪詢機制(最多等待0XFFF次)確認發送結果,最終返回成功(0)或失敗(1)。
9.1.3CAN數據接收
Can_Receive_Msg()為CAN總線數據接收函數:
uint8_tCan_Receive_Msg(u8*buf) { uint32_t i; CanRxMsgRxMessage; if(CAN_MessagePending(CAN1, CAN_FIFO0)==0)return0;//no data received exit directly CAN_Receive(CAN1, CAN_FIFO0,&RxMessage); //read data for(i=0; i?8; i++) buf[i]?=?RxMessage.Data[i]; return?RxMessage.DLC; }
通過檢查CAN1的FIFO0接收緩沖區狀態,若有數據則讀取CAN幀信息(含ID、數據等),將有效數據(最多8字節)復制到用戶緩沖區,并返回實際數據長度(DLC),若無數據則直接返回0,實現了簡潔的非阻塞式CAN數據接收功能。
9.1.4串口接收
GetCmd()為USART1串口單字符接收函數:
uint8_tGetCmd(void) { uint8_t tmp=0; if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)) { tmp= USART_ReceiveData(USART1); } return tmp; }
通過檢查接收緩沖區非空標志位(RXNE)判斷是否有數據可讀,若有則讀取并返回接收到的字符(8位),若無則返回0。
9.1.5主程序
main()函數為CAN總線回環測試主程序:
int main(void) { uint8_t res, i, key; uint8_t canbuf[8]; RCC_ClocksTypeDef clocks; delay_init(); UART_Configuration(115200); RCC_GetClocksFreq(&clocks); printf("n"); printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhzn", (float)clocks.SYSCLK_Frequency /1000000,(float)clocks.HCLK_Frequency/1000000, (float)clocks.PCLK1_Frequency /1000000,(float)clocks.PCLK2_Frequency/1000000,(float)clocks.ADCCLK_Frequency/1000000); printf("CAN LoopBack Test.n"); CAN_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_9tq,4, CAN_Mode_LoopBack);//CAN initialize loopback mode,baud rate 500Kbps while(1) { if(GetCmd()=='s') { for(i=0; i< DATA_LEN; i++) { canbuf[i]?=?0x5A?+ i; } res?=?Can_Send_Msg(canbuf,?8);?//send 8 bytes if?(res?==?0) printf("Can Loop Back Send Data Successn"); else printf("Can Loop Back Send Data Failn"); } key?=?Can_Receive_Msg(canbuf); if?(key) { printf("Can Loop Back Recv Data Successn"); for?(i?=?0; i?< key; i++) { printf("canbuf[%d] = 0x%xn", i, canbuf[i]); } } } }
通過初始化系統時鐘、UART1和CAN控制器(配置為回環模式,波特率500Kbps),在主循環中監聽串口輸入,當接收到“s”字符時發送8字節測試數據(0x5A~0x61),并持續檢查CAN接收緩沖區,若收到數據則打印內容,實現自收自發的通信驗證。
9.1.6下載驗證
程序下載運行后,首先打印了系統各時鐘的頻率和示例名稱,我們手動通過串口發送“s”之后,W55MH32便會通過CAN接口發送數據并接收來實現回環測試。發送和接收成功后都會打印出對應的提示信息,接收成功后同時也會將接收緩沖區的內容打印出來:
9.2CAN_Normal例程
CAN_Normal是CAN總線正常模式通信測試程序,與回環測試不同,它需通過物理總線與外部CAN節點通信。該例程除了CAN初始化的CAN模式參數變成的CAN_Mode_Normal之外,CAN初始化函數內容、發送、接收函數、主程序等與CAN_LoopBack例程保持一致。改動如下:
CAN_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_9tq,4, CAN_Mode_Normal);//baud rate 500Kbps
9.2.1下載驗證
程序下載運行后,首先打印了系統各時鐘的頻率和示例名稱,通過串口發送“s”后,W55MH32便會通過CAN接口發送數據,發送成功后串口打印“Can Normal Send Data Success”的信息:
10總結
本文聚焦W55MH32的bxCAN模塊,詳解CAN通信核心內容。先介紹CAN協議特性與幀結構,再解析bxCAN的發送郵箱、接收FIFO及工作模式,接著闡述收發機制、過濾規則、錯誤管理和波特率配置,最后從硬件連接、參數匹配、過濾配置等方面給出示例程序以及講解,幫助大家理解CAN的使用。
WIZnet是一家無晶圓廠半導體公司,成立于1998年。產品包括互聯網處理器iMCU?,它采用TOE(TCP/IP卸載引擎)技術,基于獨特的專利全硬連線TCP/IP。iMCU?面向各種應用中的嵌入式互聯網設備。
WIZnet在全球擁有70多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
控制器
+關注
關注
114文章
17066瀏覽量
183723 -
CAN
+關注
關注
57文章
2908瀏覽量
467361 -
WIZnet
+關注
關注
3文章
20瀏覽量
42424
發布評論請先 登錄
開關量對傳控制器,局域網通訊,應用廣泛
局域網開關對傳控制器:無需設置,即裝即用
MAX13041具有±80V故障保護的高速CAN收發器,提供低功耗管理和CAN喚醒功能技術手冊

局域網的連接設備有哪些類型
CAN總線控制器的工作原理
SIT2515帶SPI接口的獨立局域網(CAN)控制器中文手冊
CAN總線應用常見問題

CAN BUS芯片靜電浪涌擊穿整改方案

HVDA551-Q1/HVDA553-Q1 5V控制器局域網(CAN)收發器數據表

低功率網絡控制器局域網絡(CAN)收發器SN65HVD1040-HT數據表

評論