找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

[BSP] 有没有远程帧应答范例? CAN_REMOTE_FRAME

[复制链接]
跳转到指定楼层
楼主
keyway 发表于 2024-6-27 23:13:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 keyway 于 2024-7-1 00:26 编辑

en-us--M0A21_Series_BSP_CMSIS_V3.02.000
范例 CAN_NormalMode_Tx
传送后NewDat永远不会清除,为什么?

ReleaseIF(tCAN, (uint32_t)u8MsgIfNum); 没使用中断,为什么要 Disable CAN interrupt. ~Enable CAN interrupt.??
        /* Disable CAN interrupt */
        u32IntMask = tCAN->CON & (CAN_CON_IE_Msk | CAN_CON_SIE_Msk | CAN_CON_EIE_Msk);
        tCAN->CON = tCAN->CON & ~(CAN_CON_IE_Msk | CAN_CON_SIE_Msk | CAN_CON_EIE_Msk);
        gu8LockCanIf[u32CanNo][u32IfNo] = 0u;
        /*
Enable CAN interrupt */
        tCAN->CON |= u32IntMask;

       况且CAN_CON_IE_Msk | CAN_CON_SIE_Msk | CAN_CON_EIE_Msk永远为"0"



第一次传送永远传不出去,必须先运行 CAN_TriggerTxMsg()

/* Send a 11-bit Standard Identifier message */
    tMsg.FrameType = CAN_DATA_FRAME;
    tMsg.IdType   = CAN_STD_ID;
    tMsg.Id       = 0x7FF;
    tMsg.DLC      = 2;
    tMsg.Data[0]  = 7;
    tMsg.Data[1]  = 0xFF;






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

使用道具 举报

沙发
chrishu 发表于 2024-7-1 15:45:12 | 只看该作者
1、传送后NewDat永远不会清除,为什么?你怎么看到NewDat没有被清除的?需要把对应报文对象的内容读取到IF寄存器里才能看得到。
报文发送成功后NewDat 和Txrqst会被自动清掉的,如果使能了自动重传,当传输出错后NewDat会保留。

2、ReleaseIF(tCAN, (uint32_t)u8MsgIfNum); 没使用中断,为什么要 Disable CAN interrupt. ~Enable CAN interrupt.??
        /* Disable CAN interrupt */
        u32IntMask = tCAN->CON & (CAN_CON_IE_Msk | CAN_CON_SIE_Msk | CAN_CON_EIE_Msk);
        tCAN->CON = tCAN->CON & ~(CAN_CON_IE_Msk | CAN_CON_SIE_Msk | CAN_CON_EIE_Msk);
        gu8LockCanIf[u32CanNo][u32IfNo] = 0u;
        /* Enable CAN interrupt */
        tCAN->CON |= u32IntMask;
      
况且CAN_CON_IE_Msk | CAN_CON_SIE_Msk | CAN_CON_EIE_Msk永远为"0"


ReleaseIF是一个通用的函数,不管使能或没使能中断都可以调用
假如使能了中断,如果这里不先关中断有可能存在主函数和中断同时操作gu8LockCanIf的风险。
CAN_CON_IE_Msk | CAN_CON_SIE_Msk | CAN_CON_EIE_Msk = 0x0E
也就是说
u32IntMask = tCAN->CON & (CAN_CON_IE_Msk | CAN_CON_SIE_Msk | CAN_CON_EIE_Msk);  //保存寄存器里bit1~bit3的值
tCAN->CON = tCAN->CON & ~(CAN_CON_IE_Msk | CAN_CON_SIE_Msk | CAN_CON_EIE_Msk); //清除bit1~bit3的值
gu8LockCanIf[u32CanNo][u32IfNo] = 0u;
/* Enable CAN interrupt */
tCAN->CON |= u32IntMask; //恢复原本bit1~bit3的值


3、第一次传送永远传不出去,必须先运行 CAN_TriggerTxMsg()
不是第一次,每一次传输都要调用CAN_TriggerTxMsg才能发送
因为发送是通过IF设置报文对象的TxRqst为1实现的。


回复 支持 反对

使用道具 举报

板凳
匿名  发表于 2024-7-1 15:49:06
5.20.5.2  CAN
报文传输
  
