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

我的STM32U5 项目秀+1.STM32U575 FDCAN通讯

[复制链接]
jundao721 发布时间:2023-1-8 15:40
         收到板卡有一段时间了,疫情刚放开,工作都待有序开展。不知道为什么,拿到这块板卡就特别喜欢。闲言少叙,根据项目规划要先完成FDCAN的通讯测试。大概思路是先用STM32CubeMX搭建基础框架,然后增加发送和接收的程序代码,测试波特率。在箱子里找了块其他MCU的测试板卡,主要利用其FDCAN芯片TJA1044。通讯测试盒使用的是BUSMUST基础版。查看STM32U575Datasheet,按照引脚定义连接好板卡盒测试盒。如图1所示:3 m" ~6 s7 j; r1 }% q% ~
         在STM32CubeMX上配置好FDCAN的定义,引脚定义和时钟。这里我初步把FDCAN的时钟配置为80M,这里要注意ICACHE要选择,选1-way 就可以。如图2所示:3 n) e6 K, p5 {! g) J5 p
4 r2 Z& i$ m; p8 S
        生成基础框架代码后,添加发送配置,主要配置成FDCAN所需格式即可,其中波特率的计算 = APB频率/(BRP分频*(1+tBS1+tBS2)),如下:' D' A( U; j5 }2 f% j. A2 A9 `
      
  1. /* Prepare Tx Header */! }. `; V, r4 f3 ^) `" t
  2.   TxHeader.Identifier = 0x321;
    1 S# g# f- K7 W' `$ j4 @
  3.   TxHeader.IdType = FDCAN_STANDARD_ID;/ ~6 d( ^, W: W) k
  4.   TxHeader.TxFrameType = FDCAN_DATA_FRAME;, w# w% N& N5 `1 I, D; D
  5.   TxHeader.DataLength = FDCAN_DLC_BYTES_64;//FDCAN_DLC_BYTES_8;
      i; o, J, x0 V$ b$ P; ~% q3 [9 S9 F: w
  6.   TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;& o# y' I6 ^5 {% d; V7 `$ ~
  7.   TxHeader.BitRateSwitch = FDCAN_BRS_ON;- g8 W2 o; |; I
  8.   TxHeader.FDFormat = FDCAN_FD_CAN;//FDCAN_CLASSIC_CAN;. O' B0 g- _; F, N1 @
  9.   TxHeader.TxEventFifoControl =FDCAN_NO_TX_EVENTS;// FDCAN_STORE_TX_EVENTS;//FDCAN_NO_TX_EVENTS;
    ) P' U8 P) ?! t' ^/ x
  10.   TxHeader.MessageMarker = 0;
复制代码
     / K+ b! ]4 b3 O3 V
    数据接收部分,主要是配置滤波器,如下:
