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

STM32之CAN---发送管理分析

[复制链接]
STMCU-管管 发布时间:2020-9-3 13:01
1 CAN发送邮箱

STM32共有三个CAN发送邮箱,在检测到总线空闲时交发送,但需要注意的是,有可能会发送失败,有可能因为仲裁失败从而导致失败,也有可能是其它错误,原则上bxCAN将自动重发,但bxCAN也可以配置不自动重发。正因为如此,发送邮箱中有可能同时存在多个需要发送的报文,一旦出现这种情况,那么发送邮箱中的多个报文又将是谁先发送谁后发送呢?有两种模式:ID模式和FIFO模式。ID模式由报文的ID值决定,即ID值越小,优先级越高,另一种FIFO模式,顾名思义,即为消息队列方式,谁先到谁先发送,此种模式下三个邮箱与接收FIFO类似。


3 M8 c. W/ C: P6 j/ Z( I: j

下图是发送邮箱的状态图:

7 x' X7 x  l' j/ H2 y

       图1

! O! ?* r  i( g+ `

由上图可知,发送邮箱共有四种状态,空状态,挂号状态,预定发送状态(scheduled),发送状态。

发送报文的流程为:应用程序选择1个空发送邮箱;设置标识符,数据长度和待发送数据;然后对CAN_TIxR寄存器的TXRQ位置’1’,来请求发送。TXRQ位置’1’后,邮箱就不再是空邮箱;而一旦邮箱不再为空,软件对邮箱寄存器就不再有写的权限。TXRQ位置1后,邮箱马上进入挂号状态,并等待成为最高优先级的邮箱,参见发送优先级。一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送状态。一旦CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入发送状态)。一旦邮箱中的报文被成功发送后,它马上变为空邮箱;硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,来表明一次成功发送。; U$ E3 o, u5 b8 o- `) q
如果发送失败,由于仲裁引起的就对CAN_TSR寄存器的ALST位置’1’,由于发送错误引起的就对TERR位置’1’

" x$ O* V" w2 `8 Q

# m* C. b) `  }  M2 发送优先级

          如之前所述,如果三个邮箱中同时存在多个待发送的报文时,此时存在一个问题,即先送哪个邮箱中的报文好呢?此时,存在一个发送优先级的问题。此时,非空发送邮箱进入发送仲裁,发送仲裁有两种策略:ID模式和FIFO模式。

  • ID模式:当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。根据CAN协议,标识符数值最低的报文具有最高的优先级。如果标识符的值相等,那么邮箱号小的报文先被发送。此模式通过对CAN主控寄存器CAN_MCR的TXFP位清0来设置。
    " T8 A, c6 j( B; Q

    + j/ `! d3 B  J0 H
  • FIFO模式:通过对CAN_MCR寄存器(CAN主控寄存器)的TXFP位置’1’,可以把发送邮箱配置为发送FIFO。在该模式下,发送的优先级由发送请求次序决定。该模式对分段发送很有用。
    / G; S6 y0 m5 V9 K
    9 Y) L: x- s- M7 v( n- @

: T. S/ h$ X! T* W

: r1 ~3 q9 L8 Y! e0 [" U! I3 取消发送

发送邮箱中待发送的报文在正常发送成功之前也可以中途取消,通过对CAN_TSR寄存器的ABRQ位置’1’,可以中止发送请求。

  • 当发送邮箱处于挂号或预定状态时:发送请求马上就被中止了。
  • 当发送邮箱处于发送状态时:
    # J+ N7 V- ?/ y3 Y
    0 b& s1 j6 x+ K8 y; g2 g: V5 l
         那么中止请求可能导致2种结果:

                    1:如果邮箱中的报文被成功发送,那么邮箱变为空邮箱,并且CAN_TSR寄存器(CAN发送状态寄存器)的TXOK位被硬件置’1’;

                    2:如果邮箱中的报文发送失败了,那么邮箱变为预定状态,然后发送请求被中止,邮箱变为空邮箱且TXOK位被硬件清’0’。

       因此,不管如何,一旦取消发送,那么在发送操作结束后,邮箱都会变为空邮箱。

       固件库中取消发送的接口为:


- l2 M' m* P2 Y4 D: g. f$ |

  1. : f; y& I; \, n  N8 Q
  2. /**
    " e' L3 o( l( i
  3.   * @brief  Cancels a transmit request.: H2 R8 l" U: x- O4 n$ k
  4.   * @param  CANx: where x can be 1 or 2 to select the CAN peripheral.
    $ w2 H' A/ w; w! l1 g
  5.   * @param  Mailbox: Mailbox number.7 ]7 v8 h/ l  c% P1 C7 j
  6.   * @retval None0 R6 a" |: ^0 t0 R. d) \) i( E( i
  7.   */
    ( O' h( p6 w7 Y' l9 w- ^
  8. void CAN_CancelTransmit(CAN_TypeDef* CANx, uint8_t Mailbox);
    ; h. X  z7 L% x3 @. k
复制代码
; w# d5 U2 i* s: |/ J; y: j1 t
# c  `* |; z) n! ^' Z5 t
4 自动重传模式
# Y) M6 d- E: X; W* ~9 Z2 R# v

