This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
can邮箱只能使用16个,多了运行会报错,想问一下哪个寄存器能打开全部的邮箱数,手册上写着有32个邮箱。
//***************************************************************************** // // Error handling function to be called when an ASSERT is violated // //***************************************************************************** void __error__(char *filename, uint32_t line) { // // An ASSERT condition was evaluated as false. You can use the filename and // line parameters to determine what went wrong. // ESTOP0; }
使用邮箱数量超过16个,程序就会跳转到此位置。
你好!使用的不是例程。以下是我的程序。
void init_eCAN_A ( u16 bitRatePrescaler, u16 timeSeg1, u16 timeSeg2, u16 sbg, u16 sjw, u16 sam) { u32 ui32RegValue; u16 ui16CANCTL; EALLOW; CpuSysRegs.PCLKCR10.bit.CAN_A = 1; GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0; /* Enable pull-up on GPIO13 */ GpioCtrlRegs.GPAGMUX1.bit.GPIO13 = 3; GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 1; GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0; /* Enable pull-up on GPIO12 */ GpioCtrlRegs.GPAGMUX1.bit.GPIO12 = 3; GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 1; EDIS; ui32RegValue = (((u32)((bitRatePrescaler-1) & 0x03C0))<<10)|((timeSeg2-1)<< 12)|((timeSeg1-1)<<8)|((sjw-1)<<6)|((bitRatePrescaler-1) & 0x3F); // EALLOW; // CanaRegs.CAN_CTL.bit.Init = 1;//CAN module ignores bus activity // CanaRegs.CAN_CTL.bit.PMD = 5;//Parity function disabled // CanaRegs.CAN_RAM_INIT.bit.CAN_RAM_INIT = 1; // CanaRegs.CAN_RAM_INIT.bit.KEY3 = 1; // CanaRegs.CAN_RAM_INIT.bit.KEY1 = 1; // while(!((CanaRegs.CAN_RAM_INIT.all & 0x003FU) == 0x25)){ // } // CanaRegs.CAN_CTL.bit.SWR = 1; // SysCtl_delay(1U); // CanaRegs.CAN_CTL.bit.CCE = 1;// Configuration Change Enable CAN_initModule(CANA_BASE); // ClkCfgRegs.CLKSRCCTL2.bit.CANABCLKSEL = 0;//CANA Bit-Clock Source Select PERx.SYSCLK CAN_selectClockSource(CANA_BASE, (CAN_ClockSource)0); //Set init mode // CanaRegs.CAN_CTL.bit.CCE = 1;// Configuration Change Enable // CanaRegs.CAN_CTL.bit.Init = 1;//CAN module ignores bus activity ui16CANCTL = HWREGH(CANA_BASE + CAN_O_CTL); HWREGH(CANA_BASE + CAN_O_CTL) = ui16CANCTL | CAN_CTL_INIT | CAN_CTL_CCE; //Set Bit Timing register // CanaRegs.CAN_BTR.bit.BRP = bitRatePrescaler-1; // CanaRegs.CAN_BTR.bit.SJW = sjw-1; // CanaRegs.CAN_BTR.bit.TSEG1 = timeSeg1-1; // CanaRegs.CAN_BTR.bit.TSEG2 = timeSeg2-1; // CanaRegs.CAN_BTR.bit.BRPE = 0;//Baud Rate Prescaler Extension HWREGH(CANA_BASE + CAN_O_BTR) = (ui32RegValue & 0xFFFFU); HWREGH(CANA_BASE + CAN_O_BTR + 2) = (ui32RegValue >> 16); // Restore the saved CAN Control register. // CanaRegs.CAN_IP_MUX21 = 0; HWREGH(CANA_BASE + CAN_O_CTL) = ui16CANCTL; HWREGH(CANA_BASE + CAN_O_IP_MUX21) = 0; HWREGH(CANA_BASE + CAN_O_IP_MUX21 + 2) = 0; // HWREGH(CANA_BASE + CAN_O_IF1CMD) |= 0x20; // HWREGH(CANA_BASE + CAN_O_IF2CMD) |= 0x20; // HWREGH(CANA_BASE + CAN_O_IP_MUX21) = 0x20; //CanaRegs.CAN_IF1ARB.bit.MsgVal = 1; // CanaRegs.CAN_IF1CMD.bit.MSG_NUM = 0x20; // CanaRegs.CAN_IP_MUX21 = 0xFFFFFFFF; // HWREGH(CANA_BASE + CAN_O_TXRQ_X) = CAN_TXRQ_X_TXRQSTREG2_M|CAN_TXRQ_X_TXRQSTREG1_M; // HWREGH(CANA_BASE + CAN_O_NDAT_X) = CAN_NDAT_X_NEWDATREG2_M|CAN_NDAT_X_NEWDATREG1_M; // HWREGH(CANA_BASE + CAN_O_IPEN_X) = CAN_IPEN_X_INTPNDREG2_M|CAN_IPEN_X_INTPNDREG1_M; // HWREGH(CANA_BASE + CAN_O_MVAL_X) = CAN_MVAL_X_MSGVALREG2_M|CAN_MVAL_X_MSGVALREG1_M; // Enable the CAN for operation. // CanaRegs.CAN_CTL.bit.CCE = 0;// Configuration Change disEnable // CanaRegs.CAN_CTL.bit.Init = 0;//CAN module processes messages normally CAN_enableController(CANA_BASE); // EDIS; } void MCU_CAN_Transmit_Task_Init(void) { /* Start for S-Function (c280xcanxmt): '<S4>/CAN Transmit' incorporates: * Constant: '<S4>/Constant1' */ CAN_setupMessageObject(CANA_BASE, MCU_220_msg+1, Usercan_MCU220, CAN_MSG_FRAME_STD, CAN_MSG_OBJ_TYPE_TX, 0, CAN_MSG_OBJ_NO_FLAGS, 8); /* Start for S-Function (c280xcanxmt): '<S4>/CAN Transmit1' incorporates: * Constant: '<S4>/Constant2' */ CAN_setupMessageObject(CANA_BASE, MCU_221_msg+1, Usercan_MCU221, CAN_MSG_FRAME_STD, CAN_MSG_OBJ_TYPE_TX, 0, CAN_MSG_OBJ_NO_FLAGS, 8); /* Start for S-Function (c280xcanxmt): '<S4>/CAN Transmit2' incorporates: * Constant: '<S4>/Constant3' */ CAN_setupMessageObject(CANA_BASE, MCU_222_msg+1, Usercan_MCU222, CAN_MSG_FRAME_STD, CAN_MSG_OBJ_TYPE_TX, 0, CAN_MSG_OBJ_NO_FLAGS, 8); /* Start for S-Function (c280xcanxmt): '<S4>/CAN Transmit2' incorporates: * Constant: '<S4>/Constant3' */ CAN_setupMessageObject(CANA_BASE, MCU_223_msg+1, Usercan_MCU223, CAN_MSG_FRAME_STD, CAN_MSG_OBJ_TYPE_TX, 0, CAN_MSG_OBJ_NO_FLAGS, 8); /* Start for S-Function (c280xcanxmt): '<S4>/CAN Transmit2' incorporates: * Constant: '<S4>/Constant3' */ CAN_setupMessageObject(CANA_BASE, MCU_224_msg+1, Usercan_MCU224, CAN_MSG_FRAME_STD, CAN_MSG_OBJ_TYPE_TX, 0, CAN_MSG_OBJ_NO_FLAGS, 8); /* Start for S-Function (c280xcanxmt): '<S4>/CAN Transmit2' incorporates: * Constant: '<S4>/Constant3' */ CAN_setupMessageObject(CANA_BASE, MCU_519_msg+1, Usercan_MCU519, CAN_MSG_FRAME_STD, CAN_MSG_OBJ_TYPE_TX, 0, CAN_MSG_OBJ_NO_FLAGS, 8); /* Start for S-Function (c280xcanxmt): '<S4>/CAN Transmit2' incorporates: * Constant: '<S4>/Constant3' */ CAN_setupMessageObject(CANA_BASE, MCU_520_msg+1, Usercan_MCU520, CAN_MSG_FRAME_STD, CAN_MSG_OBJ_TYPE_TX, 0, CAN_MSG_OBJ_NO_FLAGS, 8); /* Start for S-Function (c280xcanxmt): '<S4>/CAN Transmit2' incorporates: * Constant: '<S4>/Constant3' */ CAN_setupMessageObject(CANA_BASE, MCU_521_msg+1, Usercan_MCU521, CAN_MSG_FRAME_STD, CAN_MSG_OBJ_TYPE_TX, 0, CAN_MSG_OBJ_NO_FLAGS, 8); CAN_setupMessageObject(CANA_BASE, MCU_112_msg+1, Usercan_MCU112, CAN_MSG_FRAME_STD, CAN_MSG_OBJ_TYPE_TX, 0, CAN_MSG_OBJ_NO_FLAGS, 8); CAN_setupMessageObject(CANA_BASE, MCU_111_msg+1, Usercan_MCU111, CAN_MSG_FRAME_STD, CAN_MSG_OBJ_TYPE_TX, 0, CAN_MSG_OBJ_NO_FLAGS, 8); CAN_setupMessageObject(CANA_BASE, MCU_729_msg+1, Usercan_PhyRes729, CAN_MSG_FRAME_STD, CAN_MSG_OBJ_TYPE_TX, 0, CAN_MSG_OBJ_NO_FLAGS, 8); } void TransCanData(u16 transType) { unsigned char* ucTXMsgData; u16 u16temp = 0; switch (transType) { case 0: // can_Tx.ID = 220U; can_Tx.Length = 8U; can_Tx.Data[0] = (u8)(mcu_Msg.MCU_220_MOT_INIT|(mcu_Msg.MCU_220_MOT_STA<<1)|(mcu_Msg.MCU_220_MOT_MODE<<3)|(mcu_Msg.MCU_220_MOT_DIR<<5)|(mcu_Msg.MCU_220_HV_CHECK_FLAG<<7)); can_Tx.Data[1] = (u8)(0|(0<<1)|(mcu_Msg.MCU_220_LV_OFF_REQ_FLAG<<2)|(acce_mode<<3)|(Err.ErrState<<4)); can_Tx.Data[2] = (u8)0x00; u16temp=(u16)(gSpdRpm+10000.0F);//mcu_Msg.MCU_MotActuSpd速度 can_Tx.Data[4] = (u8)u16temp; can_Tx.Data[3] = (u8)(u16temp>>8); u16temp=(u16)((TroqueFbk_Y.TrqFbk+1500.0F)*2.0f);//mcu_Msg.MCU_MotActuToq转矩 can_Tx.Data[6] = (u8)u16temp; can_Tx.Data[5] = (u8)(u16temp>>8); can_Tx.Data[7] = (u8)(0|(0<<1)|(0<<2)|(0<<3)|(mcu_Msg.MCU_220_MCUready<<4)|(mcu_Msg.MCU_220_EvSpd_Validity<<5)|(mcu_Msg.MCU_220_Activedischarge_STA<<6)|(0<<7)); ucTXMsgData = (unsigned char*)can_Tx.Data; CAN_sendMessage(CANA_BASE, MCU_220_msg+1, can_Tx.Length, (u16*)ucTXMsgData); break; case 1: // /* S-Function (scan_Tx): '<S3>/CAN Pack2' */ can_Tx.ID = 221U; can_Tx.Length = 8U; /* if (mcu_Msg.MCU_DirecEn == 0) u16temp = 3; // 1 rev 2 Neu 3 Dri 4 Spo 5 Park else if (mcu_Msg.MCU_DirecEn == 1) u16temp = 1; else u16temp = 2;*/ can_Tx.Data[0] = (u8)0x00; u16temp=(u16)((f32)gMeas.Udc); //母线电压 can_Tx.Data[2] = (u8)u16temp; can_Tx.Data[1] = (u8)(u16temp>>8); u16temp=(u16)((TseRefCtrl.fIdcFbk+1000.0f)*10.0f);//母线电流 can_Tx.Data[4] = (u8)u16temp; can_Tx.Data[3] = (u8)(u16temp>>8); u16temp=(u16)(((f32)gMeas.I_mag*100.0f)); //相电流 can_Tx.Data[6] = (u8)u16temp; can_Tx.Data[5] = (u8)(u16temp>>8); can_Tx.Data[7] = (u8)0x00; //can_Tx.Data[6] = (u8)0x00; //can_Tx.Data[7] = (u8)0x00; ucTXMsgData = (unsigned char*)can_Tx.Data; CAN_sendMessage(CANA_BASE, MCU_221_msg+1, can_Tx.Length, (u16*)ucTXMsgData); break; case 2: // /* S-Function (scan_Tx): '<S3>/CAN Pack2' */ can_Tx.ID = 222U; can_Tx.Length = 8U; can_Tx.Data[0] = (u8)0x00; u16temp=(u16)((f32)(mcu_Msg.MCU_222_DRIVE_TOR_MAX+1500.0f) * 2.0f); //驱动电机最大驱动转矩 can_Tx.Data[2] = (u8)u16temp; can_Tx.Data[1] = (u8)(u16temp>>8); u16temp=(u16)((mcu_Msg.MCU_222_BRAKE_TOR_MAX+1500.0f)*2.0f);//驱动电机最大制动转矩 can_Tx.Data[4] = (u8)u16temp; can_Tx.Data[3] = (u8)(u16temp>>8); u16temp=(u16)((f32)(mcu_Msg.MCU_222_OutputPower+1000)*2.0f); //驱动电机输出功率 can_Tx.Data[6] = (u8)u16temp; can_Tx.Data[5] = (u8)(u16temp>>8); mcu_Msg.MCU_222_RollingCounter=((++mcu_Msg.MCU_222_RollingCounter)%16); u16temp=(u16)(mcu_Msg.MCU_222_RollingCounter|(mcu_Msg.MCU_222_St_PowerReduceOperation<<4)); can_Tx.Data[7] = (u8)u16temp; ucTXMsgData = (unsigned char*)can_Tx.Data; CAN_sendMessage(CANA_BASE, MCU_222_msg+1, can_Tx.Length, (u16*)ucTXMsgData); break; case 3: // /* S-Function (scan_Tx): '<S3>/CAN Pack2' */ can_Tx.ID = 223U; can_Tx.Length = 8U; can_Tx.Data[0] = 0; can_Tx.Data[1] = (u8)(mcu_Msg.MCU_223_IGBT_TEMP+40); can_Tx.Data[2] = (u8)(mcu_Msg.MCU_223_MOT_TEMP+40); //can_Tx.Data[2] = (u8)(APPCfg.pad1[127]+40); can_Tx.Data[3] = 0; can_Tx.Data[4] = 0; can_Tx.Data[5] = 0; can_Tx.Data[6] = 0; mcu_Msg.MCU_223_RollingCounter=((++mcu_Msg.MCU_223_RollingCounter)%16); //mcu_Msg.MCU_631_CheckSum = calCrc(can_Tx.Data,7); u16temp=(u8)(mcu_Msg.MCU_223_RollingCounter<<4); can_Tx.Data[7] = (u8)u16temp; ucTXMsgData = (unsigned char*)can_Tx.Data; CAN_sendMessage(CANA_BASE, MCU_223_msg+1, can_Tx.Length, (u16*)ucTXMsgData); break; case 4: // /* S-Function (scan_Tx): '<S3>/CAN Pack2' */ can_Tx.ID = 224U; can_Tx.Length = 8U; can_Tx.Data[0] = 0; can_Tx.Data[1] = 0; can_Tx.Data[2] = 0; can_Tx.Data[3] = 0; can_Tx.Data[4] = 0; u16temp=(u16)((TseRefCtrl.fIdcFbk+1000)*10.0f); //直流母线电流实际测量值 can_Tx.Data[5] = (u8)(u16temp>>8); can_Tx.Data[6] = (u8)u16temp; can_Tx.Data[7] = 0; ucTXMsgData = (unsigned char*)can_Tx.Data; CAN_sendMessage(CANA_BASE, MCU_224_msg+1, can_Tx.Length, (u16*)ucTXMsgData); break; case 5: // /* S-Function (scan_Tx): '<S3>/CAN Pack2' */ can_Tx.ID = 519U; can_Tx.Length = 8U; can_Tx.Data[0] = (u8)(0|(0<<1)|(0<<2)|(0<<3)|(0<<4)|(Err.OverCurrent<<5)|(0<<6)|(0<<7)); can_Tx.Data[1] = (u8)(0|(0<<1)|(0<<2)|(0<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7)); can_Tx.Data[2] = (u8)(0|(0<<1)|(0<<2)|(0<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7)); can_Tx.Data[3] = (u8)(0|(0<<1)|(0<<2)|(0<<3)|(0<<4)|(0<<5)|(Err.OverSpd<<6)|(0<<7)); can_Tx.Data[4] = (u8)(0|(0<<1)|(0<<2)|(Err.OverVoltage<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7)); can_Tx.Data[5] = (u8)(0|(0<<1)|(Err.IGBTOverHeat<<2)|(0<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7)); can_Tx.Data[6] = (u8)(0|(0<<1)|(Err.RDC_Err<<2)|(0<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7)); can_Tx.Data[7] = (u8)(u16temp>>8); if (Err.ErrState != 0 && EepromCtrl.FlashErr == 0) EepromCtrl.FlashErr = 1; ucTXMsgData = (unsigned char*)can_Tx.Data; CAN_sendMessage(CANA_BASE, MCU_519_msg+1, can_Tx.Length, (u16*)ucTXMsgData); break; case 6: // /* S-Function (scan_Tx): '<S3>/CAN Pack2' */ can_Tx.ID = 520U; can_Tx.Length = 8U; can_Tx.Data[0] = (u8)(Err.FO|(0<<1)|(0<<2)|(0<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7)); can_Tx.Data[1] = (u8)(0|(0<<1)|(0<<2)|(0<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7)); can_Tx.Data[2] = (u8)(Err.OverVoltage|(Err.OverVoltageWarning<<1)|(0<<2)|(Err.LowVoltage<<3)|(Err.LowVoltageWarning<<4)|(Err.IGBTTempSensorError<<5)|(0<<6)|(Err.IGBTOverHeat<<7)); can_Tx.Data[3] = (u8)(0|(Err.MotorTempSensorError<<1)|(0<<2)|(Err.MotorOverHeat<<3)|(Err.RDC_Err<<4)|(0<<5)|(mcu_Msg.MCU_520_RF_F_OVERSPEED<<6)|(mcu_Msg.MCU_520_LIF_R_OVERSPEED<<7)); can_Tx.Data[4] = (u8)(0|(0<<1)|(0<<2)|(Err.MotorOverHeatWarning<<3)|(0<<4)|(Err.IGBTOverHeatWarning<<5)|(0<<6)|(0<<7)); can_Tx.Data[5] = (u8)(0|(0<<1)|(Err.EepromFault<<2)|(Err.MotorStock<<3)|(Err.DisChargeFail<<4)|(0<<5)|(0<<6)|(0<<7)); can_Tx.Data[6] = (u8)(0|(0<<1)|(0<<2)|(mcu_Msg.MCU_520_LIF_F_OVERSPEED<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7)); can_Tx.Data[7] = (u8)(0|(0<<1)|(0<<2)|(0<<3)|(0<<4)|(0<<5)|(0<<6)|(0<<7)); ucTXMsgData = (unsigned char*)can_Tx.Data; CAN_sendMessage(CANA_BASE, MCU_520_msg+1, can_Tx.Length, (u16*)ucTXMsgData); break; case 7: /* S-Function (scan_Tx): '<S3>/CAN Pack2' */ can_Tx.ID = 521U; can_Tx.Length = 8U; can_Tx.Data[0] = (u8)0; can_Tx.Data[1] = (u8)0; can_Tx.Data[2] = (u8)0; can_Tx.Data[3] = (u8)0; can_Tx.Data[4] = (u8)0; can_Tx.Data[5] = (u8)(MCU_521_MCU_PLM_Num|(MCU_521_Motor_PLM_Num<<4)); can_Tx.Data[6] = (u8)(Year|(Month<<4)); can_Tx.Data[7] = (u8)Date; ucTXMsgData = (unsigned char*)can_Tx.Data; CAN_sendMessage(CANA_BASE, MCU_521_msg+1, can_Tx.Length, (u16*)ucTXMsgData); break; case 8: /* S-Function (scan_Tx): '<S3>/CAN Pack2' */ can_Tx.ID = 112U; can_Tx.Length = 8U; can_Tx.Data[0] = (u8)i++; can_Tx.Data[1] = (u8)i++; u16temp=(u16)(gResolver.DCoffsetCOS+10000); can_Tx.Data[3] = (u8)u16temp; can_Tx.Data[2] = (u8)(u16temp>>8); u16temp=(u16)(gResolver.DCoffsetSIN+10000); can_Tx.Data[5] = (u8)u16temp; can_Tx.Data[4] = (u8)(u16temp>>8); u16temp=(u16)(gResolver.DCoffsetEXC+10000); can_Tx.Data[7] = (u8)u16temp; can_Tx.Data[6] = (u8)(u16temp>>8); ucTXMsgData = (unsigned char*)can_Tx.Data; CAN_sendMessage(CANA_BASE, MCU_112_msg+1, can_Tx.Length, (u16*)ucTXMsgData); break; case 9: /* S-Function (scan_Tx): '<S3>/CAN Pack2' */ can_Tx.ID = 111U; can_Tx.Length = 8U; can_Tx.Data[0] = (u8)1; can_Tx.Data[1] = (u8)2; can_Tx.Data[2] = (u8)3; can_Tx.Data[3] = (u8)4; can_Tx.Data[4] = (u8)5; can_Tx.Data[5] = (u8)6; can_Tx.Data[6] = (u8)7; can_Tx.Data[7] = (u8)8; ucTXMsgData = (unsigned char*)can_Tx.Data; CAN_sendMessage(CANA_BASE, MCU_111_msg+1, can_Tx.Length, (u16*)ucTXMsgData); break; default: ; break; } }
我推测应该是您库的问题。
extern void __error__(char *filename, uint32_t line);该函数曾经导致一些问题,extern void __error__(const char *filename, uint32_t line);这个是最新版本的函数,关于从char *更改为const char *的问题,此更改已经在C2000Ware v4.01.00中推出。已对 debug.h 和 device.h 文件中的所有 Gen3器件进行了更改。
你可以试试将C:\ti\c2000\C2000Ware_4_02_00_00\driverlib\f28002x\driverlib 路径下的debug.h替换掉您原来的。