在线时间3 小时
UID3526252
注册时间2019-1-7
NXP金币0
该用户从未签到
新手上路
- 积分
- 32
- 最后登录
- 2019-1-14
|
大家好,我剛接觸Freescale控制器。
正在學習CAN通訊的功能,參考官方自還測試的範例碼,但是在run的時候的會卡住。
根本不知道問題在哪邊,請版上高手指導一下,萬分感謝。
晶片代號:MC9S12XEQ512
外部晶振:ˋ4MHz
執行時畫面
以下是程式碼
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define ST_ID_100 0x100
#define ACC_CODE_ID100 0x2000
#define ACC_CODE_ID100_HIGH ((ACC_CODE_ID100 & 0xFF00)>>8)
#define ACC_CODE_ID100_LOW (ACC_CODE_ID100 & 0x00FF)
/* Mask Code Definitions */
#define MASK_CODE_ST_ID 0x0007
#define MASK_CODE_ST_ID_HIGH ((MASK_CODE_ST_ID & 0xFF00)>>8)
#define MASK_CODE_ST_ID_LOW (MASK_CODE_ST_ID & 0xFF)
void canInit()
{
//MSCAN Initial mode
CAN0CTL0 = 0x01;
//Check Entry the MSCAN Initial mode
while(!(CAN0CTL1 & 0x01));
//MSCAN Enable & Loop Enable
CAN0CTL1 = 0xA0;
//fOSC=4MHz,CAN speed=250kbps
CAN0BTR0 = 0xC0;
CAN0BTR1 = 0x67;
/* Close Filters */
CAN0IDAC = 0x11;
//CAN0IDAR0 = ACC_CODE_ID100_HIGH; //|\ 16-bit Filter 0
//CAN0IDMR0 = MASK_CODE_ST_ID_HIGH; //| \__ Accepts Standard Data Frame Msg
//CAN0IDAR1 = ACC_CODE_ID100_LOW; //| / with ID 0x100
//CAN0IDMR1 = MASK_CODE_ST_ID_LOW; //|/
/* Acceptance Filters */
//CAN0IDAC = 0x10; /* Set four 16-bit Filters */
//CAN0IDAR2 = 0x00; //|\ 16-bit Filter 1
//CAN0IDMR2 = MASK_CODE_ST_ID_HIGH; //| \__ Accepts Standard Data Frame Msg
//CAN0IDAR3 = 0x00; //| / with ID 0x100
//CAN0IDMR3 = MASK_CODE_ST_ID_LOW; //|/
//CAN0IDAR4 = 0x00; //|\ 16-bit Filter 2
//CAN0IDMR4 = MASK_CODE_ST_ID_HIGH; //| \__ Accepts Standard Data Frame Msg
//CAN0IDAR5 = 0x00; //| / with ID 0x100
//CAN0IDMR5 = MASK_CODE_ST_ID_LOW; //|/
//CAN0IDAR6 = 0x00; //|\ 16-bit Filter 3
//CAN0IDMR6 = MASK_CODE_ST_ID_HIGH; //| \__ Accepts Standard Data Frame Msg
//CAN0IDAR7 = 0x00; //| / with ID 0x100
//CAN0IDMR7 = MASK_CODE_ST_ID_LOW; //|/
/* Exit Initialization Mode Request */
CAN0CTL0 = 0x00;
/* Wait for Normal Mode */
while ((CAN0CTL1&0x00) != 0);
}
unsigned char canSendFrame(unsigned long id, unsigned char priority, unsigned char length, unsigned char *txdata)
{
unsigned char txbuffer;
unsigned char index;
//Check TXE Buffer
if(!CAN0TFLG) return 1;
//Set TXE Buffer
CAN0TBSEL = CAN0TFLG;
txbuffer = CAN0TBSEL;
//Write ID
*((unsigned long *) ((unsigned long)(&CAN0TXIDR0))) = id;
//Write Data
for (index=0;index<length;index++) {
*(&CAN0TXDSR0 + index) = txdata[index];
}
/* Set Data Length Code */
CAN0TXDLR = length;
/* Set Priority */
CAN0TXTBPR = priority;
/* Start transmission */
CAN0TFLG = txbuffer;
/* Wait transmission */
while ( (CAN0TFLG & txbuffer) != txbuffer);
}
#pragma CODE_SEG NON_BANKED
void interrupt CAN0RxISR(void) {
unsigned char length, index;
unsigned char rxdata[8];
length = (CAN0RXDLR & 0x0F);
for (index=0; index<length; index++)
rxdata[index] = *(&CAN0RXDSR0 + index); /* Get received data */
CAN0RFLG = 0x01; /* Clear RXF */
}
#pragma CODE_SEG DEFAULT
void main(void)
{
unsigned char errorflag;
unsigned char txbuff[] = "abcd";
//MSCAN Setting Function
canInit();
//Wait CAN BUS SYNCH
while (!(CAN0CTL0 & 0x10));
//Clear CAN0 RXF flag
CAN0RFLG &= 0x01;
//Enable CAN0 RX interrupt
CAN0RIER = 0x01;
//Enable all interrupt
EnableInterrupts;
for (;;)
{
//CAN0 Send Data
errorflag = canSendFrame((ST_ID_100), 0x00, sizeof(txbuff)-1, txbuff);
}
}
|
|