您好,经上次您的指导,我这边可以把CAN转换为canfd了,用CAN收发器显示开发板已经可以发送CANFD格式的数据,但问题是我调试了很长时间也仅仅是能收发<=8字节的数据,虽然我把rt_can_msg结构体中的len设为16,data[16]。我发现函数can_sendmsg中有几行如下,
if(pmsg->len > 8) { tmp_u32DataLen = 8; } else { tmp_u32DataLen = pmsg->len; } tmp_u32DataLen <<=16;
if(pmsg->len > 8)
{
tmp_u32DataLen = 8;
}
else
tmp_u32DataLen = pmsg->len;
tmp_u32DataLen <<=16;
怎么好像是只能发送<=8字节,请您帮帮忙,能不能再指导我一下?
查看更多
好像art-pi+扩展板的fdcan只能用作经典can,不太确定。关注下你的问题,一起探讨。
看了帖子,我也颇受启发,谢谢楼主的提问以及老师的解答
有启发
欢迎发表与嵌入式相关的技术分享、开发技巧、工具介绍、技术设想、职业心得、行业评论等对他人有启发,排版优雅的文章
回到 顶部
发布 问题
分享 好友
手机 浏览
投诉 建议
回到 底部
@lchnu 老师,您好,又见到您了,很高兴。硬件上我已经把扩展板上的can芯片换成了canfd芯片了。
@888Tim 您好啊,看来你进展很不错,💪💪💪
经典CAN的一帧数据最长8字节,所以设置成了8。
你去查一下drv_fdcan.c中的FrameFormat是不是被设置成了
FDCAN_FRAME_CLASSIC
模式?若是的话,可以试试按照你的实际需求和硬件情况,修改成
FDCAN_FRAME_FD_NO_BRS
或者FDCAN_FRAME_FD_BRS
, 然后再配合你对于_inline_can_sendmsg函数中tmp_u32DataLen的修改,逐步调试看看是否会生效?@lchnu 老师,您好,说实话,项目能进行到现在这一步完全是靠您之前的指导,感谢您!我发现没您的指导的话,我这边还真进行不下去。
自从上次您说要把FDFormat改为FDCAN_FD_CAN后,我就把drv_fdcan.c中的FrameFormat设置成了FDCAN_FRAME_FD_NO_BRS,另外调整了一下pdrv_can->fdcanHandle.Init的参数,把波特率设为500K,修改了rt_can_msg中的rt_uint32_t len:32,data[64],不过len想改为64,但编译时总提示width超过了len的类型定义,没明白,别的没动。现在fdcan能接受64字节数据,但发送只能发8字节。
@888Tim
您好!别说指导,就是一起探讨和沟通。
rt_can_msg的结构体是用位域做的,你把结构体中所有位的长度加到一起,会得到64这个数据,表示,结构体中,data[8]之前的数据合计占用了64个bit。
没有必要修改此处的len,8个bit能表示的范围有0~255。
你仔细读一下代码,会发现,在
_inline_can_sendmsg
函数中,对pmsg->len做了限制,我相信你已经修改了。但是,你要看到,代码中对
tmp_u32DataLen
又做了移位处理,然后写入到了pdrv_can->TxHeader.DataLength
。这里要跟一下,也通过波形看看到底发出了什么。你需要debug调试一下,比如,你发出64字节,在此处是否长度OK。然后,对照FDCAN协议标准,查一下
_stm32_fdcan_t
和FDCAN_TxHeaderTypeDef
数据结构,看看到底发出了多长的数据。目前,在_stm32_fdcan_t
中,u8TxDataBuufer, u8RxDataBuufer
都只有8个字节。这里应该可以尝试做些修改和处理。另外,
_inline_can_tx_header_init
函数中,对pCan->TxHeader.DataLength
的长度也做了限制,设置为了FDCAN_DLC_BYTES_8
,_inline_can_config
函数中,也有TxElmtSize, RxElmtSize
的限制。你都可以魔改一下。
建议就是,多debug,跟踪数据,不能简单改改代码靠猜。
@lchnu 老师,您好,问题找到了,就是tmp_u32DataLen被限制了8字节,这个变量我之前还debug过,也直接给它赋过值测试过,还是我没有好好静下心来。
谢谢老师,我用rtthread真离不开您的帮助,非常感谢!
@888Tim Eureka!项目进展顺利,赞👍