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

標題: STC32G12K128單片機CAN程序 [打印本頁]

作者: 正是河豚    時間: 2022-9-5 17:13
標題: STC32G12K128單片機CAN程序
    1、基于艾克姆科技的STC32G12K128開發板+CAN轉TTL模塊,提供CAN通信的測試程序,程序是庫函數版本。
    2、實驗連接圖如下:(本實驗用到的是單片機的CAN2)


    3、CAN總線通信肯定不能只有一個節點,所以用戶還需電腦端連接個USB轉CAN的轉換器方便測試。USB轉CAN轉換器的CANH連接上圖CANH端子,
USB轉CAN轉換器的CANL連接上圖CANL端子。

    4、硬件連接好后,電腦打開USB轉CAN測試用軟件,設置波特率500K,通信界面如下:





    5、程序源碼基于Keil C251編寫。詳見附件


單片機源程序如下:
  1. /*************  功能說明    ****************************************************************************

  2. 上位機軟件通過USB轉CAN轉換器連接CAN模塊,MCU定時向上位機發送標準幀。
  3. 若上位機向MCU發送數據,MCU會回傳相同的一幀數據。

  4. 注:下載時, 選擇時鐘 24MHZ (CAN波特率500KHz)。

  5. ********************************************************************************************************/     
  6. #include  "config.h"
  7. #include  "can.h"        
  8. #include        "STC32G_CAN.h"
  9. #include  "timer.h"        

  10. extern volatile uint8 B_1ms;
  11. extern bit B_Can2Send;
  12. extern bit B_Can2Read;

  13. uint16 CAN2_ID;              //CAN數據幀ID
  14. uint8 RX2_BUF[8];            //CAN接收數組
  15. uint8 TX2_BUF[8];            //CAN發送數組

  16. uint16 msecond;

  17. /***************************************************************************
  18. * 描  述 : CAN2等待函數
  19. * 入  參 : uint8 i
  20. * 返回值 : 無
  21. **************************************************************************/
  22. void WaitCan2Send(uint8 i)
  23. {
  24.          while((--i) && (B_Can2Send));
  25. }

  26. /***************************************************************************
  27. * 描  述 : 主函數
  28. * 入  參 : 無
  29. * 返回值 : 無
  30. **************************************************************************/
  31. int main()
  32. {
  33.   uint8 sr;
  34.         uint8 buffer[16];

  35.         WTST = 0;  //設置程序指令延時參數,賦值為0可將CPU執行指令的速度設置為最快
  36.   Timer0Init();                //定時器0初始化
  37.         CAN_Init();                  //CAN初始化
  38.         EA = 1;                      //打開總中斷

  39.         //CAN一幀數據信息
  40.         CAN2_ID = 0x0123;
  41.         TX2_BUF[0] = 0x21;
  42.         TX2_BUF[1] = 0x22;
  43.         TX2_BUF[2] = 0x23;
  44.         TX2_BUF[3] = 0x24;
  45.         TX2_BUF[4] = 0x25;
  46.         TX2_BUF[5] = 0x26;
  47.         TX2_BUF[6] = 0x27;
  48.         TX2_BUF[7] = 0x28;
  49.         
  50.         while(1)
  51.         {
  52.                 if(B_1ms)   //1ms到
  53.                 {
  54.                         B_1ms = 0;
  55.                         if(++msecond >= 1000)   //1秒到
  56.                         {
  57.                                 msecond = 0;

  58.                                 //------------------處理CAN2模塊-----------------------
  59.                                 AUXR2 |= 0x08;                //選擇CAN2模塊
  60.                                 sr = CanReadReg(SR);

  61.                                 if((sr & 0x88)==0x80)                //接收空閑,接收BUFFER有數據幀
  62.                                 {
  63.                                         CanReadFifo(buffer);  //讀取清除接收BUFFER
  64.                                 }
  65.                                 
  66.                                 if(sr & 0x01)                //判斷是否有 BS:BUS-OFF狀態
  67.                                 {
  68.                                         CANAR = MR;
  69.                                         CANDR &= ~0x04;  //清除 Reset Mode, 從BUS-OFF狀態退出
  70.                                 }
  71.                                 else
  72.                                 {
  73.                                         B_Can2Send = 1;
  74.                                         CanSendStandardFrame(CAN2_ID,TX2_BUF);
  75.                                         WaitCan2Send(50);    //等待CAN2發送完畢
  76.                                 }
  77.                         }
  78.                 }

  79.                 if(B_Can2Read)
  80.                 {
  81.                         B_Can2Read = 0;
  82.                         
  83.                         AUXR2 |= 0x08;                //選擇CAN2模塊
  84.                         CAN2_ID = CanReadStandardFrame(RX2_BUF);        //接收CAN總線數據
  85.                         CanSendStandardFrame(CAN2_ID+1,RX2_BUF);        //發送CAN總線數據
  86.                 }
  87.         }
  88. }
