【經(jīng)驗(yàn)】如何進(jìn)行單片機(jī)TwinCAN調(diào)試
1、 幀類型
(1) 數(shù)據(jù)幀:數(shù)據(jù)幀將數(shù)據(jù)從發(fā)送器傳輸?shù)浇邮掌?/p>
(2) 遠(yuǎn)程幀:總線單元發(fā)出遠(yuǎn)程幀,請(qǐng)求發(fā)送具有同一標(biāo)識(shí)符的數(shù)據(jù)幀。/ MSGDRn4。
(3) 錯(cuò)誤幀:任何單元檢測(cè)到總線錯(cuò)誤就發(fā)出錯(cuò)誤幀
(4) 過(guò)載幀:過(guò)載幀用于在先行和后續(xù)數(shù)據(jù)幀(或遠(yuǎn)程幀)之間提供一附加的延時(shí)。
數(shù)據(jù)幀和遠(yuǎn)程幀即可使用標(biāo)準(zhǔn)幀,也可使用擴(kuò)展幀。
2、 幀格式介紹
1 數(shù)據(jù)幀
數(shù)據(jù)幀由7個(gè)不同的位場(chǎng)組成,即幀起始、仲裁場(chǎng)、控制場(chǎng)、數(shù)據(jù)場(chǎng)、CRC場(chǎng)、應(yīng)答場(chǎng)、幀結(jié)束。
2 遠(yuǎn)程幀
遠(yuǎn)程幀由6個(gè)不同的位場(chǎng)組成,即幀起始、仲裁場(chǎng)、控制場(chǎng)、CRC場(chǎng)、應(yīng)答場(chǎng)、幀結(jié)束。
3 錯(cuò)誤幀
錯(cuò)誤幀由兩個(gè)不同的場(chǎng)組成。第一個(gè)場(chǎng)是錯(cuò)誤標(biāo)志,用做為不同站提供錯(cuò)誤標(biāo)志的疊加;第二個(gè)場(chǎng)是錯(cuò)誤界定符。
4 超載幀
超載幀包括兩個(gè)位場(chǎng):超載標(biāo)志和超載界定符。
3、 報(bào)文路由:報(bào)文的內(nèi)容由識(shí)別符命名。識(shí)別符不指出報(bào)文的目的地,但解釋數(shù)據(jù)的含義。因此,網(wǎng)絡(luò)上所有的節(jié)點(diǎn)可以通過(guò)報(bào)文濾波確定是否應(yīng)對(duì)該數(shù)據(jù)做出反應(yīng)。
4、 不同的系統(tǒng),CAN 的速度不同。可是,在一給定的系統(tǒng)里,位速率是唯一的,并且是固定的。
5、 該模塊分為兩個(gè)節(jié)點(diǎn),NODE A和NODE B,32個(gè)對(duì)象可以通過(guò)MSGCFGHn.NODE位來(lái)分別選擇將該對(duì)象分配到哪個(gè)節(jié)點(diǎn)。
6、 該32個(gè)報(bào)文對(duì)象只能作為接受對(duì)象或發(fā)送對(duì)象,不能在接收和發(fā)送之間轉(zhuǎn)換。作為接收對(duì)象的必須在初始化的時(shí)候首先將其配置成接收對(duì)象。
7、 回環(huán)模式可方便的用于調(diào)試,ABTR.LBM = 1和BBTR.LBM = 1,使能回環(huán)模式。在回環(huán)模式下,屬于節(jié)點(diǎn)A的對(duì)象發(fā)送的報(bào)文只能由屬于節(jié)點(diǎn)B的對(duì)象接受,反之亦如此。
8、 報(bào)文接收時(shí)可對(duì)所接收的報(bào)文進(jìn)行驗(yàn)收濾波,稱為報(bào)文標(biāo)識(shí)符驗(yàn)收濾波。它們分別通過(guò)仲裁寄存器(MSGARHn,MSGARLn)(ID)和驗(yàn)收屏蔽寄存器(MSGAMRHn,MSGAMRLn)設(shè)置實(shí)現(xiàn)。具體過(guò)程如下:
9、 幾個(gè)結(jié)構(gòu)體的說(shuō)明:
(1) 該寄存器用于軟件編程,說(shuō)明如下
typedef struct
{
uword ; // 消息配置寄存器
ulong ulID; // 擴(kuò)展標(biāo)識(shí) (29-bit)
ulong ulMask; // 標(biāo)準(zhǔn)驗(yàn)收屏蔽(11-bit)/擴(kuò)展驗(yàn)收屏蔽 (29-bit)
ubyte ubData[8]; // 八個(gè)字節(jié)數(shù)據(jù)
uword uwCounter; // 當(dāng)前接收對(duì)象接收到數(shù)據(jù)的幀數(shù)CAN_BFCRL或//CAN_AFCRL
}TCAN_SWObj;
uwMsgCfg一般用到低字節(jié),各位代表的意義如下:
7 6 5 4 3 2 1 0
|-----------------------------------------------------------------------|
| DLC | DIR | XTD | NODE | RMM |
|------------------------------------------------------------------------|
(2) 每個(gè)CAN對(duì)象寄存器結(jié)構(gòu)體
struct stCanObj
{
ubyte ubData[8]; // Message Data 0..7
ulong ulCANAR; // Arbitration Register
ulong ulCANAMR; // Acceptance Mask Register
uword uwMSGCTR; // Message Control Register
uword uwCounter; // Frame Counter
uword uwMSGCFG; // Message Configuration Register
uword uwINP; // Interrupt Node Pointer
uword uwCANFCR; // FIFO / Gateway Control Register
uword uwCANPTR; // FIFO Pointer
ulong ulReserved; // Reserved
};
10、 幾個(gè)重要寄存器的意義:
n.RXIE報(bào)文對(duì)象接收中斷使能(=10)
.TXIE----報(bào)文對(duì)象發(fā)送中斷使能(=10)
(3) MSGCTRHn.MSGVAL---報(bào)文對(duì)象有效(=10)
(4) MSGCTRHn.NEWDAT---報(bào)文對(duì)象中數(shù)據(jù)已更新(=10)
(5) MSGCTRHn.MSGLST---NEWDAT仍然置位,CAN控制器已將報(bào)文保存到該報(bào)文對(duì)象中,而先前的報(bào)文丟失(=10),僅用于接受
(6) MSGCTRHn.CPUUPD---報(bào)文對(duì)象自動(dòng)發(fā)送被禁止(=10);可由CAN控制器自動(dòng)發(fā)送報(bào)文對(duì)象中的數(shù)據(jù)(=01)
(7) MSGCTRHn.TXRQ---CPU或遠(yuǎn)程幀請(qǐng)求的報(bào)文對(duì)象數(shù)據(jù)發(fā)送被掛起(=10)。報(bào)文成功發(fā)送后,TXRQ自動(dòng)復(fù)位;如果存在幾個(gè)有效的報(bào)文對(duì)象又掛起的發(fā)送請(qǐng)求,報(bào)文編號(hào)最低的報(bào)文對(duì)象將被首先發(fā)送
(8) MSGCTRHn.RMTPND---遠(yuǎn)程節(jié)點(diǎn)請(qǐng)求報(bào)文對(duì)象數(shù)據(jù)發(fā)送,但數(shù)據(jù)并未發(fā)送。當(dāng)RMTPND被置位時(shí),CAN節(jié)點(diǎn)控制器也置位TXRQ.
.RMM---該發(fā)送報(bào)文對(duì)象的遠(yuǎn)程監(jiān)控模式被使能。帶匹配標(biāo)識(shí)符遠(yuǎn)程幀的標(biāo)識(shí)符和DLC碼被復(fù)制到發(fā)送報(bào)文對(duì)象中,以監(jiān)控輸入的遠(yuǎn)程幀。該位僅對(duì)發(fā)送報(bào)文有效,對(duì)接受報(bào)文無(wú)影響。
(2) MSGCFGHn.NODE---報(bào)文對(duì)象CAN節(jié)點(diǎn)選擇,0=A,1=B
(3) MSGCFGHn.XTD-----報(bào)文對(duì)象擴(kuò)展標(biāo)識(shí)符,1=11位,0=29位
(4) MSGCFGHn.DIR------報(bào)文對(duì)象方向控制,0=定義該報(bào)文為發(fā)送對(duì)象,1=定義該報(bào)文為接受對(duì)象
(5) MSGCFGHn.DLC-----報(bào)文對(duì)象數(shù)據(jù)長(zhǎng)度碼
(6) MSGCFGHn.RXINP/TXINP---分別為接收/發(fā)送中斷節(jié)點(diǎn)指針,0~7
11、 發(fā)送后一定要判斷TXOK時(shí)候置位,確保在發(fā)送下一組數(shù)據(jù)之前將數(shù)據(jù)發(fā)送完成
12、 附程序:
H
#ifndef _CAN_H_
#define _CAN_H_
// The following data type serves as a software message object. Each access to
// a hardware message object has to be made by forward a pointer to a software
// message object (TCAN_SWObj). The data type has the following fields:
//
// uwMsgCfg:
// this byte has the same structure as the message configuration register of a
// hardware message object. It contains the "Data Lenght Code" (DLC), the
// "Extended Identifier" (XTD), the "Message Direction" (DIR), the "Node
// Select" and the "Remote Monitoring Mode".
//
//
// 7 6 5 4 3 2 1 0
// |------------------------------------------------|
// | DLC | DIR | XTD | NODE | RMM |
// |------------------------------------------------|
//
// ulID:
// this field is four bytes long and contains either the 11-bit identifier
// or the 29-bit identifier
//
// ulMask:
// this field is four bytes long and contains either the 11-bit mask
// or the 29-bit mask
//
// ubData[8]:
// 8 bytes containing the data of a frame
//
// uwCounter:
// this field is two bytes long and contains the counter value
//
typedef struct
{
uword uwMsgCfg; // Message Configuration Register
ulong ulID; // standard (11-bit)/extended (29-bit) identifier
ulong ulMask; // standard (11-bit)/extended (29-bit) mask
ubyte ubData[8]; // 8-bit Data Bytes
uword uwCounter; // Frame Counter
}TCAN_SWObj;
void CAN_vInit(void);
void CAN_vGetMsgObj(ubyte ubObjNr, TCAN_SWObj *pstObj);
ubyte CAN_ubRequestMsgObj(ubyte ubObjNr);
ubyte CAN_ubNewData(ubyte ubObjNr);
void CAN_vTransmit(ubyte ubObjNr);
void CAN_vConfigMsgObj(ubyte ubObjNr, TCAN_SWObj *pstObj);
void CAN_vLoadData(ubyte ubObjNr, ubyte *pubData);
ubyte CAN_ubMsgLost(ubyte ubObjNr);
ubyte CAN_ubDelMsgObj(ubyte ubObjNr);
void CAN_vReleaseObj(ubyte ubObjNr);
void CAN_vSetMSGVAL(ubyte ubObjNr);
// USER CODE BEGIN (CAN_Header,8)
//發(fā)送一幀數(shù)據(jù)
void CAN_vSend1Frame(unsigned char ObjNr, unsigned char XTD, unsigned long ID, unsigned char *DataBuf, unsigned char LEN);
//發(fā)送N個(gè)字節(jié)
void CAN_vSendDataN(unsigned char ObjNr, unsigned char XTD, unsigned long ID, unsigned char *DataBuf, unsigned char LEN);
//報(bào)文對(duì)象初始化
TCAN_SWObj Init_vSWObj(TCAN_SWObj pstObj);
//接收?qǐng)?bào)文函數(shù)
void CAN_vReveiveMsgObj(ubyte ubObjNr, TCAN_SWObj pstObj);
// USER CODE END
#define CAN_SRN0INT 0x54
#endif // ifndef _CAN_H_
(2) CAN.C
#include "MAIN.H"
extern unsigned char data2[8] ;
extern unsigned char j;
extern unsigned int num;
unsigned char dataa[8] = {0x0a,0x1a,0x2a,0x3a,0x4a,0x5a,0x6a,0x7a};





