#include"stm32f10x_lib.h" 
 
 void CAN_configure(void) 
 { 
 
         CAN_InitTypeDef CAN_InitStructure; 
        CAN_FilterInitTypeDef CAN_FilterInitStructure; 
        GPIO_InitTypeDef GPIO_InitStructure; 
 
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE); 
 
    /* CAN1 Periph clock enable */ 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE); 
         
        /*can register int*/ 
        CAN_DeInit(); 
 
 
        /*can cell init*/ 
            
  CAN_InitStructure.CAN_TTCM=DISABLE; 
  CAN_InitStructure.CAN_ABOM=DISABLE; 
  CAN_InitStructure.CAN_AWUM=DISABLE; 
  CAN_InitStructure.CAN_NART=DISABLE; 
  CAN_InitStructure.CAN_RFLM=DISABLE; 
  CAN_InitStructure.CAN_TXFP=DISABLE; 
  CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; 
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; 
  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; 
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; 
  CAN_InitStructure.CAN_Prescaler=18; 
  CAN_Init(&CAN_InitStructure); 
 
    /* CAN filter init */ 
  CAN_FilterInitStructure.CAN_FilterNumber=0; 
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; 
  CAN_FilterInitStructure.CAN_FilterIdHigh=((u32)0x0020<<21)>>16;//标识符 
  CAN_FilterInitStructure.CAN_FilterIdLow=(((u32)0x0020<<21)|CAN_ID_STD|CAN_RTR_DATA);//&0xFFFF; 
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff; 
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff; 
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;; 
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; 
  CAN_FilterInit(&CAN_FilterInitStructure); 
 
 
     /* Configure CAN pin: RX */ 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 
  GPIO_Init(GPIOA, &GPIO_InitStructure); 
   
  /* Configure CAN pin: TX */ 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
  GPIO_Init(GPIOA, &GPIO_InitStructure); 
   /* CAN Periph clock enable */ 
  
} 
 
void can_send(unsigned char data) 
{ 
            
        CanTxMsg TxMessage; 
        u8 TransmitMailbox = 0;                        
        TxMessage.StdId=0x0020;//标识符 
          TxMessage.RTR=CAN_RTR_DATA; 
         TxMessage.IDE=CAN_ID_STD; 
          TxMessage.DLC=2; 
          TxMessage.Data[0]=data; 
          TxMessage.Data[1]=0xFE; 
 
          TransmitMailbox=CAN_Transmit(&TxMessage); 
   while(CAN_TransmitStatus(TransmitMailbox) != CANTXOK){}//等待发送 
         
} 
 
unsigned char can_rev(void) 
{ 
         CanRxMsg RxMessage; 
 
  //        RxMessage.StdId=0x00;//不需要设置 
          RxMessage.IDE=CAN_ID_STD; 
          RxMessage.DLC=2; 
          RxMessage.Data[0]=0x00; 
          RxMessage.Data[1]=0x00; 
          while (CAN_MessagePending(CAN_FIFO0)==0);//等到接收 
    
           CAN_Receive(CAN_FIFO0, &RxMessage); 
        CAN_FIFORelease(CAN_FIFO0); 
         
  return    RxMessage.Data[0]; 
 } 
 
 
 
------------------------------------- 
 
 main() 
   { 
         unsigned int a; 
         RCC_Configuration(); 
                       /*初始化 GPIOC时钟*/ 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  
   USART_Configuration(); 
   CAN_configure(); 
   LedInit(); 
            
   while(1) 
   { 
                   GPIO_SetBits(GPIOB,GPIO_Pin_7); 
                Delay(10); 
                GPIO_ResetBits(GPIOB,GPIO_Pin_7); 
                Delay(10); 
                can_send(0x54); 
                a=can_rev(); 
                USART1_Putc(a); 
                 
   } 
 
 
   }
 |