在线时间0 小时
UID180333
注册时间2010-4-7
NXP金币0
该用户从未签到
新手上路

- 积分
- 70
- 最后登录
- 1970-1-1
|
我的程序进入不了CAN接收中断,如果使能发送中断就会reset。附上代码,请大家帮我找找原因。
/*---------------------------mscan.h----------------------------*/
#define TSEG1 5 //Time segment 1 = 5
#define TSEG2 2 //Time segment 2 = 2
#define CAN_BRP 10 //波特率预分频系数 = 10
#define CAN_SJW 2 //同步跳转宽度 = 2时钟周期
#define Fliter_16Bit 0x01 //16位滤波器
#define CANIDARx_DEFAULT 0x00
#define ALLCROSS 0xFF
#define MAX_LEN 0x08 //消息最大长度
#define CAN_NO_ERR 0x00 //无错误
#define CAN_ERR_BUFFER_FULL 0x80 //发送器满
#define TRAN_INTERRUPT 0x00 //发送缓冲器空中断
#define RECV_INTERRUPT 0x01 //接收缓冲器满中断
typedef struct mscan_msg{ //消息结构体定义
INT16U id;
INT8U RTR;
INT8U data[8];
INT8U len;
INT8U prio;
}CanMsg;
extern CanMsg MESSAGE_1;
extern void MSCAN_Init ( void );
extern INT8U MSCAN_SendMsg ( CanMsg msg);
void CANRx_ISR(void);
#endif
/*---------------------------mscan.c----------------------------*/
/*-------------------------------------------------------
函数名: MSCAN_Init
变量输入: 无
变量输出: 无
函数功能: 初始化MSCAN内部控制器
--------------------------------------------------------*/
void MSCAN_Init ( void ) {
INT8U sjw, brp;
INT8U tseg1,tseg2;
if( !CANCTL0_INITRQ ) CANCTL0_INITRQ = 1; //激活CAN初始化模式
while( !CANCTL1_INITAK ); //等待进入初始化模式
sjw = ( CAN_SJW - 1) MAX_LEN ) return ( FALSE ); /*检查消息数据长度是否小于8*/
if( !CANCTL0_SYNCH ) return ( FALSE ); /*检查是否与CAN总线同步*/
txbuf_num = 0;
do{ /*查询一个空的发送缓冲器*/
CANTBSEL = CANTFLG;
txbuf_num = CANTBSEL;
}while( !txbuf_num );
CANTIDR0 = ( INT8U )( msg.id >> 3 ); /*写标识符*/
CANTIDR1 = ( INT8U )( msg.id 5) );
MESSAGE_1.len = CANRDLR;
for( i = 0; i < MESSAGE_1.len; i++ ){
MESSAGE_1.data = *( ( &CANRDSR0 ) + i );
}
if( MESSAGE_1.data[0] = 0x08) LED2_ON;
else LED3_ON;
CANRFLG_RXF = 1; /*清除RXF标志*/
}
/*---------------------------main.c-----------------------------*/
/*------------------------------------------------------
任务名称: Task_Mscan_Send
变量输入: 无
变量输出: 无
任务描述: MSCAN初始化
发送6次数据
点亮LED2
-----------------------------------------------------*/
static void Task_Mscan_Send(void *p_arg){
INT8U i;
while(SWITCH1);
MSCAN_Init();
while(1){
LED2_ON;
while(SWITCH2);
for(i = 0; i < 6; i++)
MSCAN_SendMsg( MESSAGE_1 );
while(1);
}
}
/*----------------------------------------project.prm--------------------------------------*/
/* This is a linker parameter file for the mc9s08dz32 */
NAMES END /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */
SEGMENTS /* Here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */
Z_RAM = READ_WRITE 0x0080 TO 0x00FF;
RAM = READ_WRITE 0x0100 TO 0x047F;
RAM_2 = READ_WRITE 0x0480 TO 0x087F;
ROM = READ_ONLY 0x7C00 TO 0xBFFF;
ROM_2 = READ_ONLY 0xC000 TO 0xF000;
EEPROM = READ_ONLY 0x1600 TO 0x17FF;
/* INTVECTS = READ_ONLY 0xFFC0 TO 0xFFFF; Reserved for Interrupt Vectors */
END
PLACEMENT /* Here all predefined and user segments are placed into the SEGMENTS defined above. */
DEFAULT_RAM /* non-zero page variables */
INTO RAM;
_PRESTART, /* startup code */
STARTUP, /* startup data structures */
ROM_VAR, /* constant variables */
STRINGS, /* string literals */
VIRTUAL_TABLE_SEGMENT, /* C++ virtual table segment */
DEFAULT_ROM,
COPY,
/* copy down information: how to initialize variables */
INTO ROM;
MYCODE INTO ROM_2;
_DATA_ZEROPAGE, /* zero page variables */
MY_ZEROPAGE INTO Z_RAM;
MY_RAM INTO RAM_2;
END
STACKSIZE 0x50
VECTOR 0 _Startup /* Reset vector: this is the default entry point for an application. */
//VECTOR 1 OSSwiISR /* Swi vector:*/
VECTOR 1 OSCtxSw /*任务切换软中断*/
VECTOR 11 OSTickISR /*系统时钟中断*/
VECTOR ADDRESS 0xFFC6 CANRx_ISR /*CAN接收中断*/
VECTOR 29 CANTx_ISR
调试了好久。。。问题出在哪呢?
|
|