找回密码
 立即注册
查看: 931|回复: 4

冲哥 子午鸳鸯钺 CAN测试救助

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:490
  • 最近打卡:2025-05-03 06:32:49
已绑定手机

20

主题

293

回帖

4444

积分

论坛元老

积分
4444
发表于 2023-12-9 15:24:14 | 显示全部楼层 |阅读模式

使用冲哥的子午鸳鸯钺,两组CAN进行连接,DEMO使用的函数的例程,对CAN的引脚进行了修改,其他代码没有修改。
目前无法printf。下图为连接方式。
IMG_20231209_151101.jpg IMG_20231209_151105.jpg

代码如下
  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
  4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
  7. /* --- Web: www.STCAI.com ---------------------------------------------*/
  8. /* --- Web: www.STCMCUDATA.com  ---------------------------------------*/
  9. /* --- BBS: www.STCAIMCU.com  -----------------------------------------*/
  10. /* --- QQ:  800003751 -------------------------------------------------*/
  11. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序            */
  12. /*---------------------------------------------------------------------*/
  13. #include        "STC32G_CAN.h"
  14. #include        "STC32G_GPIO.h"
  15. #include        "STC32G_NVIC.h"
  16. #include        "STC32G_UART.h"
  17. #include        "STC32G_Timer.h"
  18. #include        "STC32G_Switch.h"
  19. /*************   功能说明   ***************
  20. CAN1、CAN2总线同时使用收发测试用例.
  21. DCAN是一个支持CAN2.0B协议的功能单元。
  22. 收到一帧数据后, 通过串口1(P3.0,P3.1)发送出去,串口参数:115200,N,8,1.
  23. 需要在"STC32G_UART.h"里设置: #define        PRINTF_SELECT  UART1
  24. MCU每秒钟从CAN1、CAN2发送一帧固定数据,每发一帧ID号加1.
  25. CAN2设置单滤波模式,只接收ID为 0x280~0x2ff 的标准帧报文
  26. 默认CAN总线波特率500KHz, 用户可自行修改.
  27. 下载时, 选择时钟 24MHz (用户可在"config.h"修改频率).
  28. ******************************************/
  29. /*************        本地常量声明        **************/
  30. /*************        本地变量声明        **************/
  31. u16 msecond;
  32. /*************        本地函数声明        **************/
  33. /*************  外部函数和变量声明 *****************/
  34. /******************** IO口配置 ********************/
  35. void GPIO_config(void)
  36. {
  37.         P3_MODE_IO_PU(GPIO_Pin_0 | GPIO_Pin_1);                //P3.0,P3.1 设置为准双向口
  38.         P0_MODE_IO_PU(GPIO_Pin_LOW);                //P0.0~P0.3 设置为准双向口
  39.         CAN1_SW(CAN1_P00_P01);                                //CAN1_P00_P01,CAN1_P50_P51,CAN1_P42_P45,CAN1_P70_P71
  40.         CAN2_SW(CAN2_P02_P03);                                //CAN2_P02_P03,CAN2_P52_P53,CAN2_P46_P47,CAN2_P72_P73
  41. }
  42. /************************ 定时器配置 ****************************/
  43. void Timer_config(void)
  44. {
  45.         TIM_InitTypeDef                TIM_InitStructure;                                                //结构定义
  46.         TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;        //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
  47.         TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;                //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
  48.         TIM_InitStructure.TIM_ClkOut    = DISABLE;                                //是否输出高速脉冲, ENABLE或DISABLE
  49.         TIM_InitStructure.TIM_Value     = (u16)(65536UL - (MAIN_Fosc / 1000UL));                //初值, 1秒钟中断1000次
  50.         TIM_InitStructure.TIM_PS        = 0;                                        //8位预分频器(n+1), 0~255
  51.         TIM_InitStructure.TIM_Run       = ENABLE;                                //是否初始化后启动定时器, ENABLE或DISABLE
  52.         Timer_Inilize(Timer0,&TIM_InitStructure);                                //初始化Timer0          Timer0,Timer1,Timer2,Timer3,Timer4
  53.         NVIC_Timer0_Init(ENABLE,Priority_0);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
  54. }
  55. /***************  串口初始化函数 *****************/
  56. void UART_config(void)
  57. {
  58.         COMx_InitDefine                COMx_InitStructure;                                        //结构定义
  59.         COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;                //模式,   UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
  60.         COMx_InitStructure.UART_BRT_Use   = BRT_Timer2;                        //选择波特率发生器, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2, 所以不用选择)
  61.         COMx_InitStructure.UART_BaudRate  = 115200ul;                        //波特率,     110 ~ 115200
  62.         COMx_InitStructure.UART_RxEnable  = ENABLE;                                //接收允许,   ENABLE或DISABLE
  63.         UART_Configuration(UART1, &COMx_InitStructure);                //初始化串口 USART1,USART2,USART3,USART4
  64.         NVIC_UART1_Init(ENABLE,Priority_1);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
  65.         UART1_SW(UART1_SW_P30_P31);                //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
  66. }
  67. /******************** CAN 配置 ********************/
  68. void CAN_config(void)
  69. {
  70.         CAN_InitTypeDef        CAN_InitStructure;                        //结构定义
  71.         CAN_InitStructure.CAN_Enable = ENABLE;                //CAN功能使能   ENABLE或DISABLE
  72.         CAN_InitStructure.CAN_IMR    = CAN_ALLIM;        //CAN中断寄存器         CAN_DOIM,CAN_BEIM,CAN_TIM,CAN_RIM,CAN_EPIM,CAN_EWIM,CAN_ALIM,CAN_ALLIM,DISABLE
  73.         CAN_InitStructure.CAN_SJW    = 0;                        //重新同步跳跃宽度  0~3
  74.         CAN_InitStructure.CAN_SAM    = 0;                        //总线电平采样次数  0:采样1次; 1:采样3次
  75.         //CAN总线波特率=Fclk/((1+(TSG1+1)+(TSG2+1))*(BRP+1)*2)
  76.         CAN_InitStructure.CAN_TSG1   = 2;                        //同步采样段1       0~15
  77.         CAN_InitStructure.CAN_TSG2   = 1;                        //同步采样段2       1~7 (TSG2 不能设置为0)
  78.         CAN_InitStructure.CAN_BRP    = 3;                        //波特率分频系数    0~63
  79.         //24000000/((1+3+2)*4*2)=500KHz
  80.         CAN_InitStructure.CAN_ListenOnly = DISABLE;        //Listen Only模式   ENABLE,DISABLE
  81.         CAN_InitStructure.CAN_Filter  = SINGLE_FILTER;//滤波选择  DUAL_FILTER(双滤波),SINGLE_FILTER(单滤波)
  82.         CAN_InitStructure.CAN_ACR0    = 0x00;                //总线验收代码寄存器 0~0xFF
  83.         CAN_InitStructure.CAN_ACR1    = 0x00;
  84.         CAN_InitStructure.CAN_ACR2    = 0x00;
  85.         CAN_InitStructure.CAN_ACR3    = 0x00;
  86.         CAN_InitStructure.CAN_AMR0    = 0xff;                //总线验收屏蔽寄存器 0~0xFF
  87.         CAN_InitStructure.CAN_AMR1    = 0xff;
  88.         CAN_InitStructure.CAN_AMR2    = 0xff;
  89.         CAN_InitStructure.CAN_AMR3    = 0xff;
  90.         CAN_Inilize(CAN1,&CAN_InitStructure);                //CAN1 初始化
  91.     //只接收 ID 为 0x280 ~ 0x2ff 的标准帧报文
  92.     CAN_InitStructure.CAN_ACR0    = 0x50;                //总线验收代码寄存器 0~0xFF
  93.         CAN_InitStructure.CAN_ACR1    = 0x00;
  94.         CAN_InitStructure.CAN_ACR2    = 0x00;
  95.         CAN_InitStructure.CAN_ACR3    = 0x00;
  96.         CAN_InitStructure.CAN_AMR0    = 0x0f;                //总线验收屏蔽寄存器 0~0xFF
  97.         CAN_InitStructure.CAN_AMR1    = 0xef;
  98.         CAN_InitStructure.CAN_AMR2    = 0xff;
  99.         CAN_InitStructure.CAN_AMR3    = 0xff;
  100.         CAN_Inilize(CAN2,&CAN_InitStructure);                //CAN2 初始化
  101.        
  102.         NVIC_CAN_Init(CAN1,ENABLE,Priority_1);                //中断使能, CAN1/CAN2; ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
  103.         NVIC_CAN_Init(CAN2,ENABLE,Priority_1);                //中断使能, CAN1/CAN2; ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
  104. }
  105. /**********************************************/
  106. void main(void)
  107. {
  108.         u8 n,i,j;
  109.         u8 sr;
  110.         WTST = 0;                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  111.         EAXSFR();                //扩展SFR(XFR)访问使能
  112.         CKCON = 0;      //提高访问XRAM速度
  113.         GPIO_config();
  114.     Timer_config();
  115.     UART_config();
  116.         CAN_config();
  117.         EA = 1;
  118.         //====初始化数据=====
  119.         CAN1_Tx.FF = STANDARD_FRAME;    //标准帧
  120.         CAN1_Tx.RTR = 0;                //0:数据帧,1:远程帧
  121.         CAN1_Tx.DLC = 0x08;             //数据长度
  122. //        CAN1_Tx.ID = 0x02f8;            //CAN ID
  123.         CAN1_Tx.ID = 0x0278;            //CAN ID
  124.         CAN1_Tx.DataBuffer[0] = 0x11;   //数据内容
  125.         CAN1_Tx.DataBuffer[1] = 0x12;
  126.         CAN1_Tx.DataBuffer[2] = 0x13;
  127.         CAN1_Tx.DataBuffer[3] = 0x14;
  128.         CAN1_Tx.DataBuffer[4] = 0x15;
  129.         CAN1_Tx.DataBuffer[5] = 0x16;
  130.         CAN1_Tx.DataBuffer[6] = 0x17;
  131.         CAN1_Tx.DataBuffer[7] = 0x18;
  132.        
  133.         CAN2_Tx.FF = EXTENDED_FRAME;    //扩展帧
  134.         CAN2_Tx.RTR = 0;                //0:数据帧,1:远程帧
  135.         CAN2_Tx.DLC = 0x08;             //数据长度
  136.         CAN2_Tx.ID = 0x03456789;        //CAN ID
  137.         CAN2_Tx.DataBuffer[0] = 0x21;   //数据内容
  138.         CAN2_Tx.DataBuffer[1] = 0x22;
  139.         CAN2_Tx.DataBuffer[2] = 0x23;
  140.         CAN2_Tx.DataBuffer[3] = 0x24;
  141.         CAN2_Tx.DataBuffer[4] = 0x25;
  142.         CAN2_Tx.DataBuffer[5] = 0x26;
  143.         CAN2_Tx.DataBuffer[6] = 0x27;
  144.         CAN2_Tx.DataBuffer[7] = 0x28;
  145.         while (1)
  146.         {
  147.         if(T0_1ms)
  148.         {
  149.             T0_1ms = 0;
  150.             //------------------处理CAN1模块-----------------------
  151.             if(++msecond >= 1000)   //1秒到
  152.             {
  153.                 msecond = 0;
  154.                 CANSEL = CAN1;                //选择CAN1模块
  155.                 sr = CanReadReg(SR);
  156.                 if(sr & 0x01)                //判断是否有 BS:BUS-OFF状态
  157.                 {
  158.                     CANAR = MR;
  159.                     CANDR &= ~0x04;  //清除 Reset Mode, 从BUS-OFF状态退出
  160.                 }
  161.                 else
  162.                 {
  163.                     CanSendMsg(&CAN1_Tx);   //发送一帧数据
  164.                     CAN1_Tx.ID += 0x01;        //CAN ID
  165.                 }
  166. //                //------------------处理CAN2模块-----------------------
  167.                 CANSEL = CAN2;                //选择CAN2模块
  168.                 sr = CanReadReg(SR);
  169.                 if(sr & 0x01)                //判断是否有 BS:BUS-OFF状态
  170.                 {
  171.                     CANAR = MR;
  172.                     CANDR &= ~0x04;  //清除 Reset Mode, 从BUS-OFF状态退出
  173.                 }
  174.                 else
  175.                 {
  176.                     CanSendMsg(&CAN2_Tx);   //发送一帧数据
  177.                     CAN2_Tx.ID += 0x0001;        //CAN ID
  178.                 }
  179.             }
  180.         }
  181.                 if(B_Can1Read)      //判断 CAN1 是否接收到数据
  182.                 {
  183.                         B_Can1Read = 0;
  184.                        
  185.                         CANSEL = CAN1;                //选择CAN1模块
  186.             n = CanReadMsg(CAN1_Rx);    //读取接收内容
  187.             if(n>0)
  188.             {
  189.                 for(i=0;i<n;i++)
  190.                 {
  191. //                    CanSendMsg(&CAN1_Rx[i]);  //CAN总线原样返回
  192.                     printf("CAN1 ID=0x%08lX DLC=%d FF=%d RTR=%d ",CAN1_Rx[i].ID,CAN1_Rx[i].DLC,CAN1_Rx[i].FF,CAN1_Rx[i].RTR);   //串口打印帧信息
  193.                     for(j=0;j<CAN1_Rx[i].DLC;j++)
  194.                     {
  195.                         printf("0x%02X ",CAN1_Rx[i].DataBuffer[j]);    //从串口输出收到的数据
  196.                     }
  197.                     printf("\r\n");
  198.                 }
  199.             }
  200.                 }
  201.                 if(B_Can2Read)      //判断 CAN2 是否接收到数据
  202.                 {
  203.                         B_Can2Read = 0;
  204.                        
  205.                         CANSEL = CAN2;                //选择CAN2模块
  206.             n = CanReadMsg(CAN2_Rx);    //读取接收内容
  207.             if(n>0)
  208.             {
  209.                 for(i=0;i<n;i++)
  210.                 {
  211. //                    CanSendMsg(&CAN2_Rx[i]);  //CAN总线原样返回
  212.                     printf("CAN2 ID=0x%08lX DLC=%d FF=%d RTR=%d ",CAN2_Rx[i].ID,CAN2_Rx[i].DLC,CAN2_Rx[i].FF,CAN2_Rx[i].RTR);   //串口打印帧信息
  213.                     for(j=0;j<CAN2_Rx[i].DLC;j++)
  214.                     {
  215.                         printf("0x%02X ",CAN2_Rx[i].DataBuffer[j]);    //从串口输出收到的数据
  216.                     }
  217.                     printf("\r\n");
  218.                 }
  219.             }
  220.                 }
  221.         }
  222. }
复制代码


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:490
  • 最近打卡:2025-05-03 06:32:49
已绑定手机

20

主题

293

回帖

4444

积分

论坛元老

积分
4444
发表于 2023-12-10 12:07:56 | 显示全部楼层
昨天CAN测试的问题找到了,由于没有开启120欧姆电阻导致异常。
下面是今天的测试,STC强大。



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2023-12-10 12:34:38 | 显示全部楼层
估计总有一天,你会用这 2组 CAN 去造车,不是检测保养美容
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:41
  • 最近打卡:2024-11-28 14:10:29

0

主题

18

回帖

226

积分

中级会员

积分
226
发表于 2024-10-8 08:40:01 | 显示全部楼层
楼主,源码分享一下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-10-8 13:39:09 | 显示全部楼层
恍如*** 发表于 2024-10-8 08:40
楼主,源码分享一下

官网、论坛都有CAN总线通信例子可以参考。
STC32G实验箱例程包,或者屠龙刀例程包里面就有
https://www.stcaimcu.com/plugin. ... /~cateid=8&key=
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 14:31 , Processed in 0.124278 second(s), 79 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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