基于STM32,低速CAN通信的收發(fā)器芯片選擇問(wèn)題
本電路系統(tǒng)第一版測(cè)試電路使用的CAN收發(fā)器芯片為philips公司生產(chǎn)的TJA1050,電路參考了戰(zhàn)艦STM32開(kāi)發(fā)版的電路,如下圖。
電路測(cè)試沒(méi)有問(wèn)題,但是性能不能滿足工程要求。經(jīng)測(cè)試在STM32F103C8T6芯片上,工作于24MHZ,在代碼中設(shè)置SJW,BS2,BS1,BRP分別為1,8,7,125時(shí)可以實(shí)現(xiàn)12kbps的速率,可正常發(fā)送與接收數(shù)據(jù)。在外部條件最優(yōu)的前提下,12kbps約對(duì)應(yīng)于5KM的理論通信距離,這顯然距離CAN的5kbps對(duì)應(yīng)的10KM距離還有一定差距?,F(xiàn)如今,最低通信速率為1,8,7,128配置下的波特率,如果再低則無(wú)法正常通信。為達(dá)到更遠(yuǎn)通信距離的目的,我們必須想辦法將通信速率降下來(lái)。
開(kāi)始以為是MCU有問(wèn)題,后來(lái)?yè)Q了其他型號(hào),發(fā)現(xiàn)問(wèn)題一直存在。查資料之后,發(fā)現(xiàn)是CAN收發(fā)器限制了通信速率。
策略:尋策略:找其他替代CAN收發(fā)器
據(jù)在網(wǎng)上查詢,收發(fā)芯片都有速度限制
TJA1050 >60kb/s此數(shù)據(jù)為官網(wǎng)datasheet提供數(shù)據(jù),貌似有問(wèn)題,親測(cè)12kbps通信無(wú)問(wèn)題
TJA1040>40kb/s此芯片沒(méi)實(shí)際測(cè)試過(guò),具體限制未知
MCP2551 >16kb/s此芯片沒(méi)實(shí)際測(cè)試過(guò),具體限制未知
65HVD230 >60kb/s此芯片沒(méi)實(shí)際測(cè)試過(guò),具體限制未知
SN65HVD232兼容3.3VI/O,參數(shù)未知,未提到速度限制,或者是我沒(méi)找到。
TJA1054T<125kb/s速度滿足,但最多只能連接32節(jié)點(diǎn),電路復(fù)雜
CTM1050 40kbps—1Mbps可接110節(jié)點(diǎn),但有低速限制,未實(shí)測(cè)
猜測(cè)速度與連接節(jié)點(diǎn)之間相互限制,高速收發(fā)器可連接110節(jié)點(diǎn),但無(wú)法實(shí)現(xiàn)低速;低速收發(fā)器可實(shí)現(xiàn)低速,卻不能連接過(guò)多節(jié)點(diǎn)。據(jù)網(wǎng)上說(shuō),PCA82C250等老版芯片無(wú)速度限制,但不知連接節(jié)點(diǎn)數(shù)目和抗干擾性能如何。
后某網(wǎng)友提示,其親測(cè)PCA82C250沒(méi)有低速限制,且兼容3.3VI/O。遂購(gòu)買(mǎi)PCA82C250和PCA82C251各5片,測(cè)試,PCA82C251無(wú)法兼容3.3VI/O,但是PCA82C250兼容!將PCA82C250直接替換TJA1050(就在第一版終端測(cè)試電路上),測(cè)試可正常收發(fā)數(shù)據(jù)。由于第一版電路下載比較特殊,在替換之后無(wú)法下載。故,未測(cè)試PCA82C250是否能實(shí)現(xiàn)低速CAN收發(fā)。
據(jù)查詢,許多CAN收發(fā)器要求TXD和RXD端為5VI/O,如PCA82C250、PCA82C251等。若要與STM32連接,需接隔離器,或者說(shuō)是電平轉(zhuǎn)換器。
最后,經(jīng)過(guò)實(shí)測(cè),PCA82C250可以兼容3.3VI/O(數(shù)據(jù)資料提示不兼容,實(shí)測(cè)兼容),PCA82C251不兼容3.3VI/O
另外,測(cè)試發(fā)現(xiàn)在低速情況下(10Kbps)以TJA1050、PCA82C250作為收發(fā)芯片,TJA1050端可收數(shù)據(jù),不能發(fā)。MCU同為STM32C8T6,如果收發(fā)芯片兩端均為PCA82C250,測(cè)試5kbps可相互通信。未測(cè)試更低速率情況是否可以正常通信,但250的datasheet上沒(méi)有寫(xiě)速率限制,理論上應(yīng)該是0--1Mbps。
其他經(jīng)驗(yàn):
LOOPBACK正常但NORMAL不正常。這個(gè)是由于CAN總線在發(fā)送出錯(cuò)達(dá)到一定數(shù)量的時(shí)候(128?)會(huì)自動(dòng)關(guān)閉這個(gè)節(jié)點(diǎn)來(lái)保護(hù)整個(gè)總線不被堵死。
如果只有一個(gè)節(jié)點(diǎn)的話,一下子就busoff了,當(dāng)然是看不到波形的。我用的設(shè)置程序帖下面,LZ可以參考一下,已經(jīng)調(diào)通了。另外CAN_InitStructure.CAN_ABOM=DISABLE;這句是我當(dāng)時(shí)busoff的主因。