这是飞思卡尔S12系列单片机的CAN模块程序,can.c文件。 想请教下 initRxBufferMSCAN0 在这有什么用? 程序是怎么接收CAN报文并读出来的啊?
void initializeMSCAN0(void)
{
Bootloader_version_number=0;
Have_Program_SRec_numbers=0;
Program_Successfully=0;
SRecord_CheckSum_error=0;
SRecord_Invalid_address=0;
Get_Ready_to_erase_block0=0;
Get_Ready_to_erase_block1N=0;
Get_Ready_to_erase_block1S=0;
Get_Ready_to_erase_block2=0;
Get_Ready_to_erase_block3=0;
Erase_Successfully=0;
SRec_Range_error=0;
Program_reset_vector_error=0;
wIdxTX0=rIdxTX0=countTX0=0;
CAN0CTL0|= 0x01; //请求进入初始化模式
while ((CAN0CTL1&0x01)==0) ; //初始化模式确认
//总线频率为250kb/s
// CAN0BTR0_SJW = 0; //设置同步
// CAN0BTR0_BRP = 7; //设置波特率
// CAN0BTR1 = 0x1c; //设置时段1和时段2的Tq个数 ,总线频率为250kb/s
CAN0CTL1=0x81; //使能MSCAN模块,使用外部晶振16MHZ 作为时钟源
CAN0BTR0 = 3; //预分频值4 ,1个Tq时钟周期
CAN0BTR1=156; // TSEG2=1,2Tq时钟周期 13个Tq时钟周期
//波特率250kbps
CAN0IDAC&=239;
CAN0IDAC&=223;
CAN0IDAR0 =0X00;
CAN0IDAR1 =0X18;
CAN0IDAR2 =0X00;
CAN0IDAR3 =0X00; //CAN0_RX_Srcord_ID 0x00180000
CAN0IDAR4 =0X00;
CAN0IDAR5 =0X18;
CAN0IDAR6 =0X00;
CAN0IDAR7 =0X02; //CAN0_RX_Command_ID 0x00180002
//Config CAN1IDMR0-7
CAN0IDMR0 = 0X00;
CAN0IDMR1 = 0X00;
CAN0IDMR2 = 0X00;
CAN0IDMR3 = 0X00;
CAN0IDMR4 = 0x00;
CAN0IDMR5 = 0X00;
CAN0IDMR6 = 0x00;
CAN0IDMR7 = 0x00;
CAN0CTL0 &=254;
while ((CAN0CTL1&CAN0CTL1_INITAK_MASK)==1) ;
while ((CAN0CTL0&CAN0CTL0_SYNCH_MASK)==0) ;
CAN0RIER = 1; //打开接收中断,中断的开发在退出初始化的模式下进行
CAN0TIER = 0; //关闭发送中断
}
void CAN_initialize(void)
{
initRxBufferMSCAN0(&Intermediate, CAN0_RX_Srcord_ID, SRecord);
initRxBufferMSCAN0(&Intermediate, CAN0_RX_Command_ID,Command);
initializeMSCAN0();
}
void initRxBufferMSCAN0(CAN0_DATATYPE *cf, UINT32 id,UINT8 idxBuffer)
{
cf->ID = id;
msgRX0[idxBuffer] = *cf;
isNewDataRX0[idxBuffer] = 0;
}
UINT8 readMsgMSCAN0(CAN0_DATATYPE *cf, UINT8 idxBuffer)
{
UINT8 i, status = 0;
//EnterCS();
if (isNewDataRX0[idxBuffer] == 1)
{
isNewDataRX0[idxBuffer] = 0;
status = 1;
cf->Length = msgRX0[idxBuffer].Length;
for (i=0; i<cf->Length; i++)
{
cf->DATA[i] = msgRX0[idxBuffer].DATA[i];
}
}
//ExitCS();
return (status);
}
#pragma CODE_SEG RAM_CODE
interrupt void MSCAN0_Receive_ISR(void)
{
UINT32 id;
UINT8 dlr, i;
INT8 idxBuffer;
id = READ_CAN0_EXT_ID(); //读id ??
dlr = CAN0RXDLR&0x0F; //读长度
for (idxBuffer = (MSCAN0_RX_SIZE-1); idxBuffer>=0; idxBuffer--)
{
if (id==msgRX0[idxBuffer].ID)
{
msgRX0[idxBuffer].Length = dlr;
for (i=0; i<dlr; i++)
{
msgRX0[idxBuffer].DATA[i] = *(CAN0RXDSR_ARR + i);
}
isNewDataRX0[idxBuffer] = 1;
break;
}
}
/* 清除接收缓冲区满标志*/
CAN0RFLG|=CAN0RFLG_RXF_MASK;
}
#pragma CODE_SEG DEFAULT