找回密码
 立即注册
查看: 221|回复: 11

关于STC32G的CAN汇编语言的例程的疑问

[复制链接]

该用户从未签到

19

主题

103

回帖

189

积分

注册会员

积分
189
发表于 2024-3-5 08:55:46 | 显示全部楼层 |阅读模式
本帖最后由 newlined 于 2024-3-5 09:38 编辑

大家好,我用两个STC32G单片机的CAN口通信,这两个单片机都是用的STC官方提供的C语言的例程,是标准帧格式,可以传输数据,但我将一个单片机的程序换成了STC官方提供的汇编语言例程时,发现不能通信,CAN口的地址,速率也都设置了。我在汇编语言的程序中跟踪了一下,发现CAN口收到数据可以触发中断,检测CAN寄存器中ISR的RI位为零,表示CAN 模块接收 BUFFER 中不存在数据帧,就是这几句:


    MOV     WR6, #WORD0 CANAR   ;CANAR现场保存,避免主循环里写完 CANAR 后产生中断,在中断里修改了 CANAR 内容
    MOV     WR4, #WORD2 CANAR
    MOV     R10,@DR4            ;存入 B 寄存器

    MOV     A, #ISR
;    MOV     WR6, #WORD0 CANAR
;    MOV     WR4, #WORD2 CANAR
    MOV     @DR4, R11

    MOV     WR6, #WORD0 CANDR
    MOV     WR4, #WORD2 CANDR
    MOV     R11,@DR4
    MOV     @DR4, R11  ;清标志位,写 1 清除




ISRTEST3:    JB      ACC.3,CAN_RIIF



CAN_RIIF:
;    ORL     A,#08H  ;清标志位,写 1 清除
;    MOV     @DR4, R11
    SETB    B_CanRead
    JMP     ISRTEST4




B_CanRead 不能被置位为1 ,所以收不到数据,请问问题可能出在哪里?谢谢。











回复 送花

使用道具 举报

该用户从未签到

550

主题

9311

回帖

1万

积分

管理员

积分
13872
发表于 2024-3-5 09:45:09 | 显示全部楼层
回复 支持 反对 送花

使用道具 举报

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

    [LV.7]常住居民III

    26

    主题

    1298

    回帖

    4049

    积分

    论坛元老

    积分
    4049
    发表于 2024-3-5 09:58:27 | 显示全部楼层
    产生中断不一定是收到数据,也可能是检测到故障。
    例程默认设置CAN波特率500KHz,你可先直接用例程测试一下通信。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    19

    主题

    103

    回帖

    189

    积分

    注册会员

    积分
    189
     楼主| 发表于 2024-3-5 10:09:17 | 显示全部楼层
    神农鼎 发表于 2024-3-5 09:45
    【新提醒】CAN总线标准帧扩展帧收发例子-C语言与汇编 - CAN/Lin/CANOpen - 国芯论坛-STC全球32位8051爱好 ...

    谢谢您的回复。
    我就是用的49中的汇编例程,这个例程中,我修改了主频的速率,我用的是12M,
    CAN口的速率是50K,相应设置如下:
    TSG1   EQU    5                ;0~15
    TSG2   EQU    4                ;1~7 (TSG2 不能设置为0)
    BRP    EQU    9                ;0~63

    SJW    EQU    01H        ;重新同步跳跃宽度: 00H/040H/080H/0C0H
    ;总线波特率100KHz以上设置为 0; 100KHz以下设置为 1

    担心烧坏IO口,所以IO口我都设为准双向,C语言程序中也是这样设定的。
    CAN口我用的是CAN1的P5.0,P5.1 相应程序如下:

        ORL     AUXR2, #02H       ;CAN1模块使能
        ANL     AUXR2, #NOT 08H   ;选择CAN1模块
       
       ANL                P_SW1,         #0CFH;
       ORL                P_SW1,         #010H;   

    其他的没有改动,再就是我发现程序中调用子程序用的是 命令是CALL ,编译没有问题,不过汇编中调用子程序不是用ACALL或者LCALL吗?CALL 与ACALL或LCALL有什么不同吗?



    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    19

    主题

    103

    回帖

    189

    积分

    注册会员

    积分
    189
     楼主| 发表于 2024-3-5 10:10:16 | 显示全部楼层
    本帖最后由 newlined 于 2024-3-5 10:12 编辑
    乘风飞扬 发表于 2024-3-5 09:58
    产生中断不一定是收到数据,也可能是检测到故障。
    例程默认设置CAN波特率500KHz,你可先直接用例程测试一下 ...

    好的,谢谢,我试下。
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    26

    主题

    1298

    回帖

    4049

    积分

    论坛元老

    积分
    4049
    发表于 2024-3-5 10:19:50 | 显示全部楼层
    newlined 发表于 2024-3-5 10:09
    谢谢您的回复。
    我就是用的49中的汇编例程,这个例程中,我修改了主频的速率,我用的是12M,
    CAN口的速率 ...

    LCALL , ACALL , CALL的区别是什么 ? 新人 问
    https://www.stcaimcu.com/forum.php?mod=viewthread&tid=894
    (出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    19

    主题

    103

    回帖

    189

    积分

    注册会员

    积分
    189
     楼主| 发表于 2024-3-5 10:56:19 | 显示全部楼层
    乘风飞扬 发表于 2024-3-5 09:58
    产生中断不一定是收到数据,也可能是检测到故障。
    例程默认设置CAN波特率500KHz,你可先直接用例程测试一下 ...

    乘风老师,发送站用C的例程原程序,接收站用汇编的原程序,速度是500K,可以收到数据,没有问题。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    19

    主题

    103

    回帖

    189

    积分

    注册会员

    积分
    189
     楼主| 发表于 2024-3-5 11:17:27 | 显示全部楼层
    乘风飞扬 发表于 2024-3-5 09:58
    产生中断不一定是收到数据,也可能是检测到故障。
    例程默认设置CAN波特率500KHz,你可先直接用例程测试一下 ...

    用500K的速度没有问题,我又改成了50K,就不行了,只修改了速度设置部分,别的没有修改。
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    26

    主题

    1298

    回帖

    4049

    积分

    论坛元老

    积分
    4049
    发表于 2024-3-5 11:38:18 | 显示全部楼层
    newlined 发表于 2024-3-5 10:09
    谢谢您的回复。
    我就是用的49中的汇编例程,这个例程中,我修改了主频的速率,我用的是12M,
    CAN口的速率 ...

    SJW    EQU    01H        ;重新同步跳跃宽度: 00H/040H/080H/0C0H
    这个参数设置有问题,这么定义会对BRP产生影响,要按照后面注释参数定义。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    19

    主题

    103

    回帖

    189

    积分

    注册会员

    积分
    189
     楼主| 发表于 2024-3-5 11:56:29 | 显示全部楼层
    乘风飞扬 发表于 2024-3-5 11:38
    SJW    EQU    01H        ;重新同步跳跃宽度: 00H/040H/080H/0C0H
    这个参数设置有问题,这么定义会对BR ...

    这个SJW的参数,如果速率是50K的话,应该设成多少?
    注释后边是00H/040H/080H/0C0H,下边还有一句是;总线波特率100KHz以上设置为 0; 100KHz以下设置为 1,这两个注释怎样理解?
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-4 20:13 , Processed in 0.068975 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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