久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5959|回復: 0
打印 上一主題 下一主題
收起左側

STM32 can總線代碼 帶詳細注射

[復制鏈接]
跳轉到指定樓層
樓主
ID:140343 發表于 2016-10-21 23:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1.     #include "sysdef.h"

  2.     #define MAX_MAIL_NUM  3
  3.     //CAN總線調試:0=運行 1=自環調試
  4.     #define CAN_DEBUG     0
  5.     //CAN總線波特率:0=250kbps,1=500kbps,2=1Mbps
  6.     #define CAN1_BPS      0

  7.     unsigned char can1_addr = 0;

  8.     unsigned short  Can1_Tx_Count =0;
  9.     unsigned short  Can1_Rx_Count =0;

  10.     unsigned short  Can1_Send_Delay =0;

  11.     unsigned char   Can1_Send_Buf[10]={0xeb,0x90,0x01,0x55,0xAA};
  12.     unsigned char   Can1_Recv_Buf[10]={0};
  13.     extern int  angle_num ;
  14.     extern unsigned int  angle_data ;

  15.     static  u8 CAN_msg_num[MAX_MAIL_NUM];   // 發送郵箱標記

  16.     void CAN1_Config_init(void)
  17.     {
  18.          CAN_InitTypeDef        CAN_InitStructure;
  19.          CAN_FilterInitTypeDef  CAN_FilterInitStructure;

  20.          /* CAN register init */
  21.          CAN_DeInit(CAN1);
  22.          CAN_StructInit(&CAN_InitStructure);
  23.       
  24.          /* CAN cell init */ //36MHz 500Kbps
  25.          CAN_InitStructure.CAN_TTCM=DISABLE;//禁止時間觸發通信模式
  26.          CAN_InitStructure.CAN_ABOM=DISABLE;//軟件對CAN_MCR寄存器的INRQ位進行置1隨后清0后,一旦硬件檢測
  27.                                             //到128次11位連續的隱性位,就退出離線狀態
  28.          CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通過清除CAN_MCR寄存器的SLEEP位,由軟件喚醒
  29.          CAN_InitStructure.CAN_NART=DISABLE;//CAN報文是否只發1次,不管發送的結果如何(成功/出錯或仲裁丟失)
  30.          CAN_InitStructure.CAN_RFLM=DISABLE;//在接收到溢出時FIFO未被鎖定,當接收到FIFO報文未被讀出,下一個收到的報文會覆蓋原有的報文
  31.          CAN_InitStructure.CAN_TXFP=DISABLE;//發送的FIFO優先級由報文的標識符來決定
  32.          
  33.     #if CAN_DEBUG
  34.          CAN_InitStructure.CAN_Mode= CAN_Mode_LoopBack;
  35.     #else
  36.          CAN_InitStructure.CAN_Mode= CAN_Mode_Normal;
  37.     #endif
  38.          //傳輸波特率

  39.          if(CAN1_BPS ==  0)
  40.          {
  41.             CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳躍寬度1個時間單位
  42.             CAN_InitStructure.CAN_BS1=CAN_BS1_12tq;//時間段1為9個時間單位
  43.             CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;//時間段2為8個時間單位
  44.             CAN_InitStructure.CAN_Prescaler= 9;//36M/(1+12+3)/9= 250kbps
  45.                                                 //36M/(1+5+2)/9 = 500kbps
  46.                                                //36M(1+2+1)/9 = 1M
  47.          }
  48.          else if(CAN1_BPS == 1)
  49.          {
  50.             CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳躍寬度1個時間單位
  51.             CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;//時間段1為9個時間單位
  52.             CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;//時間段2為8個時間單位
  53.             CAN_InitStructure.CAN_Prescaler= 9;//36M/(1+12+3)/9= 250kbps
  54.             
  55.          }
  56.          else
  57.          {
  58.             CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳躍寬度1個時間單位
  59.             CAN_InitStructure.CAN_BS1=CAN_BS1_2tq;//時間段1為9個時間單位
  60.             CAN_InitStructure.CAN_BS2=CAN_BS2_1tq;//時間段2為8個時間單位
  61.             CAN_InitStructure.CAN_Prescaler= 9;//36M/(1+12+3)/9= 250kbps
  62.             
  63.          }
  64.          CAN_Init(CAN1,&CAN_InitStructure);
  65.                                              
  66.          /* CAN filter init */
  67.          CAN_FilterInitStructure.CAN_FilterNumber=0;  //指定了待初始化的過濾器0
  68.          CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定了過濾器將被初始化到的模式為標識符屏蔽位模式
  69.          CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;;//給出了過濾器位寬1個32位過濾器
  70.          CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;//用來設定過濾器標識符(32位位寬時為其高段位,16位位寬時為第一個)
  71.          CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;;//用來設定過濾器標識符(32位位寬時為其低段位,16位位寬時為第二個)
  72.          CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//用來設定過濾器屏蔽標識符或者過濾器標識符(32位位寬時為其高段位,16位位寬時為第一個)
  73.          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//用來設定過濾器屏蔽標識符或者過濾器標識符(32位位寬時為其低段位,16位位寬時為第二個)
  74.          CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;;//設定了指向過濾器的FIFO0
  75.          CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//使能過濾器
  76.          CAN_FilterInit(&CAN_FilterInitStructure);

  77.     }

  78.     // ***************************************************************
  79.     //       BaudRate = 1 / NominalBitTime
  80.     //       NominalBitTime = 1tq + tBS1 + tBS2
  81.     //       tq = (BRP[9:0] + 1) x tPCLK
  82.     //       tPCLK = CAN's clock = APB1's clock
  83.     //   1Mbps 速率下,采用點的位置在6tq位置處,BS1=5, BS2=2
  84.     //   500kbps 速率下,采用點的位置在8tq位置處,BS1=7, BS2=3
  85.     //   250kbps 速率下,采用點的位置在14tq位置處,BS1=13, BS2=2
  86.     //   125k, 100k, 50k, 20k, 10k 的采用點位置與 250K 相同
  87.     // ****************************************************************

  88.     void  CAN1_Com_init(void)
  89.     {
  90.           GPIO_InitTypeDef GPIO_InitStruct;
  91.           NVIC_InitTypeDef NVIC_InitStructure;
  92.          
  93.           /* Enable CAN RX0 interrupt IRQ channel */
  94.           NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
  95.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  96.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  97.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  98.           NVIC_Init(&NVIC_InitStructure);
  99.          
  100.           NVIC_InitStructure.NVIC_IRQChannel = USB_HP_CAN1_TX_IRQn;
  101.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  102.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  103.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  104.           NVIC_Init(&NVIC_InitStructure);
  105.          
  106.           NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;
  107.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  108.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  109.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  110.           NVIC_Init(&NVIC_InitStructure);
  111.          
  112.          
  113.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  114.           RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
  115.           //Can Rx
  116.           GPIO_InitStruct.GPIO_Pin  =  GPIO_Pin_11;
  117.           GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  118.           GPIO_InitStruct.GPIO_Mode =  GPIO_Mode_IPU;
  119.           GPIO_Init(GPIOA,&GPIO_InitStruct);
  120.          
  121.           //Can Tx
  122.           GPIO_InitStruct.GPIO_Pin  =  GPIO_Pin_12;
  123.           GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  124.           GPIO_InitStruct.GPIO_Mode =  GPIO_Mode_AF_PP;
  125.           GPIO_Init(GPIOA,&GPIO_InitStruct);
  126.          
  127.           CAN1_Config_init();
  128.          
  129.           CAN_ITConfig(CAN1,CAN_IT_FMP0 | CAN_IT_FF0 | CAN_IT_FOV0, ENABLE);  // fifo0中斷
  130.           CAN_ITConfig(CAN1,CAN_IT_FMP1 | CAN_IT_FF1 | CAN_IT_FOV1, ENABLE);  // fifo1中斷
  131.           CAN_ITConfig(CAN1,CAN_IT_TME, DISABLE);                // 發送中斷
  132.           CAN_ITConfig(CAN1,CAN_IT_EWG | CAN_IT_EPV | CAN_IT_BOF | CAN_IT_LEC | CAN_IT_ERR | CAN_IT_WKU | CAN_IT_SLK, ENABLE);  // ERR中斷

  133.           // CAN緩存初始化
  134.           memset(CAN_msg_num,0,MAX_MAIL_NUM);   
  135.     }


  136.     int CAN1_Tx_msg(CanTxMsg TxMessage)
  137.     {
  138.         u8 TransmitMailbox = 0;
  139.       
  140.         TransmitMailbox = CAN_Transmit(CAN1,&TxMessage);
  141.         if(CAN_NO_MB == TransmitMailbox)
  142.         {
  143.             //發送失敗
  144.             return 0;
  145.         }
  146.         else
  147.         {         
  148.             CAN_msg_num[TransmitMailbox] = 1;
  149.          
  150.         }
  151.         CAN_ITConfig(CAN1,CAN_IT_TME, ENABLE);
  152.          
  153.         return 1;
  154.     }


  155.     u16 angle=0,angle_h=0,angle_l=0;
  156.     extern unsigned char angle_dir;
  157.     int CAN1_Tx_data(void)
  158.     {
  159.         CanTxMsg TxMessage;
  160.         u8 TransmitMailbox = 0,i=0;
  161.       
  162.         /* transmit */
  163.         TxMessage.StdId=0x6f1;//設定標準標識符
  164.         TxMessage.ExtId=0x1234;//設置擴展標識符
  165.         TxMessage.RTR=CAN_RTR_DATA;//設定待傳輸消息的幀類型
  166.         TxMessage.IDE=CAN_ID_STD;//設定消息標識符的類型
  167.         TxMessage.DLC=6; //數據長度
  168.          
  169.         angle=angle_data/10;
  170.         if(angle>9999) angle=9999;
  171.         angle_h=angle/100;
  172.         angle_h=angle_h/10*16+angle_h%10;
  173.         angle_l=angle%100;
  174.         angle_l=angle_l/10*16+angle_l%10;
  175.         Can1_Send_Buf[0]=angle_num;  //圈數
  176.         Can1_Send_Buf[1]=angle_h; //總角度
  177.         Can1_Send_Buf[2]=angle_l;
  178.         Can1_Send_Buf[3]=0;
  179.         Can1_Send_Buf[4]=0;
  180.         Can1_Send_Buf[5]=angle_dir;
  181.          
  182.         for(i=0;i < TxMessage.DLC;i++)
  183.         {
  184.            TxMessage.Data[i] = Can1_Send_Buf[i];
  185.         }
  186.          
  187.         TransmitMailbox = CAN_Transmit(CAN1,&TxMessage);
  188.         if(CAN_NO_MB == TransmitMailbox)
  189.         {
  190.             //發送失敗,沒有空郵箱
  191.             return 0;
  192.         }
  193.         else
  194.         {         
  195.             CAN_msg_num[TransmitMailbox] = 1;   
  196.         }
  197.         CAN_ITConfig(CAN1,CAN_IT_TME, ENABLE);
  198.          
  199.         Can1_Tx_Count++;
  200.         if(Can1_Tx_Count > 10000)
  201.            Can1_Tx_Count =0;
  202.          
  203.         Can1_Send_Delay =200;
  204.         return 1;
  205.     }

  206.     //解析數據
  207.     void  CAN1_Rx_Data(CanRxMsg RxMessage)
  208.     {     
  209.           u8  i =0;
  210.           if((RxMessage.StdId==0x6f1) && (RxMessage.IDE==CAN_ID_STD) && ((RxMessage.Data[1]|RxMessage.Data[0]<<8)==0xEB90))
  211.           {
  212.                
  213.               for(i=0;i < RxMessage.DLC;i++)
  214.               {
  215.                   Can1_Recv_Buf[i] =  RxMessage.Data[i];
  216.               }
  217.             
  218.               Can1_Rx_Count++;
  219.               if(Can1_Rx_Count > 10000)
  220.                  Can1_Rx_Count =0;
  221.           }
  222.     }
  223.     //發送完中斷函數
  224.     void CAN1_Send(void)
  225.     {
  226.          if(CAN_msg_num[0])
  227.          {
  228.             if(CAN_GetITStatus(CAN1,CAN_IT_RQCP0))
  229.             {
  230.                 CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP0);
  231.                 CAN_ITConfig(CAN1,CAN_IT_TME, DISABLE);
  232.                 CAN_msg_num[0] = 0;
  233.             }
  234.          }
  235.          if(CAN_msg_num[1])
  236.          {
  237.             if(CAN_GetITStatus(CAN1,CAN_IT_RQCP1))
  238.             {
  239.                 CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP1);
  240.                 CAN_ITConfig(CAN1,CAN_IT_TME, DISABLE);
  241.                 CAN_msg_num[1] = 0;
  242.             }
  243.          }  
  244.         if(CAN_msg_num[2])
  245.         {
  246.             if(CAN_GetITStatus(CAN1,CAN_IT_RQCP2))
  247.             {
  248.                 CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP2);
  249.                 CAN_ITConfig(CAN1,CAN_IT_TME, DISABLE);
  250.                 CAN_msg_num[2] = 0;
  251.             }
  252.         }
  253.     }
  254.     //接收中斷函數
  255.     void CAN1_Recv(unsigned char num)
  256.     {
  257.          CanRxMsg RxMessage;
  258.          switch(num)
  259.          {
  260.          case 0:
  261.               if(CAN_GetITStatus(CAN1,CAN_IT_FF0))
  262.               {
  263.                  CAN_ClearITPendingBit(CAN1,CAN_IT_FF0);
  264.               }
  265.               else if(CAN_GetITStatus(CAN1,CAN_IT_FOV0))
  266.               {
  267.                  CAN_ClearITPendingBit(CAN1,CAN_IT_FOV0);
  268.               }
  269.               else
  270.               {
  271.                  CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);
  272.                  //解析數據:
  273.                  CAN1_Rx_Data(RxMessage);
  274.               }
  275.               break;
  276.          case 1:
  277.               if(CAN_GetITStatus(CAN1,CAN_IT_FF1))
  278.               {
  279.                  CAN_ClearITPendingBit(CAN1,CAN_IT_FF1);
  280.               }
  281.               else if(CAN_GetITStatus(CAN1,CAN_IT_FOV1))
  282.               {
  283.                  CAN_ClearITPendingBit(CAN1,CAN_IT_FOV1);
  284.               }
  285.               else
  286.               {
  287.                  CAN_Receive(CAN1,CAN_FIFO1, &RxMessage);
  288.                 //解析數據
  289.                  CAN1_Rx_Data(RxMessage);
  290.               }
  291.               break;
  292.          }
  293.     }

  294.     void  CAN1_Main(unsigned char flg )
  295.     {
  296.           if(flg)
  297.           {
  298.             if(Can1_Send_Delay == 0)
  299.                CAN1_Tx_data();
  300.           }
  301.     }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久国产视频播放 | 国产精品久久久久久久 | 成人精品在线观看 | 黄色大片观看 | 成人无遮挡毛片免费看 | 偷拍自拍网址 | 国产激情毛片 | 在线一区观看 | 精品视频一区二区三区 | 国产精品久久久久久久久久三级 | 一区二区三区福利视频 | 日本啊v在线 | 欧美日韩在线一区二区 | 欧美偷偷| 午夜精品久久 | 精品视频一区二区三区 | 一区二区三区在线播放 | 亚洲国产中文字幕 | 干干天天| 三级黄色片在线播放 | 成人免费小视频 | 青青草视频网 | 欧美舔穴 | 久久1区| av av在线| 亚洲一区二区久久 | 精品欧美乱码久久久久久 | 国产一级片在线观看视频 | 三级成人在线 | 国产欧美精品一区二区三区 | 国产三级日本三级 | 国产综合精品 | 黑人巨大精品欧美一区二区一视频 | 日韩在线一区二区三区 | 久久精品这里 | 午夜综合 | 亚洲一区二区三区在线视频 | 中文字幕不卡在线88 | 精品成人一区二区 | 一区二区精品 | 日韩色图在线观看 |