一旦C_CAN被初始化以及Init bit (CAN_CON[0])位被重置为0,C_CAN内核就会将自身与CAN总线
同步,并开始报文传输。

如果接收到的报文通过了报文处理器的接收过滤,将会被存储在相应的报文对象中。保存在报文对
象中的报文包括所有的仲裁位,DLC(CAN_IFn_MCON[3:0])和8个字节数据(CAN_IFn_DAT_A1/2;
CAN_IFn_DAT_B1/2)。如果使用了标识符掩码,那些被掩码为”无关”位的仲裁位会在报文对象中被覆
盖。
软件可以通过接口寄存器在任何时间去读或写每条报文。如果同时访问,报文处理器将保证数据的
一致性。
发送的报文由应用软件进行更新。如果一个报文永久性的存在某个报文对象中(仲裁位和控制位在
配 置 时 被 设 定 ) , 那 么 仅 有 数 据 字 节 会 被 更 新 , 在 置 位 TxRqst 位 (CAN_IFn_MCON[8]) 和
NewDat(CAN_IFn_MCON[15])位会后就会开始传送。
如果几条传输报文被指派给同一个报文对象
(当报文对象的数量不够用时),那么在发送这些报文前必须对整个报文对象进行配置。

中英文版实在看不出来nuvoton Datasheet讲什么,所有规格资料都不是"人"写的,难怪国内外都没有应用范例...
回复 支持 反对

使用道具

地板
 楼主| keyway 发表于 2024-7-1 21:07:59 | 只看该作者
chrishu 发表于 2024-7-1 15:45
1、传送后NewDat永远不会清除,为什么?你怎么看到NewDat没有被清除的?需要把对应报文对象的内容读取到IF寄 ...

en-us--M0A21_Series_BSP_CMSIS_V3.02.000
范例 CAN_NormalMode_Tx
报文发送成功后NewDat 和Txrqst会被自动清掉的,如果使能了自动重传,当传输出错后NewDat会保留。
1.Ans:范例传送后并没有清除,你可以下载官方范例测试.

ReleaseIF是一个通用的函数,不管使能或没使能中断都可以调用
假如使能了中断,如果这里不先关中断有可能存在主函数和中断同时操作gu8LockCanIf的风险。
2.Ans:范例并没有使用中断,但是如果你将ReleaseIF()删除,程式就无法传送?

3.官方是否能提供REMOTE_FRAME应达传送范例?


回复 支持 反对

使用道具 举报

5#
chrishu 发表于 2024-7-2 10:00:26 | 只看该作者
本帖最后由 chrishu 于 2024-7-2 10:01 编辑
keyway 发表于 2024-7-1 21:07
en-us--M0A21_Series_BSP_CMSIS_V3.02.000
范例 CAN_NormalMode_Tx
报文发送成功后NewDat 和Txrqst会被自 ...


1.Ans:范例传送后并没有清除,你可以下载官方范例测试.
前面问你的问题可能没看到。
你怎么看到NewDat没有被清除的?实际需要IF给报文对象发送读命令,将报文对象的内容读取到IF寄存器里才能看得到。不是直接能看到的
例程都有测试过,报文发送成功后NewDat 和Txrqst会被自动清掉

ReleaseIF是一个通用的函数,不管使能或没使能中断都可以调用
假如使能了中断,如果这里不先关中断有可能存在主函数和中断同时操作gu8LockCanIf的风险。
2.Ans:范例并没有使用中断,但是如果你将ReleaseIF()删除,程式就无法传送?
这个函数里重点不是中断,而是IF寄存器的解锁
gu8LockCanIf[u32CanNo][u32IfNo] = 0u; //IFn寄存器解锁
这里每个CAN外设都有2个IF用于访问报文对象。
参考例程用数组gu8LockCanIf做IF的上锁标志,以确定每次使用哪个IF访问报文对象,以及是否有空闲的IF可以使用。
如果ReleaseIF函数不执行,相当于只能用两次IF,之后就无法再对报文对象操作,


3.官方是否能提供REMOTE_FRAME应达传送范例?
发送远程帧:设置报文对象的dir =0 ,TxRqst = 1,再将报文类型改成远程帧

接收远程帧并回复数据: 设置报文对象的dir = 1,RmtEn=1,收到远程帧后会自动将TxRqst改成1
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU