找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1935|回复: 0
打印 上一主题 下一主题
收起左侧

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, 下载次数: 41)

评分

参与人数 2黑币 +54 收起 理由
STC庄伟 + 4 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表