XC164單片機TwinCAN模塊調(diào)試心得
1、 幀類型
(1) 數(shù)據(jù)幀:數(shù)據(jù)幀將數(shù)據(jù)從發(fā)送器傳輸?shù)浇邮掌?/p>
(2) 遠程幀:總線單元發(fā)出遠程幀,請求發(fā)送具有同一標識符的數(shù)據(jù)幀。/ MSGDRn4。
(3) 錯誤幀:任何單元檢測到總線錯誤就發(fā)出錯誤幀
(4) 過載幀:過載幀用于在先行和后續(xù)數(shù)據(jù)幀(或遠程幀)之間提供一附加的延時。
數(shù)據(jù)幀和遠程幀即可使用標準幀,也可使用擴展幀。
2、 幀格式介紹
1 數(shù)據(jù)幀
數(shù)據(jù)幀由7個不同的位場組成,即幀起始、仲裁場、控制場、數(shù)據(jù)場、CRC場、應答場、幀結束。
2 遠程幀
遠程幀由6個不同的位場組成,即幀起始、仲裁場、控制場、CRC場、應答場、幀結束。
3 錯誤幀
錯誤幀由兩個不同的場組成。第一個場是錯誤標志,用做為不同站提供錯誤標志的疊加;第二個場是錯誤界定符。
4 超載幀
超載幀包括兩個位場:超載標志和超載界定符。
3、 報文路由:報文的內(nèi)容由識別符命名。識別符不指出報文的目的地,但解釋數(shù)據(jù)的含義。因此,網(wǎng)絡上所有的節(jié)點可以通過報文濾波確定是否應對該數(shù)據(jù)做出反應。
4、 不同的系統(tǒng),CAN 的速度不同??墒?,在一給定的系統(tǒng)里,位速率是唯一的,并且是固定的。
5、 該模塊分為兩個節(jié)點,NODE A和NODE B,32個對象可以通過MSGCFGHn.NODE位來分別選擇將該對象分配到哪個節(jié)點。
6、 該32個報文對象只能作為接受對象或發(fā)送對象,不能在接收和發(fā)送之間轉(zhuǎn)換。作為接收對象的必須在初始化的時候首先將其配置成接收對象。
7、 回環(huán)模式可方便的用于調(diào)試,ABTR.LBM = 1和BBTR.LBM = 1,使能回環(huán)模式。在回環(huán)模式下,屬于節(jié)點A的對象發(fā)送的報文只能由屬于節(jié)點B的對象接受,反之亦如此。
8、 報文接收時可對所接收的報文進行驗收濾波,稱為報文標識符驗收濾波。它們分別通過仲裁寄存器(MSGARHn,MSGARLn)(ID)和驗收屏蔽寄存器(MSGAMRHn,MSGAMRLn)設置實現(xiàn)。具體過程如下:
9、 幾個結構體的說明:
(1) 該寄存器用于軟件編程,說明如下
typedef struct
{
uword ; // 消息配置寄存器
ulong ulID; // 擴展標識 (29-bit)
ulong ulMask; // 標準驗收屏蔽(11-bit)/擴展驗收屏蔽 (29-bit)
ubyte ubData[8]; // 八個字節(jié)數(shù)據(jù)
uword uwCounter; // 當前接收對象接收到數(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) 每個CAN對象寄存器結構體
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、 幾個重要寄存器的意義:
n.RXIE報文對象接收中斷使能(=10)
.TXIE----報文對象發(fā)送中斷使能(=10)
(3) MSGCTRHn.MSGVAL---報文對象有效(=10)
(4) MSGCTRHn.NEWDAT---報文對象中數(shù)據(jù)已更新(=10)
(5) MSGCTRHn.MSGLST---NEWDAT仍然置位,CAN控制器已將報文保存到該報文對象中,而先前的報文丟失(=10),僅用于接受
(6) MSGCTRHn.CPUUPD---報文對象自動發(fā)送被禁止(=10);可由CAN控制器自動發(fā)送報文對象中的數(shù)據(jù)(=01)
(7) MSGCTRHn.TXRQ---CPU或遠程幀請求的報文對象數(shù)據(jù)發(fā)送被掛起(=10)。報文成功發(fā)送后,TXRQ自動復位;如果存在幾個有效的報文對象又掛起的發(fā)送請求,報文編號最低的報文對象將被首先發(fā)送
(8) MSGCTRHn.RMTPND---遠程節(jié)點請求報文對象數(shù)據(jù)發(fā)送,但數(shù)據(jù)并未發(fā)送。當RMTPND被置位時,CAN節(jié)點控制器也置位TXRQ.
.RMM---該發(fā)送報文對象的遠程監(jiān)控模式被使能。帶匹配標識符遠程幀的標識符和DLC碼被復制到發(fā)送報文對象中,以監(jiān)控輸入的遠程幀。該位僅對發(fā)送報文有效,對接受報文無影響。
(2) MSGCFGHn.NODE---報文對象CAN節(jié)點選擇,0=A,1=B
(3) MSGCFGHn.XTD-----報文對象擴展標識符,1=11位,0=29位
(4) MSGCFGHn.DIR------報文對象方向控制,0=定義該報文為發(fā)送對象,1=定義該報文為接受對象
(5) MSGCFGHn.DLC-----報文對象數(shù)據(jù)長度碼
(6) MSGCFGHn.RXINP/TXINP---分別為接收/發(fā)送中斷節(jié)點指針,0~7
11、 發(fā)送后一定要判斷TXOK時候置位,確保在發(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個字節(jié)
void CAN_vSendDataN(unsigned char ObjNr, unsigned char XTD, unsigned long ID, unsigned char *DataBuf, unsigned char LEN);
//報文對象初始化
TCAN_SWObj Init_vSWObj(TCAN_SWObj pstObj);
//接收報文函數(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};