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

【经验分享】CAN通信(STM32)

[复制链接]
STMCU小助手 发布时间:2022-1-22 09:49
1.CAN是控制器局域网络(Controller Area Network, CAN)的简称
(理论知识不做讲解了,太多了)
2.芯片选用:TJA1050
211504250939193.png ) b& m9 B3 o/ g9 K  w
差分信号输入,
这里的显性电平CANH和CANL压差是2V左右,逻辑上表示“0”
两线之间没有压差CANH和CANL都是2.5V左右,表示逻辑“1”
(二)实现代码
1.
1
2 N! b9 _3 F. ?/ i8 \9 u% k/ t2
! |2 i9 _9 O. ]5 z" t2 }- t
/* 配置CAN模块*/
0 t% P' E3 Y) k+ J7 ICAN_Config();
! y' f1 x( Q; \( h( r$ ?) |' P: D% o) V8 h) ]
% Q, J3 X* @) ]+ }" K" f, K7 o
  1. void CAN_Config(void)0 T! i4 t& B2 j% H8 t
  2. {6 K# \9 r0 k7 ]5 _
  3. ①CAN_GPIO_Config();   //此处用PB8/PB9, \% l/ J. D8 e8 Y: a. E5 a
  4. CAN_NVIC_Config();
    # f$ E2 t) O+ \2 A
  5. CAN_Mode_Config();
    9 |* j1 [: a; ?2 e- ]
  6. CAN_Filter_Config();8 `3 z1 Z+ z; _9 y. ]$ \9 d  G
  7. }
复制代码
% |( A9 M& Q: H; y* Y' G9 Y
②对于CAN_NVIC_Config();
看下CAN 的中断分类
211514576568509.jpg

9 M; j/ ^( ~, F+ k$ w1 l* s
  1. static void CAN_NVIC_Config(void). P  k' M. S) A( t" @
  2. {' @3 X5 j5 V! u; r$ O2 b( J
  3.     NVIC_InitTypeDef NVIC_InitStructure;2 t, y& t' b& c" C% b
  4.         /* Configure one bit for preemption priority */& L* Y3 o* l' f: y
  5.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);2 U: B& K! \* Z& T% k& L
  6.         /*中断设置*/- p9 Y! |) b6 i9 E7 w9 s
  7.     NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;     //CAN1 RX0中断; i6 h" x$ B8 I3 Y* k- O+ w' e
  8.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;          //抢占优先级0
    2 t3 d+ p) _3 s
  9.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;             //子优先级0" i' D$ a7 E+ W7 |- Y8 d; f4 ~
  10.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;- i: l6 S6 j' O( g8 a7 \* m3 Q
  11.         NVIC_Init(&NVIC_InitStructure);
    8 J" j9 Q. S. E. n/ K
  12. }
复制代码
5 K: F* n. E5 e% o2 O7 Y0 j0 N+ _
③CAN_Mode_Config();   //CAN不像I2C那样有片选,他背身有许多协议,也要进行选择,所以对应代码的结构体也多(集体可看CAN手册)
④CAN_Filter_Config(); 过滤器程序
看下CAN的主要框图(M3里面的CAN)

4 R3 S2 P$ q. I% q5 i# _! g. }
211551129689005.png
# f7 R' L% I3 G8 G' l" t
M3里面有三个发送邮箱,把要发送的数据打包成报文,然后把它发送到CAN网络总线上;
接收器 先经过滤器,M3里面有14个过滤器,过滤的时候是根据报文的ID来过滤的,ID相同的话,才能过去(相当于一个闸门)
接收到数据后(这里有两个FIFO ,0、1 ),我们的实验用的是 放到FIFO 的Mailbox 0;
代码写法根基三部分:
1.Tx Mailboxes 2.Acceptance Filters 3.Receive FIFO
211601026871210.png   B; C! ]% U, n) b- [/ k' b! v" g, ^
STM32 的 ID 过滤方式有两种,一种为标识符列表模式,它把要接收报文的 ID 列成一个表,要求报文 ID 与列表中的某一个标识符完全相同才可以接收,可以理解为白名单管理。(说白了就是有一个标志位相同,然后就联通了)另一种称为标识符屏蔽模式,它把可接收报文 ID 的某几位作为列表,这几位被称为屏蔽位,可以把它理解成关键字搜索,只要屏蔽位(关键字)相同,就符合要求。即这种模式只要求报文 ID 的屏蔽位与列表中标识符相应屏蔽位相同 ,报文就被保存到接收 FIFO。(标志位的某几位检验,相同的话就通过了)
2.什么叫做报文(就是帧)
在原始数据段的前面加上传输起始标签、片选(识别)标签、控制标签,在
8 Y% l2 n: a7 q% p! E数据的尾段加上 CRC 校验标签、应答标签和传输结束标签。把这些内容按特定4 y& t" T# `$ P0 U. p0 A- x; u
的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签就如同
% A" z6 Q7 g; r* c, b6 v0 }SPI 中各种通道上的信号,起到了协同传输的作用。当整个数据包被传输到其
% `5 Q2 A7 ]8 \( d  i4 s它设备时,只要这些设备按格式去解读,就能还原出原始数据。类似这样的数
: ]3 e/ S. ]& R据包就被称为 CAN的数据帧。
211619147504413.png 0 Y0 h/ U7 J. J1 |7 E  v# N
看下数据帧
211621597966288.png
扩展与标准 仲裁段不一样,扩展11+18 = 29位
仲裁段:告诉是发还是收(几个同时通信的时候,那那根的信号,拉低了就是谁的了)如:
211628518434340.png
总电平接收了节点2的^_^(can的神奇之处)
CRC:发送与接收的对应
IDE:用于区分标准帧与扩展帧
r0、r1 都是显性位
3.CAN通信报文内容设置
void CAN_SetMsg(void)
4.发送消息,“ABCD”
CAN_Transmit(CAN1, &TxMessage);
总体流程图(例程对应):
211640178283702.jpg
4 v& I- P3 c. q; u. A* u
while( flag == 0xff ); //flag =0 ,success ,此时产生一个中断(CAN中断)
对于从机的CAN_Config(); 是一模一样
不一样的是从机先上电
中断函数时一样的
CAN线接的时候 CANH接CANH, CANL接CANL,  不能对接

! i* a- W; g" t( A5 m6 _+ g
赞 收藏 评论0 发布时间:2022-1-22 09:49

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版