搜索
bottom↓
回复: 47

基于STM32F103C8t的CAN通讯实例(带程序注释)

  [复制链接]

出0入0汤圆

发表于 2013-11-27 14:36:50 | 显示全部楼层 |阅读模式
这个实例的板子和程序均为个人兴趣所做,测试已经通过,但是难免有所问题,如有错误和能够完善的地方,希望和大家相互学习。
整体构思:这套小板是为了通过I/O口低电压系统(3.3V)隔离驱动高电压系统(24V),实现MCU对24V电压输出的有无控制,低电压系统对高电压系统的隔离驱动控制是通过光耦来实现的,MCU的I/O输出0V时,光耦导通,对应接口输出24V。
(实际测试时已经通过硬件结构使每个I/O口对应一个小灯,MCU的I/O输出0V时,对应接口输出24V,小灯点亮;MCU的I/O输出3.3V时,对应接口输出0V,小灯熄灭)。

硬件结构
板子分为主板和插板两种,主板主要负责通过stm32f103c8t进行I/O口高低电平的控制,插板主要负责把主板输出的I/O口电平通过光隔离来控制24V的输出。每一个插板可以最多驱动8路24V电压,每个底板最多插3个插板,所以一套完整的小板可以控制24个I/O口。
    板子焊了1套完整版和1个单独的主板。单独的主板负责通过can总线进行发送命令,完整版的负责通过can总线进行接收并且处理,实现小灯的点亮和熄灭。
完成品展示

全套的:

软件部分
软件部分的编写主要是参考网络上的刘洋老师讲解的STM32开发板的视频中的讲解,但是为了节省成本,所以采用了stm32f103c8t(有1路CAN),芯片共48个引脚,选取了其中的24个作为普通I/O,下载方式采用SW下载方式,这种下载接口较少,只需TCK,TMS,GND三根线即可,大家可以百度“JLink三线下载器的制作”,有很多这方面的资料。我为了解决下载时的供电问题,在下载接口中多增加了一根VCC供电线。
由于ST公司提供了库函数,所以对于程序的编写相对来说就轻松了不少。但还是有一点点细节的部分,需要注意一下。
1.        关于PB3,PB4作为普通I/O口的问题。在最初画PCB时,没有太仔细看手册,结果把PB3,PB4也当做普通I/O口来用了,在程序中把所有引脚都置高时,却发现PB4引脚还是低电平。后来回去查手册,发现PB4的主功能是NJTRST,PB3的主功能是JTDO。所以必须使用它们的端口重定义功能,但是在void GPIO_PinRemapConfig(u32 GPIO_Remap, FunctionalState NewState)函数查表时,并没有重映射PB3,和PB4这个功能。后来经过仔细观察,在函数表中发现了

尝试着在函数中写入GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);再重新下载,发现所有I/O口均被成功拉高了。
2.(1) 关于CAN通信中的ID号问题。在刘洋老师的视频中,ID号先右移5位,比如想发送0xFF,他的函数中写的是TxMessage.StdId=0x00FF>>5;但是我实际上使用的并不用右移。
  (2)关于接收ID的屏蔽滤波问题。我的程序中CAN通信均发送标准数据帧,屏蔽滤波使用了32位滤波器,可接收范围为0x0000~0x000F,原理如下:

3. 关于接收数据的处理。因为在can中断中收到的数据是存在8个数组中的RxMessage.Data所以如何把他们提取出来,我采用的方法是定义了一个int aa[8],然后依次用移位与1与的方法,把数组中的数据1位位提取出来。如a[0]= RxMessage.Data[0]&1;a[1]= (RxMessage.Data[0]>>1)&1;依次类推,即可把一个字节中的数据内容都提取出来,依此方法循环,再把其余7个字节中的数据进行提取,进行下一步的处理。
4.在发送小板发送数据时,把CAN的数据进行传递进去的时候定义了一个指针,把数组的首地址传入进去,这样觉得比较方便。
附件中带了主板的原理图和发送小板的程序以及接收小板的程序,加带了注释,可供新手进行学习参考(—_-||)接收小板的程序上传不了了,说我今日无法上传那么大的附件,以后传上来吧





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

 楼主| 发表于 2013-11-27 14:38:07 | 显示全部楼层
两个程序都上传不了了。。。明天再把程序传上来啦啦

出0入0汤圆

发表于 2013-11-27 14:46:10 | 显示全部楼层
支持!!!                                                                                                                                                        

出100入101汤圆

发表于 2013-11-27 15:26:45 | 显示全部楼层
支持一下!

出0入0汤圆

发表于 2013-11-27 15:52:59 | 显示全部楼层
支持,等附件

出0入0汤圆

发表于 2013-11-27 16:14:28 | 显示全部楼层
顶下楼主                                                                                                      

出0入0汤圆

发表于 2013-11-27 17:38:00 | 显示全部楼层
支持一下!!!

出0入0汤圆

发表于 2013-11-27 18:58:45 | 显示全部楼层
不错,支持一下。

出0入0汤圆

发表于 2013-11-27 20:57:26 | 显示全部楼层
等待程序。

出0入0汤圆

发表于 2013-11-27 21:14:33 | 显示全部楼层
等待程序。

出0入0汤圆

发表于 2013-11-27 21:22:59 | 显示全部楼层
附件呢,只有一个pdf啊,楼主

出0入0汤圆

 楼主| 发表于 2013-11-28 09:59:32 | 显示全部楼层
发送小板的程序和接收小板的程序已经上传咯

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-12-1 20:04:36 | 显示全部楼层
学习了

出0入0汤圆

