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

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

[复制链接]
STmcu.com.cn 发布时间:2020-8-12 19:05
    因项目需求,需要用两个103实现2路CAN并且数据数据由CAN1输入,CA2输出,,两个芯片通过串口连接。
调试两个103通过串口DMA通信转实现CAN节点转传数据调试笔记
        利用cubemx生成了串口DMA的代码,看串口1波特率最高支持4.5Mbps我就设置了4Mbps的波特率。
        在生成工程后我简单的修改了一下main函数,增加了dma发送测试发送只能发送一次,查资料后发现DMA有正常模式与循环模式,把模式设置为循环模式后能调用一次发送后可以一直发送,但是项目貌似用不上一直循环发送,所以后面又改回了正常发送模式。修改地方在stm32f1xx_hal_msp.c文件的HAL_UART_MspInit函数里hdma_usart1_tx.Init.Mode = DMA_NORMAL;
当修改完正常模式后又有奇怪的问题,多次调用只发送一次,后来经过调试,发现发送完一次后串口的状态一直为busy,所以每次调用发送都会被返回busy,在终端处理函数里面添加 huart1.State = HAL_UART_STATE_READY; 解决了
        接收一直循环接收,们什么问题,只是两个芯片如果没同步的话就会出现接收开头不是第一位的情况,需要在程序里加上上电同步的机制,在通信过程中如果接受回来的一帧数据出现错误就需要重新同步。
        在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         */
懵逼了,不知道这个回调函数怎么写。后来网上查资料仍没有解决。某个帖子给了我灵感。这个在初始化的时候应该有指定实体函数。在stm32f1xx_hal_uart.c文件中 HAL_UART_Receive_DMA函数里的1039行 有huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt; 指定了。在查看函数原型里原来就是串口接收中断回调函数。原型__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
在应用层里重新编写HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)实体后,接收一次发送2帧的问题得以解决。
        CAN发送:以前的底层CAN发送时通过堵塞方式发送,如果发送量比较大的话会造成很大的延时问题,系统性能下降。修改为中断发送。后得以解决。
        现在满载测试芯片1接收CAN转到串口,芯片2 串口接收到通过CAN发出,500K 暂时没发现丢帧的现象。

收藏 1 评论4 发布时间:2020-8-12 19:05

举报

4个回答
奏奏奏 回答时间:2020-8-13 03:41:10
CAN中继的实验代码分享
https://www.stmcu.org.cn/module/forum/thread-610128-1-1.html
(出处: 论坛-意法半导体STM32/STM8技术社区)
一个芯片有2路CAN来实现不是会更好吗?
而且串口可以打印转发的CAN数据
jeffhe1 回答时间:2020-8-13 09:17:59
假如要無痛移植 , 為何不用同是M3 , STM32F205 就有2路 can , 也不用中間再透過串口
我有試過,是可行的
STmcu.com.cn 回答时间:2020-8-13 10:24:03
别问为什么不用105,项目需求
STmcu.com.cn 回答时间:2020-8-13 10:25:17
奏奏奏 发表于 2020-8-13 03:41
CAN中继的实验代码分享
https://www.stmcu.org.cn/module/forum/thread-610128-1-1.html
(出处: 论坛-意法半 ...

谢谢分享

所属标签

相似分享

官网相关资源

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