HK32系列替代ST32系列的CAN應(yīng)用常見的問題以及解決方法
航順HK32F系列MCU都采用的是ARM®Cortex內(nèi)核架構(gòu),其中HK32F103家族使用的是Cortex-M3內(nèi)核,支持96M的系統(tǒng)時鐘,內(nèi)部資源以及外設(shè)豐富,其內(nèi)部自帶的CAN模塊應(yīng)用非常廣泛。工業(yè)類,汽車電子產(chǎn)品大部分需要用到CAN通訊協(xié)議,并且采用正向設(shè)計軟硬件全兼容國外進口產(chǎn)品,本節(jié)就針對航順HK32F103x8xB系列MCU 的CAN應(yīng)用差異部分做個說明。
CAN是控制器局域網(wǎng)絡(luò)(Controller Area Network, CAN)的簡稱,是由以研發(fā)和生產(chǎn)汽車電子產(chǎn)品著稱的德國BOSCH公司開發(fā)的,并最終成為國際標準(ISO 11898),是國際上應(yīng)用最廣泛的現(xiàn)場總線之一。在北美和西歐,CAN總線協(xié)議已經(jīng)成為汽車計算機控制系統(tǒng)和嵌入式工業(yè)控制局域網(wǎng)的標準總線,并且擁有以CAN為底層協(xié)議專為大型貨車和重工機械車輛設(shè)計的J1939協(xié)議。
CAN總線的特點:
(1)它是一種多主總線,即每個節(jié)點機均可成為主機,且節(jié)點機之間也可進行通信。(2)通信介質(zhì)可以是雙絞線、同軸電纜或光導(dǎo)纖維,通信速率可達1mb/s。
(3)CAN總線通信接口中集成了CAN協(xié)議的物理層和數(shù)據(jù)鏈路層功能,可完成對通信數(shù)據(jù)的成幀處理,包括位填充、數(shù)據(jù)塊編碼、循環(huán)冗余校驗、優(yōu)先級判別等項工作。
(4)CAN協(xié)議的一個最大特點是廢除了傳統(tǒng)的站地址編碼,代之以對通信數(shù)據(jù)塊進行編碼。采用這種方法的優(yōu)點是可使網(wǎng)絡(luò)內(nèi)的節(jié)點個數(shù)在理論上不受限制,數(shù)據(jù)塊的標識碼可由11位或29位二進制數(shù)組成,因此可以定義211或229個不同的數(shù)據(jù)塊,這種數(shù)據(jù)塊編碼方式,還可使不同的節(jié)點同時接收到相同的數(shù)據(jù),這一點在分步式控制中非常重要。
(5)數(shù)據(jù)段長度最多為8個字節(jié),可滿足通常工業(yè)領(lǐng)域中控制命令、工作狀態(tài)及測試數(shù)據(jù)的一般要求。同時,8個字節(jié)不會占用總線時間過長,從而佐證了通信的實時性。
(6)CAN協(xié)議采用crc檢驗并可提供相應(yīng)的錯誤處理功能,保證了數(shù)據(jù)通信的可靠性。CAN總線所具有的卓越性能、極高的可靠性和獨特設(shè)計,特別適合工業(yè)設(shè)備測控單元互連。因此備受工業(yè)界的重視,并已公認為最有前途的現(xiàn)場總線之一。
以下為用戶使用HK芯片替代S*M 系列的CAN應(yīng)用常見的問題
CAN 環(huán)回測試失敗
MXCube 比較老的版本(比如 4.17.0),產(chǎn)生的 CAN 初始化代碼不正確。
錯誤如下:
while(HAL_IS_BIT_CLR(hcan->Instance->MSR, CAN_MSR_INAK))
……
while(HAL_IS_BIT_SET(hcan->Instance->MSR, CAN_MSR_INAK))
解決方案:
1.確認庫版本,經(jīng)過我們測試發(fā)現(xiàn),這2個判斷順序反了,MXCube4.22.0產(chǎn)生的CAN初始化代碼已經(jīng)交換過來了
CAN 初始化不能完成
CAN總線在沒有數(shù)據(jù)發(fā)送時,默認為隱性。對于我們芯片CANRX就應(yīng)該是高電平,如果CAN網(wǎng)絡(luò)出現(xiàn)異常,將總線拉成顯性,或者,測試中CANRX接口沒有接PHY芯片,也沒有接上拉電阻,我們芯片都會出現(xiàn)CAN初始化不能完成,S*T*M32F103相同條件下可以初始化完成。
根本原因:
我們芯片在初始化過程中會判斷總線的隱性狀態(tài),如果不是隱性,不能完成初始化。
解決方案:
1. CANRX 必須接上拉電阻或內(nèi)部上拉。
MSR寄存器INAK 置位慢
客戶使用CAN接口標準庫,初始化CAN控制器,HK32F103在INRQ置位后,INAK并沒有立即置1,導(dǎo)致客戶代碼進入Fail,后續(xù)初始化程序沒有運行到。
客戶原始代碼如下:
/* Request initialisation */
CAN->MCR = CAN_MCR_INRQ;
/* ...and check acknowledged */
if ((CAN->MSR & CAN_MSR_INAK) == 0)
{
InitStatus = CANINITFAILED;
}
else
{初始化CAN控制器的寄存器}
推薦方案:在設(shè)置INRQ后,延時等待檢查INAK=1后,再進行初始化。
/* Request initialisation */
CAN->MCR = CAN_MCR_INRQ;
while((CAN->MSR & CAN_MSR_INAK) ==0)
{
i++;
if(i>100)return CANINITFAILED;
}
/* ...and check acknowledged */
if ((CAN->MSR & CAN_MSR_INAK) == 0)
{
InitStatus = CANINITFAILED;
}
else
{初始化CAN控制器的寄存器
}
根本原因:
HK32F103在INRQ置位后,INAK需要98個PCLK才會被置1。
航順F1系列專用函數(shù)庫以及S*M最新的標準庫都是加了延時了。
編輯:admin 最后修改時間:2022-03-25