该模式主要用于满足CAN标准中,时间触发通信选项的需求。通过对CAN_MCR寄存器的NART位置’1’,来让硬件工作在该模式(禁止自动重传)。


6 z9 \5 g5 B  n在该模式下,发送操作只会执行一次。如果发送操作失败了,不管是由于仲裁丢失或出错,硬件都不会再自动发送该报文。

% W" [9 @! Y7 J7 ^7 [, h
在一次发送操作结束后,硬件认为发送请求已经完成,从而对CAN_TSR寄存器的RQCP位置’1’,同时发送的结果反映在TXOK、ALST和TERR位上。9 ~7 E8 X! y6 u" J( m

$ s; i, ?2 r" \' W2 ]. u8 [

5 发送邮箱的组成1 K7 w  E9 B, }- Q4 r( h

说了那么多,那个三个发送邮箱的结构到底是怎么样的呢?与接收FIFO的邮箱类似,发送邮箱也是由四个寄存器组成:发送邮箱标识符寄存器(CAN_TIxR x=0..2),发送邮箱长度和时间戳寄存器(CAN_TDTxR x=0..2),发送邮箱低字节数据寄存器(CAN_TDLxR x=0..2),发送邮箱高字节寄存器(CAN_TDHxR x=0..2)。

) C% Y3 E+ }( P) W% z1 o4 P

5.1 发送邮箱标识符寄存器 (CAN_TIxR) (x=0..2)
, @9 L: I5 ?; p

地址偏移量: 0x180,0x190,0x1A0


! B* @: f$ }6 x* `4 U复位值: 0xXXXX XXXX,X=未定义位(除了第0位,复位时TXRQ=0)


; S- `1 o4 ]1 ?, r% C' E注: 1 当其所属的邮箱处于等待发送的状态时,该寄存器是写保护的。

         2 该寄存器实现了发送请求控制功能(第0位)-复位值为0


7 H6 M. \) D7 f% r  X

                                                                                    

图2


0 S8 e" ]/ N# \5 n) X

与接收FIFO的邮箱的发送邮箱标识符寄存器类似,各位定义如下:

. O$ t+ ]! A0 M% f& c7 l% k
位31:21STID[10:0]: 标准标识符( P5 B0 ~, D" m8 B
扩展身份标识的高字节。
位20:3EXID[17:0]: 扩展标识符1 n9 D3 y5 z0 l. z; q, Y6 B  Z
扩展身份标识的低字节。
位2IDE: 标识符选择3 u' B2 p. T0 V7 y4 C
该位决定发送邮箱中报文使用的标识符类型3 S3 y3 y) O' O3 w" ]
0: 使用标准标识符;
" P& h6 h& P$ t5 F( h9 [' v1: 使用扩展标识符。
位1RTR: 远程发送请求, I  ^- I0 Q9 }. h, [2 w$ A
0: 数据帧;9 c1 j6 |2 l. h, x; K% p; h5 A! i
1: 远程帧。
位0TXRQ: 发送数据请求  t5 j  p4 X1 z; ], O; ]' T; H
由软件对其置1,来请求发送其邮箱的数据。当数据发送完成,邮箱为空时,硬件对其清0。
% q1 I0 M0 u; Z9 i) o
* K' F+ w' A$ P: y; }  [% T
5.2 发送邮箱数据长度和时间戳寄存器 (CAN_TDTxR) (x=0..2)
4 M& J6 N: x" J$ I) }) |& y

地址偏移量:0x184,0x194,0x1A4
1 Q& n1 d6 v2 T5 M& Q7 [1 ]复位值:未定义
# q7 p! x+ G; J: \- l8 i

图3

( {4 Z' y7 T! V9 g# Q
3 m6 \3 \( E1 p: r
位31:16TIME[15:0]: 报文时间戳
$ P. b/ F) B0 K: u" R0 O8 W该域包含了,在发送该报文SOF的时刻,16位定时器的值。
位15:9保留位
位8TGT: 发送时间戳
! y+ ?1 J' e) K+ X3 r# J6 h* E; P只有在CAN处于时间触发通信模式,即CAN_MCR寄存器的TTCM位为1时,该位才有效。
" `! _. w" N/ W7 @* D( H% P0: 不发送时间戳;
. w% p+ ?( o" k) ^$ E( D9 I3 B1: 发送时间戳TIME[15:0]。在长度为8的报文中,时间戳TIME[15:0]是最后2个发送的字节:TIME[7:0]作为第7个字节,TIME[15:8]为第8个字节,它们替换了写入CAN_TDHxR[31:16]的数据(DATA6[7:0]和DATA7[7:0])。为了把时间戳的2个字节发送出去,DLC必须编程为8。
位7:4保留位。
位3:0DLC[15:0]: 发送数据长度9 t  I$ j+ r/ n/ s8 p
该域指定了数据报文的数据长度或者远程帧请求的数据长度。1个报文包含0到8个字节数据,而这由DLC决定。

, i3 b# c* T2 J$ O& \5.3 发送邮箱低字节数据寄存器 (CAN_TDLxR) (x=0..2)

9 O- C  H7 |0 u; A# a4 M, ~
4 ~  ^" \4 k. c, t$ I6 G3 L& B' F
0 A( T* i7 C4 H0 U9 j( `2 A0 K
地址偏移量:0x188,0x198,0x1A8+ p8 q& O* w6 l
复位值:未定义位

: h9 U* a5 K, _2 ~+ b5 R, \; U! U( j$ A

当邮箱为空时,寄存器中的所有位为只读。

* t6 ?! r$ W8 B! M- p8 ], ~9 B; Q! c) ~

图4

2 b6 Z$ d" U3 r! F/ _$ ?$ l3 e
位31:24DATA3[7:0] : 字节3( l( }$ W% B1 \- D
报文的数据字节3。
位23:16DATA2[7:0] : 字节2
; Q% t( h! u% D# M$ Z报文的数据字节2。
位15:8DATA1[7:0] : 字节1* ~7 p0 r$ T3 C
报文的数据字节1。
位7:0DATA0[7:0] : 字节0) @9 D: k3 a+ @  c9 j
报文的数据字节0。& k) F+ g& X7 @. j% A6 ~
报文包含0到8个字节数据,且从字节0开始。

5 o! z6 t' z7 o3 X5.4 发送邮箱高字节数据寄存器 (CAN_TDHxR) (x=0..2)

! }: B% ?6 P" B/ T$ ?& L; S0 l9 o  V

地址偏移量:0x18C,0x19C,0x1AC, Z* w; K" n! O3 X' L- [
复位值:未定义位
2 V2 K, i7 t: f/ D+ h, ?5 ~0 ], b6 C当邮箱为空时,寄存器中的所有位为只读。
1 ]% @) i& ]  `% ^5 A

$ m3 G# c5 D8 G, e- h' G

图5


9 @& C! t* E1 ]4 S5 u" L' z# b. u! ?$ \
位31:24DATA7[7:0] : 字节71 U% P3 ^. E. i6 A+ [( W
报文的数据字节75 I7 v' V  N2 L" D
注: 如果CAN_MCR寄存器的TTCM位为1,且该邮箱的TGT位也为1,那么DATA7和DATA6将被TIME时间戳代替。
位23:16DATA6[7:0] : 字节6& [8 F; q2 h7 t# c3 y1 {5 l
报文的数据字节6。
位15:8DATA5[7:0] : 字节5
: I  C8 E9 w. F1 k报文的数据字节5。
位7:0DATA4[7:0] : 字节4
( k3 _* D/ D- ?! `报文的数据字节4。
, i& g6 A* b( }
6 CAN发送状态寄存器 (CAN_TSR)

$ S' ~- C6 E5 G9 Z. z, {

地址偏移量: 0x08

复位值: 0x1C00 00001 Y0 [  [- u0 s& x

单有发送邮箱还不行,不得有一个寄存器从整体上显示发送各邮箱的状态及控制,而CAN发送状态寄存器(CAN_TSR)即负责此工作的。

7 f+ l6 e5 @% D  t

  图6

3 C1 V- ]$ M$ \) D: t

各定义如下:


  u; l" x9 O$ |2 m3 I! l
位31LOW2: 邮箱2最低优先级标志& I+ v5 o) B6 }. O: |0 g
当由多个邮箱在等待发送报文,且邮箱2的优先级最低时,硬件对该位置1。
位30LOW1: 邮箱1最低优先级标志/ Q# ^) h1 D2 a4 b! E/ Y# q. j# O
当由多个邮箱在等待发送报文,且邮箱1的优先级最低时,硬件对该位置1。
位29LOW0: 邮箱0最低优先级标志7 @& y# I3 t6 S2 `6 _$ {
当由多个邮箱在等待发送报文,且邮箱0的优先级最低时,硬件对该位置1。
位28TME2: 发送邮箱2空
3 S0 X* ^( O3 H3 h1 H当邮箱2中没有等待发送的报文时,硬件对该位置1。
位27TME1: 发送邮箱1空5 b$ p$ q; }; S
当邮箱1中没有等待发送的报文时,硬件对该位置1。
位26TME0: 发送邮箱0空
7 Z+ G- T) k! y4 Y/ i( \1 D& A9 _# y当邮箱0中没有等待发送的报文时,硬件对该位置1。
位25:24CODE[1:0]: 邮箱号
0 B! c3 e% c) K  u当有至少1个发送邮箱为空时,邮箱号为下一个空的发送邮箱号。
9 Q9 F) {; `: C当所有的发送邮箱都为空时,邮箱号为优先级最低的那个发送邮箱号。
位23ABRQ2: 邮箱2中止发送
; S( B$ c- r3 h3 p软件对该位置1可以中止邮箱2的发送请求,当邮箱2的发送报文被清除时硬件对该位清0。
* m, p, Z# J+ k8 v, X% ]1 R如果邮箱2中没有等待发送的报文,则对该位置1没有任何效果。
位22:20保留位,硬件强制其值为0
位19TERR2: 邮箱2发送失败$ s. ~! U6 _9 A- a$ L7 k7 R
当邮箱2因为出错而导致发送失败时,对该位置1。
位18ALST2: 邮箱2仲裁丢失* E2 \, C. M) w7 N( E
当邮箱2因为仲裁丢失而导致发送失败时,对该位置1。
位17TXOK2: 邮箱2发送成功
% k0 D4 R9 ?( Y7 m* J' U每次在邮箱2进行发送尝试后,硬件对该位进行更新:0 j' [- M4 b  A5 T6 S) J
0: 上次发送尝试失败;
% m$ r) Q/ ?! C& W4 {+ [  t1: 上次发送尝试成功。/ @6 K! K9 B8 L/ s8 M1 K
当邮箱2的发送请求被成功完成后,硬件对该位置1。
位16RQCP2: 邮箱2请求完成" t6 I" D. p$ [$ |, H, {  M3 o& A
当上次对邮箱2的请求(发送或中止)完成后,硬件对该位置1。- S6 E6 p$ M5 s
软件对该位写’1’可以对其清0;当硬件接收到发送请求时也对该位清0(CAN_TI2R 寄存器的TXRQ位被置1)。; ?3 Z: p# ?" C; H, A! i# S0 ?: O
该位被清0时,邮箱2的其它发送状态位(TXOK2, ALST2和TERR2)也被清0。
位15ABRQ1: 邮箱1中止(发送)
# O7 c$ _4 H5 n' y  A/ p  [8 A5 S软件对该位置1可以中止邮箱1的发送请求,当邮箱1的发送报文被清除时硬件对该位清0。
; O  p9 S2 h) h/ P3 T如果邮箱1中没有等待发送的报文,则对该位置1没有任何效果。
位14:12保留位,硬件强制其值为0
位11TERR1: 邮箱1发送失败
8 v+ ^- I" B+ m% J$ z- o当邮箱1因为出错而导致发送失败时,对该位置1。
位10ALST1: 邮箱1仲裁丢失
# |' ]+ B7 r. q# x9 V# O- M& s当邮箱1因为仲裁丢失而导致发送失败时,对该位置1。
位9TXOK1: 邮箱1发送成功
1 y, p$ O! D6 S/ a每次在邮箱1进行发送尝试后,硬件对该位进行更新:
/ f% S' R2 H8 w5 @; }$ ~5 `0: 上次发送尝试失败;+ q2 |; m( q  x6 z' q
1: 上次发送尝试成功。6 U5 W3 B. h! E/ g) j
当邮箱1的发送请求被成功完成后,硬件对该位置1。
位8RQCP1: 邮箱1请求完成9 ^( |) M  a* D1 V* T9 J# q
当上次对邮箱1的请求(发送或中止)完成后,硬件对该位置1。
2 F. t% N- s; E) T8 J软件对该位写’1’可以对其清0;当硬件接收到发送请求时也对该位清0(CAN_TI1R 寄存器的TXRQ位被置1)。
7 J1 _& }2 ?. ]# o$ c该位被清0时,邮箱1的其它发送状态位(TXOK1, ALST1和TERR1)也被清0。
位7ABRQ0: 邮箱0中止(发送)! ~1 u8 l( a5 C* E
软件对该位置1可以中止邮箱0的发送请求,当邮箱0的发送报文被清除时硬件对该位清0。0 ?% f/ ^+ {6 Q' F* [5 R( l% U
如果邮箱0中没有等待发送的报文,则对该位置1没有任何效果。
位6:4保留位,硬件强制其值为0
位3TERR0: 邮箱0发送失败
! b; l( b3 h7 r' @5 E: ]6 ^2 W当邮箱0因为出错而导致发送失败时,对该位置1。
位2ALST0: 邮箱0仲裁丢失
* k: _; \2 x! @# E! m% n0 `2 ]# e当邮箱0因为仲裁丢失而导致发送失败时,对该位置1。
位1TXOK0: 邮箱0发送成功
; L5 F. @1 t: f& W" g每次在邮箱0进行发送尝试后,硬件对该位进行更新:
" ~& q$ e6 a# \& n0: 上次发送尝试失败;$ f$ j, y) e; M. `
1: 上次发送尝试成功。6 Q5 H9 E7 `& T# A- O0 p5 w, m8 Y
当邮箱0的发送请求被成功完成后,硬件对该位置1。
位0RQCP1: 邮箱0请求完成+ p0 |; u8 z6 ^$ G$ C
当上次对邮箱0的请求(发送或中止)完成后,硬件对该位置1。
3 F- b, i1 U3 h0 S4 D软件对该位写’1’可以对其清0;当硬件接收到发送请求时也对该位清0(CAN_TI0R 寄存器的TXRQ位被置1)。) T% c9 W( Z; W  W; |" ]: N( O8 Z0 ^
该位被清0时,邮箱0的其它发送状态位(TXOK0, ALST0和TERR0)也被清0。

- A1 E$ i# V  p0 E* W5 j$ _+ c1 b7 K/ N这里值得注意的是位25~24,即下一个空的发送邮箱号。当所有的发送邮箱都为空时,邮箱号为优先级最低的那个发送邮箱号。通过此两位,STM32就知道下一条发送报文该存储到哪个邮箱了。
5 a& h! b8 X! t# g6 W

6 p2 y( ]8 O" K: b( C0 f" t

! w  Q4 U; B* x2 f. {, U. H( K/ H0 Q2 B% R/ R$ Z" z  m
7 与CAN发送有关的固件发送接口
" m3 A9 ?$ j' q) Y

发送接口如下:

) k5 |. ?; p4 I0 }- ^' d

  1. /**
    ! t% C: C; d4 C! ]. p, B9 v
  2.   * @brief  Initiates and transmits a CAN frame message.
    / B$ [' Q2 s0 R* {3 ]
  3.   * @param  CANx: where x can be 1 or 2 to to select the CAN peripheral.  x- t$ X* P: N6 t% F, l9 @+ g
  4.   * @param  TxMessage: pointer to a structure which contains CAN Id, CAN DLC and CAN data.
    4 d' j+ N* L+ K
  5.   * @retval The number of the mailbox that is used for transmission or
    6 m5 _; R$ e' t
  6.   *         CAN_TxStatus_NoMailBox if there is no empty mailbox.
    + W. G  `7 q0 P
  7.   */
    & M, o/ R3 Y1 j' R, t' k) L/ y- i4 u" }
  8. uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage);
复制代码

' Y9 z$ Q2 I& C7 O4 t4 s% T
. z6 S8 h" U; x4 k0 n! k获取发送状态接口如下:8 `1 [8 M; Q' _& B0 \4 H1 h

! c9 ?! F. @% E# ?
5 }" c( ]7 Y- u" l+ `0 L* {
  1. 7 P- c5 w5 U5 s, n
  2. /**+ o+ ?5 ?) h) ?) `2 X
  3.   * @brief  Checks the transmission status of a CAN Frame.
    * ?. M* i4 V; t! ?2 p
  4.   * @param  CANx: where x can be 1 or 2 to select the CAN peripheral.
    ) V4 h# u5 n! A$ j9 H1 c
  5.   * @param  TransmitMailbox: the number of the mailbox that is used for transmission.! ^7 J% ]+ _( V) n2 t
  6.   * @retval CAN_TxStatus_Ok if the CAN driver transmits the message, + a( h2 W4 e8 p6 X" z8 e' ?
  7.   *         CAN_TxStatus_Failed in an other case.
      H5 o: k" d$ [" d8 P: [
  8.   */+ X! K0 S" w9 m) k. M
  9. uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox);: S# F% ^/ w( h5 Q+ V/ _
复制代码
& Y) J9 w7 K% }' h( P
6 S* ]0 G- d! A! ~: Z9 m9 k! K0 y9 g8 |9 b
8 一个示例

. A# M! \! Y! x$ q' @. r, g8 S. `6 I0 _9 x4 l7 \4 H$ z

  1. 1 G* @8 ^4 V+ [6 y! Q$ Q' _
  2. CanTxMsg TxMessage;
    % a7 a( _0 E+ z7 }( {9 }
  3. int i;7 @$ m7 f) T% [# L3 S
  4. 0 g" `2 {# S+ D. ?! y/ o
  5. if(id_fmt == STD_ID)//如果是标准CAN ID4 ?8 R6 G) @5 @4 F
  6. { " d/ }4 {! Q) T! t
  7.     TxMessage.StdId = send_frame->id;  //设置标准CAN ID: V+ Q. X* v. z3 e, B5 h* u: h
  8.     TxMessage.IDE = CAN_ID_STD;   //设置IDE为标准CAN ID! N2 P0 P6 j- B+ k0 ]
  9. }2 R. d* p9 h6 _# z) T# T+ E; t
  10. else5 \. _# v; ~( V( y  y
  11. {    7 L6 h* n" a0 v( s4 j3 {
  12.     TxMessage.StdId = (send_frame->8 c$ R% k9 P4 q" d& t) O5 @  _
  13.     id >>18) & 0x7FF; //设置扩展CAN ID的标准基本ID部分   
    ( F' `  p( T$ p+ ]5 _* b% T3 J' x
  14.     TxMessage.ExtId = send_frame->id & 0x3FFFF;     //设置扩展CAN ID的扩展ID部分
    * o3 U- u  ^. |+ G$ }; b
  15.     TxMessage.IDE = CAN_ID_EXT;   //设置IDE为扩展CAN ID
    : W/ _: Y  c3 i% A5 _" v) `! v
  16. }
    9 Y" K/ R  f) a# G6 i  r& V
  17. " P) O, Y# X3 f# O% k8 u
  18. TxMessage.RTR = CAN_RTR_DATA; //数据帧
    $ j: O2 E2 @& J5 K' ]
  19. TxMessage.DLC = 8;  //数据长度
    ; d! q0 T. D* z8 d$ H( Q; g
  20. for(i=0;i<8;i++)
    4 b4 J0 A- C) _6 j% @- [3 |
  21. {; E; T, r. E$ q6 j7 ]
  22.     TxMessage.Data[i] = send_frame->data_buff[i];
    ; }5 \, A- G- L  _" e& Q
  23. }; K3 k$ a1 {2 W, F/ s- A5 F
  24. . Y$ l7 r& v& a7 g7 U- p
  25. CAN_Transmit(CAN1,&TxMessage);
    ; L0 h) |7 m4 B* `# M, U
复制代码

# J0 X7 I% A8 Q  r- v- ?
& Y  C5 }8 U0 M
收藏 评论0 发布时间:2020-9-3 13:01

举报

0个回答

所属标签

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