4 n) e5 N' h7 Y* |% d; p( a* T" S7 ^4 y6 `. E# `9 D- f1 w
: f; [. [  N# a* I# W4 [  s% q
  1. /* Configure Rx filter */
    : B( V7 x, N3 p
  2.   sFilterConfig.IdType = FDCAN_STANDARD_ID;
    , Z7 Z6 `* v( @2 j
  3.   sFilterConfig.FilterIndex = 0;
    " W0 M0 c$ I/ ^" D: T) _" V
  4.   sFilterConfig.FilterType = FDCAN_FILTER_MASK;$ t2 _4 z* B1 t" J: K0 ]
  5.   sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
    + w7 i4 ]8 E- k0 e( H0 P$ A
  6.   sFilterConfig.FilterID1 = 0x123;//receive ID" W6 ?6 F. W$ J
  7.   sFilterConfig.FilterID2 = 0x7FF;
    " K/ f- n' j2 E6 J7 D2 H  i  y
  8.   if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
    ( t- Q/ v6 _* X
  9.   {
    : C, l7 V) S: q
  10.     Error_Handler();
    4 w1 C1 c8 P( [, {4 {8 I
  11.   }
    ( k3 c# r6 s( l% s" y- n% o

  12. ) y$ j$ u$ l8 K+ J/ V0 o
  13.   /* Configure global filter:
      S2 ^; G' v, ]% a7 I7 [
  14.      Filter all remote frames with STD and EXT ID
    3 A5 O. T" Q/ i4 L+ D4 w6 |
  15.      Reject non matching frames with STD ID and EXT ID */" |6 X, c% z4 f/ K- A
  16.   if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)- R* N& T3 G' n/ {1 e4 M2 b* r
  17.   {
    7 y! _/ R+ J5 v
  18.     Error_Handler();
    8 d5 U0 X% x9 N5 O$ u- E
  19.   }
    9 A3 C5 `! v* }% j6 Z4 O$ ?4 s9 o7 B

  20. 1 \1 y* F* v1 F, u* l
  21.   /* Start the FDCAN module */, k& i# `8 j4 w0 B: P
  22.   if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
    2 _! [# o9 Z& k. C' N: ?
  23.   {% v* K6 z/ A2 ]0 ]. Z
  24.     Error_Handler();, F. l% S' @/ {
  25.   }/ I  D- h, }: |: b; k- R! b

  26. : d) L  J% F4 \4 A
  27.   if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
    $ ]7 Q4 x$ ~4 w7 O- I( }9 }
  28.   {: Z( v- ?( `& C$ H+ P# ~6 D0 `$ @0 f
  29.     Error_Handler();
    ( Y  a: c( B6 R
  30.   }
复制代码
     接下来配置发送数据和接收中断callback:6 u8 `1 B3 r- F1 J9 E
  1. if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData) != HAL_OK)
    & j% X% O$ W2 s1 ^5 a2 L
  2.         {+ s( D# O$ z) P& V' ^. V
  3.           /* Transmission request Error */
    ; m  X1 p% J9 M5 z
  4.           Error_Handler();
    $ ?2 u% n/ q+ y. f
  5.         }
    ; V: s8 J" B9 _3 e
  6.         HAL_Delay(1000);
复制代码
  1. void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)7 j, N0 V+ O0 z
  2. {
    + v" a0 j# F" ^+ q- w) B& v
  3.   if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)' Y! c( f) ~6 p9 c/ B3 s
  4.   {
    % Q  U9 a& v" J5 {4 Q" {- n
  5.     /* Retrieve Rx messages from RX FIFO0 */: A/ s; E5 x1 J" z/ g# j& m
  6.     if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)( B# u0 b8 t& c
  7.     {1 i; V" P% L& p5 w# h6 `0 _; ~& L
  8.     Error_Handler();
    2 o% u) h( h" a$ r5 Q5 J+ Z+ O
  9.     }& o9 S$ R* i0 q3 D$ j& N, I

  10. 8 C! g: L& v2 h7 ?+ w$ S
  11.     /* Display LEDx */4 @1 ^/ |4 F3 D. k6 ]) @
  12.     if ((RxHeader.Identifier == 0x123) && (RxHeader.IdType == FDCAN_STANDARD_ID) && (RxHeader.DataLength == FDCAN_DLC_BYTES_64))//FDCAN_DLC_BYTES_8))- \2 P( G. d% L
  13.     {
    " _+ Y' y, O1 h# G
  14. //      LED_Display(RxData[0]);
    - g  x- K- }: t4 N# p  F) m
  15. //      ubKeyNumber = RxData[0];
    2 F8 a6 c+ ?) z5 x! F( H. `
  16.                           HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);) _! L; _# }0 Q; R
  17. //                          Rx_Flag=1;) t+ E' Y! @  L' A$ ?  t$ U
  18.     }; B2 F  o* K. d* l1 W  O* a, ~4 a: i4 {
  19.   }3 d8 O# d0 b* z7 g1 p
  20. }
复制代码
      在while 中每1S调用发送一次64字节。如图3所示:5 N5 _# K( V& N7 e  X; S
      通过watch1窗口可以看到接收的字节,如图4所示:
( l6 K- F& z( e+ Q! D" D' E3 K7 m0 O6 n! K
    最后测试波特率发现,由于杜邦线连接控制器到IC的距离比较远,最大设置波特率1.6Mbps通讯,缩短距离可增加波特率。初步测试完成。$ B! Q' `$ H" G$ v$ R5 L

图1

图1

图2

图2

图3

图3
图4.JPG
收藏 评论0 发布时间:2023-1-8 15:40

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版