发表于 2013-12-1 20:32:41 | 显示全部楼层
谢过楼主。

出0入50汤圆

发表于 2013-12-1 20:42:20 | 显示全部楼层
路过帮顶!楼主蛮厚道的

出0入0汤圆

发表于 2013-12-2 10:49:08 | 显示全部楼层

出0入0汤圆

发表于 2013-12-2 22:25:28 | 显示全部楼层

出0入0汤圆

发表于 2013-12-25 17:26:02 | 显示全部楼层
支持一下

出0入0汤圆

发表于 2014-1-1 22:47:53 | 显示全部楼层
验证了一下发送程序,失败,没有发送出去!确定程序已经烧写进去!
同样的程序,烧写在STM32F103VET(100引脚)就可以正常发送,烧写在STM32F103C8T6(48引脚),就发送不出去

出0入0汤圆

发表于 2014-1-2 09:53:11 | 显示全部楼层
刚好要用到CAN,学习学习

出0入0汤圆

发表于 2014-1-4 06:45:36 | 显示全部楼层
如果can发送正常的话,示波器在其引脚测量,应该能查看的波形,但现在只是高电平,而且在执行但不运行时,也一点反映的都没有!试问,楼主有没有遇到这样的情况!

如果将芯片改成STM32F103VET,其就可以正常发送!已经三番检查,就是没查出原因!

出0入0汤圆

发表于 2014-1-14 18:00:26 | 显示全部楼层
我的程序是一个主机 四个 从机  如果他们全是c8t6的时候就能够通信,但是如果是VET6和C8T6之间通信的时候就会出错  什么情况呢? 急急急!

出0入0汤圆

发表于 2014-1-15 12:30:05 | 显示全部楼层
mark, thanks

出0入0汤圆

发表于 2014-4-11 13:28:27 | 显示全部楼层

mark, thanks

出0入0汤圆

发表于 2014-4-27 15:35:09 | 显示全部楼层
学习了            

出0入0汤圆

发表于 2014-4-29 10:01:48 | 显示全部楼层
ID的后三位是不参与滤波的!!!!!!

出0入0汤圆

发表于 2014-4-29 16:42:01 | 显示全部楼层
正在学习CAN。

出0入30汤圆

发表于 2014-5-16 09:33:58 | 显示全部楼层
学习CAN。

出0入0汤圆

发表于 2014-6-18 09:09:09 | 显示全部楼层
路过支持一下

出0入0汤圆

发表于 2014-6-21 16:01:36 | 显示全部楼层
谢谢,分享

出0入0汤圆

发表于 2014-6-22 10:31:04 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2014-11-18 11:50:37 | 显示全部楼层
谢谢楼主!

出0入0汤圆

发表于 2014-11-19 09:44:21 | 显示全部楼层
附件沒有原理圖呢?

出0入0汤圆

 楼主| 发表于 2014-11-21 13:38:38 | 显示全部楼层
largolun 发表于 2014-11-19 09:44
附件沒有原理圖呢?

有的,在下面的楼里

出0入0汤圆

发表于 2014-12-5 12:47:20 | 显示全部楼层
收藏,谢谢LZ

出0入0汤圆

发表于 2015-7-27 17:55:30 | 显示全部楼层
mark ,程序很有用,赞一个

出0入0汤圆

发表于 2015-7-27 20:30:03 | 显示全部楼层
支持 !!!

出0入0汤圆

 楼主| 发表于 2016-8-31 09:34:38 | 显示全部楼层
kuwu007 发表于 2014-1-4 06:45
如果can发送正常的话,示波器在其引脚测量,应该能查看的波形,但现在只是高电平,而且在执行但不运行时, ...

竟然已经过去这么久才看到。。。为了以后的人遇到同样的问题可能会看到这篇帖子,我也决定回答一下。
我前一阵打算写PWM驱动电机的时候,发现之前学长的程序把IO口配置成了Tim8,但是我发现我的手册里这个IO口并没有Tim8这个复用功能呀。。。(一脸懵逼中。。。)
可是事实又证明学长的程序的确是可以用的,我仔细想了很久,然后感谢各种搜索引擎。。。我发现了问题所在:我查看的datasheet和我使用的芯片flash容量不一样!!!
注意:同样是stm32f103Vxxx,但是大容量(>=256k)和其他容量的引脚复用功能是不一样的。
所以我想会不会你查看了大容量的datasheet发现这个引脚有这个复用功能,但实际上你使用的是中等容量或小容量芯片,所以这个引脚并没有这个功能。。。
希望能帮助更多人,加油

出0入0汤圆

发表于 2016-9-14 09:35:41 | 显示全部楼层
谢谢楼主的分享

出0入0汤圆

发表于 2016-9-14 09:53:36 | 显示全部楼层
谢谢楼主的分享,先学习一下

出0入0汤圆

发表于 2016-9-14 10:37:31 | 显示全部楼层
程序简洁易懂,谢谢

出0入0汤圆

发表于 2017-10-16 16:01:32 | 显示全部楼层
学习

出0入0汤圆

发表于 2018-1-13 13:50:11 | 显示全部楼层
感谢分亨!正好在用CAN通信,参考下

出0入0汤圆

发表于 2019-10-11 16:56:41 | 显示全部楼层

谢谢,感谢分享

出0入0汤圆

发表于 2019-10-11 17:53:14 来自手机 | 显示全部楼层
感谢分享!mark,can通讯

出0入0汤圆

发表于 2019-10-13 10:04:36 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2019-10-13 14:06:50 来自手机 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2019-11-1 09:43:24 来自手机 | 显示全部楼层
多谢楼主的分享!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 21:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表