找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3199|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

STC32G12K128單片機(jī)CAN程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
    1、基于艾克姆科技的STC32G12K128開發(fā)板+CAN轉(zhuǎn)TTL模塊,提供CAN通信的測(cè)試程序,程序是庫函數(shù)版本。
    2、實(shí)驗(yàn)連接圖如下:(本實(shí)驗(yàn)用到的是單片機(jī)的CAN2)


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

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





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


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

  2. 上位機(jī)軟件通過USB轉(zhuǎn)CAN轉(zhuǎn)換器連接CAN模塊,MCU定時(shí)向上位機(jī)發(fā)送標(biāo)準(zhǔn)幀。
  3. 若上位機(jī)向MCU發(fā)送數(shù)據(jù),MCU會(huì)回傳相同的一幀數(shù)據(jù)。

  4. 注:下載時(shí), 選擇時(shí)鐘 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數(shù)據(jù)幀ID
  14. uint8 RX2_BUF[8];            //CAN接收數(shù)組
  15. uint8 TX2_BUF[8];            //CAN發(fā)送數(shù)組

  16. uint16 msecond;

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

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

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

  39.         //CAN一幀數(shù)據(jù)信息
  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有數(shù)據(jù)幀
  62.                                 {
  63.                                         CanReadFifo(buffer);  //讀取清除接收BUFFER
  64.                                 }
  65.                                 
  66.                                 if(sr & 0x01)                //判斷是否有 BS:BUS-OFF狀態(tài)
  67.                                 {
  68.                                         CANAR = MR;
  69.                                         CANDR &= ~0x04;  //清除 Reset Mode, 從BUS-OFF狀態(tài)退出
  70.                                 }
  71.                                 else
  72.                                 {
  73.                                         B_Can2Send = 1;
  74.                                         CanSendStandardFrame(CAN2_ID,TX2_BUF);
  75.                                         WaitCan2Send(50);    //等待CAN2發(fā)送完畢
  76.                                 }
  77.                         }
  78.                 }

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

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

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

  13.   EAXSFR();                          //將EAXFR位置1,以訪問在XDATA區(qū)域的擴(kuò)展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;                                        //總線電平采樣次數(shù)  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 不能設(shè)置為0)
  21.         CAN_InitStructure.CAN_BRP    = 3;                                        //波特率分頻系數(shù)    0~63
  22.         //24000000/((1+3+2)*4*2)=500KHz

  23.         CAN_InitStructure.CAN_ACR0    = 0x00;                        //總線驗(yàn)收代碼寄存器 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;                        //總線驗(yàn)收屏蔽寄存器 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; 優(yōu)先級(jí)(低到高) Priority_0,Priority_1,Priority_2,Priority_3


  34. }



  35. /*********************************END FILE********************************************/        
復(fù)制代碼


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

評(píng)分

參與人數(shù) 2黑幣 +54 收起 理由
STC莊偉 + 4 很給力!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:1111967 發(fā)表于 2024-9-14 15:21 | 只看該作者
這個(gè)芯片帶CAN還用TTL轉(zhuǎn)can,這個(gè)意義是什么啊
回復(fù)

使用道具 舉報(bào)

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

這個(gè)芯片只集成了CAN控制器,沒有CAN收發(fā)器
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表