newlined 发表于 2024-3-5 08:55:46

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

本帖最后由 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 ,所以收不到数据,请问问题可能出在哪里?谢谢。











神农鼎 发表于 2024-3-5 09:45:09



【新提醒】CAN总线标准帧扩展帧收发例子-C语言与汇编 - CAN/Lin/CANOpen - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

乘风飞扬 发表于 2024-3-5 09:58:27

产生中断不一定是收到数据,也可能是检测到故障。
例程默认设置CAN波特率500KHz,你可先直接用例程测试一下通信。

newlined 发表于 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有什么不同吗?



newlined 发表于 2024-3-5 10:10:16

本帖最后由 newlined 于 2024-3-5 10:12 编辑

乘风飞扬 发表于 2024-3-5 09:58
产生中断不一定是收到数据,也可能是检测到故障。
例程默认设置CAN波特率500KHz,你可先直接用例程测试一下 ...
好的,谢谢,我试下。

乘风飞扬 发表于 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爱好者互助交流社区)

newlined 发表于 2024-3-5 10:56:19

乘风飞扬 发表于 2024-3-5 09:58
产生中断不一定是收到数据,也可能是检测到故障。
例程默认设置CAN波特率500KHz,你可先直接用例程测试一下 ...

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

newlined 发表于 2024-3-5 11:17:27

乘风飞扬 发表于 2024-3-5 09:58
产生中断不一定是收到数据,也可能是检测到故障。
例程默认设置CAN波特率500KHz,你可先直接用例程测试一下 ...

用500K的速度没有问题,我又改成了50K,就不行了,只修改了速度设置部分,别的没有修改。

乘风飞扬 发表于 2024-3-5 11:38:18

newlined 发表于 2024-3-5 10:09
谢谢您的回复。
我就是用的49中的汇编例程,这个例程中,我修改了主频的速率,我用的是12M,
CAN口的速率 ...

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

newlined 发表于 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,这两个注释怎样理解?
页: [1] 2
查看完整版本: 关于STC32G的CAN汇编语言的例程的疑问