找回密码
 立即注册
查看: 1340|回复: 25

CAN数据发送求助大神 | 已解决

[复制链接]

该用户从未签到

1

主题

5

回帖

25

积分

新手上路

积分
25
发表于 2023-7-24 09:14:21 | 显示全部楼层 |阅读模式
小白我做can通讯实验用的实验代码,1秒定时时间到后发送两帧can数据,结果是每次只发送一条什么原因,大神给指导
微信图片_20230724091219.png
回复 送花

使用道具 举报

该用户从未签到

1

主题

5

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2023-7-24 09:15:30 | 显示全部楼层
两条发送语句只执行第一句
回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

5

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2023-7-24 09:16:33 | 显示全部楼层
canid++是执行的,只是不发送数据
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 131 天

    [LV.7]常住居民III

    26

    主题

    1297

    回帖

    4033

    积分

    论坛元老

    积分
    4033
    发表于 2023-7-24 09:28:46 | 显示全部楼层
    本帖最后由 乘风飞扬 于 2023-7-24 09:32 编辑

    参考最新的屠龙刀例程包,或者STC32G库函数例程包里CAN总线例程,在“CanSendMsg”函数里增加发送完成判断(B_CanxSend ),上一帧数据发送完成后再发送本次数据,避免产生覆盖:
    1. void CanSendMsg(CAN_DataDef *CAN)
    2. {
    3.     u32 CanID;
    4.     u8 RX_Index,i;
    5.     if(CANSEL)  //判断是否CAN2
    6.     {
    7.         while(B_Can2Send);  //等待CAN2上次发送完成
    8.     }
    9.     else
    10.     {
    11.         while(B_Can1Send);  //等待CAN1上次发送完成
    12.     }
    13.     if(CAN->FF)     //判断是否扩展帧
    14.     {
    15.         CanID = CAN->ID << 3;
    16.         CanWriteReg(TX_BUF0,CAN->DLC|((u8)CAN->RTR<<6)|0x80);        //bit7: 标准帧(0)/扩展帧(1), bit6: 数据帧(0)/远程帧(1), bit3~bit0: 数据长度(DLC)
    17.         CanWriteReg(TX_BUF1,(u8)(CanID>>24));
    18.         CanWriteReg(TX_BUF2,(u8)(CanID>>16));
    19.         CanWriteReg(TX_BUF3,(u8)(CanID>>8));
    20.         CanWriteReg(TX_BUF0,(u8)CanID);
    21.         RX_Index = 1;
    22.         for(i=0;((i<CAN->DLC) && (i<8));i++)        //数据长度为DLC,最多不超过8
    23.         {
    24.             CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),CAN->DataBuffer[i]);   //写入有效数据
    25.         }
    26.         while(RX_Index&3)   //判断已读数据长度是否4的整数倍
    27.         {
    28.             CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),0x00);  //写入填充数据,一帧数据占据4的整数倍缓冲区空间,不足补0
    29.         }
    30.     }
    31.     else    //发送标准帧
    32.     {
    33.         CanID = (u16)(CAN->ID << 5);
    34.         CanWriteReg(TX_BUF0,CAN->DLC|((u8)CAN->RTR<<6));  //bit7: 标准帧(0)/扩展帧(1), bit6: 数据帧(0)/远程帧(1), bit3~bit0: 数据长度(DLC)
    35.         CanWriteReg(TX_BUF1,(u8)(CanID>>8));
    36.         CanWriteReg(TX_BUF2,(u8)CanID);
    37.         RX_Index = 3;
    38.         for(i=0;((i<CAN->DLC) && (i<8));i++)        //数据长度为DLC,最多不超过8
    39.         {
    40.             CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),CAN->DataBuffer[i]);   //写入有效数据
    41.         }
    42.         while(RX_Index&3)   //判断已读数据长度是否4的整数倍
    43.         {
    44.             CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),0x00);  //写入填充数据,一帧数据占据4的整数倍缓冲区空间,不足补0
    45.         }
    46.     }
    47.     CanWriteReg(CMR ,0x04);                //发起一次帧传输
    48.    
    49.     if(CANSEL)  //判断是否CAN2
    50.     {
    51.         B_Can2Send = 1;     //设置CAN2发送忙标志
    52.     }
    53.     else
    54.     {
    55.         B_Can1Send = 1;     //设置CAN1发送忙标志
    56.     }
    57. }
    复制代码
    在中断函数里清除发送完成标志"B_Can1Send ":
    1. if((isr & 0x04) == 0x04)  //TI
    2. {
    3.     CANAR = ISR;
    4.     CANDR = 0x04;    //CLR FLAG
    5.                
    6.     B_Can1Send = 0;
    7. }        
    复制代码

    点评

    求助大佬我一包数据如果发送多帧比如100帧怎么设置,我也遇到和楼主一样的情况,就发包里面第一帧数据,不应该是后面覆盖前面的吗?我在官方基础上取消了1ms中断发送,根据条件发送一包数据那在哪加判断发送完成?可   发表于 2023-8-27 08:10
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    2

    主题

    13

    回帖

    74

    积分

    注册会员

    积分
    74
    发表于 2023-7-24 10:14:54 来自手机 | 显示全部楼层
    楼主这个程序是官方例程修改的,例程我没有修改我这个怎么一直1ms发送一次呢?定时器的值修改和计算器1000修改依然没用
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    5

    回帖

    25

    积分

    新手上路

    积分
    25
     楼主| 发表于 2023-7-24 10:30:34 | 显示全部楼层
    感谢指导,我试一下
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    5

    回帖

    25

    积分

    新手上路

    积分
    25
     楼主| 发表于 2023-7-24 11:08:35 | 显示全部楼层
    乘风飞扬 发表于 2023-7-24 09:28
    参考最新的屠龙刀例程包,或者STC32G库函数例程包里CAN总线例程,在“CanSendMsg”函数里增加发送完成判断( ...

    在中断里面加了清除标志,在发送那里加了等待,发送函数里面也加了标志,还是不行发不出我要发的数据

    中断中清除标志

    中断中清除标志

    发送函数加标志

    发送函数加标志
    微信图片_20230724103927.png
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 131 天

    [LV.7]常住居民III

    26

    主题

    1297

    回帖

    4033

    积分

    论坛元老

    积分
    4033
    发表于 2023-7-24 11:36:39 | 显示全部楼层
    stcstc 发表于 2023-7-24 10:14
    楼主这个程序是官方例程修改的,例程我没有修改我这个怎么一直1ms发送一次呢?定时器的值修改和计算器1000 ...

    CAN数据收发测试,需要总线上至少有2个节点,一个节点发送数据时另一个节点能够进行应答,这样才能正常收发。
    没有节点进行应答的话,当前发送的CAN总线控制器会认为发送有误,就会进行重发。

    点评

    我屠龙刀上面两路can连一起了,用stc32g实验箱标准帧收发做的测试,程序自己发送原样返回是不是也算接收过程呢?这个例程是不是就一组配置了? 如果需要完整的主从网络实验可以把这个程序复制一下把另一个can也打开就   发表于 2023-7-24 13:39
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    5

    回帖

    25

    积分

    新手上路

    积分
    25
     楼主| 发表于 2023-7-24 12:32:55 | 显示全部楼层
    我用的can收发器测试的,收到的都是同一条数据,只是ID  ++了
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    4 小时前
  • 签到天数: 131 天

    [LV.7]常住居民III

    26

    主题

    1297

    回帖

    4033

    积分

    论坛元老

    积分
    4033
    发表于 2023-7-24 13:32:55 | 显示全部楼层
    421435178@qq.co 发表于 2023-7-24 12:32
    我用的can收发器测试的,收到的都是同一条数据,只是ID  ++了

    用附件例程试试,CAN1发送完一次数据后将CANID加1,然后再发送一次:

    1.                 if(sr & 0x01)                //判断是否有 BS:BUS-OFF状态
    2.                 {
    3.                     CANAR = MR;
    4.                     CANDR &= ~0x04;  //清除 Reset Mode, 从BUS-OFF状态退出
    5.                 }
    6.                 else
    7.                 {
    8.                     CanSendMsg(&CAN1_Tx);   //发送一帧数据
    9.                     CAN1_Tx.ID++;
    10.                     CanSendMsg(&CAN1_Tx);   //发送一帧数据
    11.                 }
    复制代码

    从串口打印数据可以看到CAN2收到两次CAN1发送的数据,第二次收到CANID+1:
    1.png

    CAN1-CAN2总线标准帧扩展帧同时使用收发测试.zip

    21.66 KB, 下载次数: 51

    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-3 15:48 , Processed in 0.088767 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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