can init:

void CAN_Init(MSCAN_Type *pCANx,MSCAN_ConfigPtr pCANConfig)
{
uint8_t bTxIntEn = 0;
SIM->SCGC |= SIM_SCGC_MSCAN_MASK;
CAN_Enable(pCANx);
if(pCANConfig->sSetting.bCLKSRC)
{
pCANx->CANCTL1 |= MSCAN_CANCTL1_CLKSRC_MASK;
}
CAN_InitialModeReq(pCANx);
//enter into Initialization mode
while(!CAN_IsInitialMode(pCANx));
CAN_WriteIDAR0Reg(pCANx,(uint8_t *)&(pCANConfig->u32IDAR0));
CAN_WriteIDAM0Reg(pCANx,(uint8_t *)&(pCANConfig->u32IDMR0));
CAN_WriteIDAR1Reg(pCANx,(uint8_t *)&(pCANConfig->u32IDAR1));
CAN_WriteIDAM1Reg(pCANx,(uint8_t *)&(pCANConfig->u32IDMR1));
CAN_SetBaudRateReg(pCANx,pCANConfig->sBaudRateSetting);
if(pCANConfig->sSetting.bListenModeEn)
{
CAN_ListenModeEn(pCANx);
}
else
{
CAN_ListenModeDisable(pCANx);
}
if(pCANConfig->sSetting.bLoopModeEn)
{
CAN_LoopModeEn(pCANx);
}
else
{
CAN_LoopModeDisable(pCANx);
}
if(pCANConfig->sSetting.bStopEn)
{
CAN_StopInWaitModeEn(pCANx);
}
else
{
CAN_StopInWaitModeDisable(pCANx);
}
if(pCANConfig->sSetting.bWUPM)
{
CAN_WakeUpModeFilter(pCANx);
}
else
{
CAN_WakeUpModeNoFilter(pCANx);
}
if(pCANConfig->sSetting.bBusOffUser)
{
CAN_BusOffUserRecovery(pCANx);
}
else
{
CAN_BusOffAutoRecovery(pCANx);
}
// set Identifier Acceptance Mode
CAN_SetIDAMode(pCANx,pCANConfig->u8IDARMode);
// exit initialization mode
CAN_NormalModeReq(pCANx);
//wait to exit initialization mode
while(CAN_IsInitialMode(pCANx));
if(pCANConfig->sSetting.bOverRunIEn)
{
CAN_OverrunIntEn(pCANx);
}
else
{
CAN_OverrunIntDisable(pCANx);
}
if(pCANConfig->sSetting.bRxFullIEn)
{
CAN_ReceiverFullIntEn(pCANx);
NVIC_EnableIRQ(MSCAN_RX_IRQn);
}
else
{
CAN_ReceiverFullIntDisable(pCANx);
NVIC_DisableIRQ(MSCAN_RX_IRQn);
}
if(pCANConfig->sSetting.bRxStatusChangeIEn)
{
CAN_ReceiverStatusChangeIntEn(pCANx);
bTxIntEn = 1;
}
else
{
CAN_ReceiverStatusChangeIntDisable(pCANx);
}
if(pCANConfig->sSetting.bStatusChangeIEn)
{
CAN_StatusChangeIntEn(pCANx);
bTxIntEn = 1;
}
else
{
CAN_StatusChangeIntDisable(pCANx);
}
if(pCANConfig->sSetting.bTimerEn)
{
CAN_TimerEn(pCANx);
}
else
{
CAN_TimerDisable(pCANx);
}
if(pCANConfig->sSetting.bTxEmptyIEn)
{
CAN_TransmitterEmptyIntEn(pCANx);
bTxIntEn = 1;
}
else
{
CAN_TransmitterEmptyIntDisable(pCANx);
}
if(pCANConfig->sSetting.bTxStatusChangeIEn)
{
CAN_TransmitterStatusChangeIntEn(pCANx);
bTxIntEn = 1;
}
else
{
CAN_TransmitterStatusChangeIntDisable(pCANx);
}
if(pCANConfig->sSetting.bWakeUpIEn)
{
CAN_WakeUpIntEn(pCANx);
bTxIntEn = 1;
}
else
{
CAN_WakeUpIntDisable(pCANx);
}
if(pCANConfig->sSetting.bWakeUpEn)
{
CAN_WakeUpEn(pCANx);
}
else
{
CAN_WakeUpDisable(pCANx);
}
if(bTxIntEn)
{
// enable can tx interrupt
//NVIC_EnableIRQ(MSCAN_TX_IRQn);
}
if(pCANConfig->sSetting.bCanEn)
{
CAN_Enable(pCANx);
}
}
/*****************************************************************************//*!
*
* @brief Write a frame data to transmitter buff
*
*
@Param[in] pCANx point to CAN module type.
*
@Param[in] pFrameBuff point to CAN frame buffer.
*
* @return send status, fail or success
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
uint8_t CAN_LoadOneFrameToBuff(MSCAN_Type *pCANx,MSCAN_RegisterFramePtr pFrameBuff)
{
uint8_t u8TransmitterEmptyFlag;
//get the empty transmitter buffer
u8TransmitterEmptyFlag = CAN_GetTransmitterBufferEmptyFlag(MSCAN);
// u8TransmitterEmptyFlag &= 0x01;
if(u8TransmitterEmptyFlag == TRANSMITTER_TX_NO_EMPTY)
{
return FALSE;
}
// disable interrupt
DISABLE_INTERRUPTS;
// select transmitter buffer
CAN_TxBuffSelect(pCANx, u8TransmitterEmptyFlag);
//don't copy time stamps, so here Sub 2 byter
memcpy((void *)&pCANx->TEIDR0,(void *)pFrameBuff,sizeof(MSCAN_RegisterFrameType)-2);
CAN_LaunchTransmitBuffer(pCANx, CAN_GetTxBuffSelect(pCANx));
// enable interrupt
ENABLE_INTERRUPTS;
return TRUE;
}
Hello, I am using the can module of KEAZ128, and the baud rate is 500k. Currently, can can accept data normally, but when sending data separately, I did not receive data when I measured with zlg host computer or oscilloscope. Please help to find out what the reason is.Attached is the can driver I used.