復制代碼
  1. #include        "can.h"

  2. /**************************************************************************
  3. 功能描述:CAN口初始化
  4. 入口參數:無
  5. 返回值:無
  6. *************************************************************************/
  7. void CAN_Init(void)
  8. {
  9.         CAN_InitTypeDef        CAN_InitStructure;                                        //結構定義
  10.         

  11.   P0_MODE_IO_PU(GPIO_Pin_2|GPIO_Pin_3);                  //P0.2~P0.3 設置為準雙向口
  12.         CAN2_SW(CAN2_P02_P03);                                            //CAN2_P02_P03,CAN2_P52_P53,CAN2_P46_P47,CAN2_P72_P73

  13.   EAXSFR();                          //將EAXFR位置1,以訪問在XDATA區域的擴展SFR
  14.         CAN_InitStructure.CAN_Enable = ENABLE;                //CAN功能使能   ENABLE或DISABLE
  15.         CAN_InitStructure.CAN_IMR    = CAN_ALLIM;        //CAN中斷寄存器         CAN_DOIM,CAN_BEIM,CAN_TIM,CAN_RIM,CAN_EPIM,CAN_EWIM,CAN_ALIM,CAN_ALLIM,DISABLE
  16.         CAN_InitStructure.CAN_SJW    = 0;                                        //重新同步跳躍寬度  0~3
  17.         CAN_InitStructure.CAN_SAM    = 0;                                        //總線電平采樣次數  0:采樣1次; 1:采樣3次

  18.         //CAN總線波特率=Fclk/((1+(TSG1+1)+(TSG2+1))*(BRP+1)*2)
  19.         CAN_InitStructure.CAN_TSG1   = 2;                                        //同步采樣段1       0~15
  20.         CAN_InitStructure.CAN_TSG2   = 1;                                        //同步采樣段2       1~7 (TSG2 不能設置為0)
  21.         CAN_InitStructure.CAN_BRP    = 3;                                        //波特率分頻系數    0~63
  22.         //24000000/((1+3+2)*4*2)=500KHz

  23.         CAN_InitStructure.CAN_ACR0    = 0x00;                        //總線驗收代碼寄存器 0~0xFF
  24.         CAN_InitStructure.CAN_ACR1    = 0x00;
  25.         CAN_InitStructure.CAN_ACR2    = 0x00;
  26.         CAN_InitStructure.CAN_ACR3    = 0x00;
  27.         CAN_InitStructure.CAN_AMR0    = 0xff;                        //總線驗收屏蔽寄存器 0~0xFF
  28.         CAN_InitStructure.CAN_AMR1    = 0xff;
  29.         CAN_InitStructure.CAN_AMR2    = 0xff;
  30.         CAN_InitStructure.CAN_AMR3    = 0xff;
  31.         CAN_Inilize(CAN2,&CAN_InitStructure);                        //CAN2 初始化
  32.         
  33.         NVIC_CAN_Init(CAN2,ENABLE,Priority_1);                //中斷使能, CAN1/CAN2; ENABLE/DISABLE; 優先級(低到高) Priority_0,Priority_1,Priority_2,Priority_3


  34. }



  35. /*********************************END FILE********************************************/        
復制代碼


Keil代碼下載: 程序.7z (45.67 KB, 下載次數: 47)

作者: 內卷1234    時間: 2024-9-14 15:21
這個芯片帶CAN還用TTL轉can,這個意義是什么啊

作者: mtt661    時間: 2024-9-18 16:09
內卷1234 發表于 2024-9-14 15:21
這個芯片帶CAN還用TTL轉can,這個意義是什么啊

這個芯片只集成了CAN控制器,沒有CAN收發器




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲网在线 | 国产成人免费视频网站视频社区 | 亚洲成人免费在线 | 欧美激情欧美激情在线五月 | www.嫩草 | 日韩欧美在线观看视频 | 国产精品久久久久久久久动漫 | 久久99精品久久 | 久久国产一区二区三区 | 国产视频久久久 | 国产精品久久 | 日韩国产精品一区二区三区 | 一级黄色片毛片 | 日韩在线观看中文字幕 | 精品国产免费一区二区三区五区 | 国产美女视频黄a视频免费 国产精品福利视频 | 人人人人爽 | 国产精品美女一区二区三区 | 久久久久久亚洲精品不卡 | 国产精品一区一区 | 久久的色 | 免费观看一区二区三区毛片 | 亚洲精品乱码久久久久久按摩 | 美女逼网站| 国产一区二区不卡 | 久久剧场 | 国产精品久久久久久久久久软件 | 国产一区二区电影网 | 日韩在线视频免费观看 | 日韩精品 电影一区 亚洲 | 久久激情视频 | 91观看 | 久久91视频 | 国产精品一区二区视频 | 中文字幕1区2区3区 日韩在线视频免费观看 | www视频在线观看 | 国产人成精品一区二区三 | 91精品国产日韩91久久久久久 | 西西裸体做爰视频 | 久在线视频播放免费视频 | 亚洲成人免费观看 |