Other Parts Discussed in Thread: C2000WARE
can邮箱只能使用16个,多了运行会报错,想问一下哪个寄存器能打开全部的邮箱数,手册上写着有32个邮箱。
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器件进行了更改。
您需要重新安装C2000Ware并在您的工程中使用最新的库,以下是最新c2000ware的下载链接:
你可以试试将C:\ti\c2000\C2000Ware_4_02_00_00\driverlib\f28002x\driverlib 路径下的debug.h替换掉您原来的。