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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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)

評分

參與人數 2黑幣 +54 收起 理由
STC莊偉 + 4 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:1111967 發表于 2024-9-14 15:21 | 只看該作者
這個芯片帶CAN還用TTL轉can,這個意義是什么啊
回復

使用道具 舉報

板凳
ID:1010435 發表于 2024-9-18 16:09 | 只看該作者
內卷1234 發表于 2024-9-14 15:21
這個芯片帶CAN還用TTL轉can,這個意義是什么啊

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人综合亚洲欧美94在线 | 韩国精品在线观看 | 亚洲精品久久久一区二区三区 | 综合久久99 | 美女激情av | 精品久| 国产在线视频三区 | 日本精品一区二区 | 亚洲一区二区三 | 天天操天天天干 | 日韩高清www | 亚洲欧美精品国产一级在线 | 性高湖久久久久久久久3小时 | 免费欧美视频 | 久久免费精品 | 久久久av | 黄色片在线免费看 | av网站观看 | 久久久91精品国产一区二区三区 | 成人午夜电影在线观看 | 91免费视频观看 | 中文字幕第三页 | 天天干天天爱天天爽 | 伊人在线 | 日韩欧美亚洲 | 亚洲电影专区 | 在线观看国产91 | 在线免费观看黄色av | 99精品久久久久久中文字幕 | 日本午夜视频 | 日韩综合在线播放 | 欧美日韩综合 | 国产乱人伦精品一区二区 | 国产一区二区三区四区hd | 男人久久天堂 | 在线日韩视频 | 成人h片在线观看 | 亚洲综合中文字幕在线观看 | 福利视频一区二区三区 | 日韩视频在线一区 | 在线观看亚洲专区 |