tSCL=BRP×2tCLK=2BPR/fCLK
對(duì)CAN 位定時(shí)計(jì)算的另一個(gè)很重要的時(shí)間段是同步跳轉(zhuǎn)寬度(SJW),持續(xù)時(shí)間是tSJW。SJW段并不是位周期的一段,只是定義了在重同步事件中被增長(zhǎng)或縮短的位周期的最大TQ數(shù)量。此外,CAN協(xié)議還允許用戶指定位采樣模式(SAM),分別是單次采樣和三次采樣模式(在3個(gè)采樣結(jié)果中選出1個(gè))。在單次采樣模式中,采樣點(diǎn)在TESG1段的末端。而三次采樣模式比單次采樣多取兩個(gè)采樣點(diǎn),它們?cè)赥SEG1段末端的前面,之間相差一個(gè)TQ。

上面所提到的BPR、SJW、SAM、TESG1、TESG2都可由用戶通過(guò)CAN控制器的內(nèi)裝中寄存器BTR0和BTR1來(lái)定義。具體如圖3所示。設(shè)置好BTR0和BTR1后,實(shí)際傳輸?shù)牟ㄌ芈史秶鸀椋?/p>
最大=1/(tBit-tSJW),最小=1/(tBit+tSJW)
3.2 串口波特率檢測(cè)
當(dāng)串口設(shè)備是主機(jī)時(shí),如需檢測(cè)此時(shí)轉(zhuǎn)換裝置的串口波特率,首先可對(duì)主機(jī)的接收波特率(以9600波特為例)進(jìn)行設(shè)定,并在終端發(fā)送一個(gè)特定的字符(以回車符為例),這樣,主機(jī)根據(jù)接收到的字符信息就可以確定轉(zhuǎn)換裝置的通信波特率;剀嚪腁SCII值是0DH,在不同波特率下接收到的值如表2所列。
表2 不同波特率下接收的字節(jié)
點(diǎn)擊看原圖
3.3 串口流控制
此處講到的“流“指的是數(shù)據(jù)流。數(shù)據(jù)在兩個(gè)串口之間的傳輸時(shí),常常會(huì)出現(xiàn)丟失數(shù)據(jù)的現(xiàn)象。由于單片機(jī)緩沖區(qū)有限,如接收數(shù)據(jù)時(shí)緩沖區(qū)已滿,那么此時(shí)繼續(xù)發(fā)送來(lái)的數(shù)據(jù)就會(huì)丟失。而流控制能有效地解決該問(wèn)題,當(dāng)接收端數(shù)據(jù)處理不過(guò)來(lái)時(shí),流控制系統(tǒng)就會(huì)發(fā)出“不再接收”的信號(hào),而使發(fā)送端停止發(fā)送,直到收到“可以繼續(xù)發(fā)送”的信號(hào)再發(fā)送數(shù)據(jù)。因此流控制可以控制數(shù)據(jù)傳輸?shù)倪M(jìn)程,防止數(shù)據(jù)丟失。常用的兩種流控制是硬件流控制(包括RTS/CTS、DTR/CTS等)和軟件流控制XON/XOFF(繼續(xù)/停止),下面僅就硬件流控制RTS/CTS加以說(shuō)明。
采用硬件進(jìn)行流控制時(shí),串口終端RTS、CTS接到單片機(jī)的I/O口,通過(guò)置I/O口為1或0來(lái)接收和發(fā)出起停信號(hào)。數(shù)據(jù)終端設(shè)備(如計(jì)算機(jī))使用RTS來(lái)起始單片機(jī)發(fā)出的數(shù)據(jù)流,而單片機(jī)則用CTS來(lái)起動(dòng)和暫停來(lái)自計(jì)算機(jī)的數(shù)據(jù)流。實(shí)現(xiàn)這種硬件握手方式時(shí),在編程時(shí)根據(jù)接收端緩沖區(qū)的大小設(shè)置一個(gè)高位標(biāo)志和一個(gè)低位標(biāo)志,當(dāng)緩沖區(qū)內(nèi)數(shù)據(jù)量達(dá)到高位時(shí),就在接收端將CTS線置低(送邏輯0),而當(dāng)發(fā)送端的程序檢測(cè)到CTS為低后,就停止發(fā)送數(shù)據(jù),直到接收端緩沖區(qū)的數(shù)據(jù)量低于低位而將CTS置高為止。RTS則用來(lái)標(biāo)明接收設(shè)備有沒(méi)有準(zhǔn)確好接收數(shù)據(jù)。
3.4 CAN接收子程序
PeliCAN 格式既可以發(fā)送標(biāo)準(zhǔn)幀也可以送擴(kuò)展幀,利用時(shí)鐘分頻寄存器中的CDR.7可以調(diào)協(xié)CAN模式(0-BasicCAN,1-PeliCAN),接收CAN數(shù)據(jù)時(shí),可根據(jù)幀信息中的FF位來(lái)判斷是標(biāo)準(zhǔn)幀還是擴(kuò)展幀,并且RTR位來(lái)判斷是遠(yuǎn)程幀還是數(shù)據(jù)幀。以下是CAN接收子程序:
;////////////////////////////////////////////////





