单片机 CAN通讯 帮我看看这一小段代码是什么意思

这是飞思卡尔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