你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

两个STM32F103实现双CAN转传,串口+DMA+CAN

[复制链接]
STmcu.com.cn 发布时间:2020-8-12 19:05
    因项目需求,需要用两个103实现2路CAN并且数据数据由CAN1输入,CA2输出,,两个芯片通过串口连接。1 c4 ^% }# i, a. z
调试两个103通过串口DMA通信转实现CAN节点转传数据调试笔记
$ ~! F: e" |3 z8 T" Q* U3 i        利用cubemx生成了串口DMA的代码,看串口1波特率最高支持4.5Mbps我就设置了4Mbps的波特率。/ |3 v' p) K" E
        在生成工程后我简单的修改了一下main函数,增加了dma发送测试发送只能发送一次,查资料后发现DMA有正常模式与循环模式,把模式设置为循环模式后能调用一次发送后可以一直发送,但是项目貌似用不上一直循环发送,所以后面又改回了正常发送模式。修改地方在stm32f1xx_hal_msp.c文件的HAL_UART_MspInit函数里hdma_usart1_tx.Init.Mode = DMA_NORMAL;2 r$ i! y% }3 ^  P% K% u* n
当修改完正常模式后又有奇怪的问题,多次调用只发送一次,后来经过调试,发现发送完一次后串口的状态一直为busy,所以每次调用发送都会被返回busy,在终端处理函数里面添加 huart1.State = HAL_UART_STATE_READY; 解决了
, i( P( \/ L5 S; m) u4 d        接收一直循环接收,们什么问题,只是两个芯片如果没同步的话就会出现接收开头不是第一位的情况,需要在程序里加上上电同步的机制,在通信过程中如果接受回来的一帧数据出现错误就需要重新同步。
0 p* x4 O4 m  s: K8 f- j# ]        在void DMA1_Channel5_IRQHandler(void) 函数中加上CAN发送后 发现每次另一个芯片发来串口数据后会造成连续发送2帧CAN数据,经过调试后发现,HAL库打不仅打开了传输完成中断TCIE,还打开了半传输中断HTIE,也打开了传输错误中断TEIE,连续发送2帧CAN报文是连续进入接收中断服务函数2次造成,第2次是因为触发了版传输中断导致。所以发送CAN报文不能在DMA1_Channel5_IRQHandler(void)中写,需要在特定的接收中断回调函数中写。继续查看中断处理函数里,找到传输完成回调函数: hdma->XferCpltCallback(hdma); 看看hdam原型中定义了void   (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma);     /*!< DMA transfer complete callback         */
  g& K6 k- i% {, q% t/ N2 ]懵逼了,不知道这个回调函数怎么写。后来网上查资料仍没有解决。某个帖子给了我灵感。这个在初始化的时候应该有指定实体函数。在stm32f1xx_hal_uart.c文件中 HAL_UART_Receive_DMA函数里的1039行 有huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt; 指定了。在查看函数原型里原来就是串口接收中断回调函数。原型__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)   `$ f" T' C2 n, u7 P% E) a
在应用层里重新编写HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)实体后,接收一次发送2帧的问题得以解决。
2 k7 l0 v. y) U7 k  H        CAN发送:以前的底层CAN发送时通过堵塞方式发送,如果发送量比较大的话会造成很大的延时问题,系统性能下降。修改为中断发送。后得以解决。$ r/ g! h/ b2 l3 i" D
        现在满载测试芯片1接收CAN转到串口,芯片2 串口接收到通过CAN发出,500K 暂时没发现丢帧的现象。
+ F; k) Y1 a4 n. ~$ ]  X( R) N
* l6 h# C7 T. N" M1 X, E& F
收藏 1 评论4 发布时间:2020-8-12 19:05

举报

4个回答
奏奏奏 回答时间:2020-8-13 03:41:10
CAN中继的实验代码分享) v1 @/ `$ d( H  j4 x! v; `: r4 I7 q8 i
https://www.stmcu.org.cn/module/forum/thread-610128-1-1.html
  Q6 `1 W! |% k: ?7 h0 i: P* O% M(出处: 论坛-意法半导体STM32/STM8技术社区)6 S, O" V" w  T% d
一个芯片有2路CAN来实现不是会更好吗?
5 q( G: U1 K# l) F而且串口可以打印转发的CAN数据
jeffhe1 回答时间:2020-8-13 09:17:59
假如要無痛移植 , 為何不用同是M3 , STM32F205 就有2路 can , 也不用中間再透過串口 5 \! @0 y# p# c* ~6 [4 S
我有試過,是可行的
STmcu.com.cn 回答时间:2020-8-13 10:24:03
别问为什么不用105,项目需求
STmcu.com.cn 回答时间:2020-8-13 10:25:17
奏奏奏 发表于 2020-8-13 03:41
/ T9 I; W$ q/ A) ?& T3 [CAN中继的实验代码分享" f) m$ a) q7 O8 h0 B; Q
https://www.stmcu.org.cn/module/forum/thread-610128-1-1.html+ G; k( Y% \& {* T' ?3 q
(出处: 论坛-意法半 ...
" F* ]# V% d1 v) P  {
谢谢分享

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版