收到板卡有一段时间了,疫情刚放开,工作都待有序开展。不知道为什么,拿到这块板卡就特别喜欢。闲言少叙,根据项目规划要先完成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 `
- /* Prepare Tx Header */! }. `; V, r4 f3 ^) `" t
- TxHeader.Identifier = 0x321;
1 S# g# f- K7 W' `$ j4 @ - TxHeader.IdType = FDCAN_STANDARD_ID;/ ~6 d( ^, W: W) k
- TxHeader.TxFrameType = FDCAN_DATA_FRAME;, w# w% N& N5 `1 I, D; D
- TxHeader.DataLength = FDCAN_DLC_BYTES_64;//FDCAN_DLC_BYTES_8;
i; o, J, x0 V$ b$ P; ~% q3 [9 S9 F: w - TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;& o# y' I6 ^5 {% d; V7 `$ ~
- TxHeader.BitRateSwitch = FDCAN_BRS_ON;- g8 W2 o; |; I
- TxHeader.FDFormat = FDCAN_FD_CAN;//FDCAN_CLASSIC_CAN;. O' B0 g- _; F, N1 @
- TxHeader.TxEventFifoControl =FDCAN_NO_TX_EVENTS;// FDCAN_STORE_TX_EVENTS;//FDCAN_NO_TX_EVENTS;
) P' U8 P) ?! t' ^/ x - 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
- /* Configure Rx filter */
: B( V7 x, N3 p - sFilterConfig.IdType = FDCAN_STANDARD_ID;
, Z7 Z6 `* v( @2 j - sFilterConfig.FilterIndex = 0;
" W0 M0 c$ I/ ^" D: T) _" V - sFilterConfig.FilterType = FDCAN_FILTER_MASK;$ t2 _4 z* B1 t" J: K0 ]
- sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
+ w7 i4 ]8 E- k0 e( H0 P$ A - sFilterConfig.FilterID1 = 0x123;//receive ID" W6 ?6 F. W$ J
- sFilterConfig.FilterID2 = 0x7FF;
" K/ f- n' j2 E6 J7 D2 H i y - if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
( t- Q/ v6 _* X - {
: C, l7 V) S: q - Error_Handler();
4 w1 C1 c8 P( [, {4 {8 I - }
( k3 c# r6 s( l% s" y- n% o
) y$ j$ u$ l8 K+ J/ V0 o- /* Configure global filter:
S2 ^; G' v, ]% a7 I7 [ - Filter all remote frames with STD and EXT ID
3 A5 O. T" Q/ i4 L+ D4 w6 | - Reject non matching frames with STD ID and EXT ID */" |6 X, c% z4 f/ K- A
- 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
- {
7 y! _/ R+ J5 v - Error_Handler();
8 d5 U0 X% x9 N5 O$ u- E - }
9 A3 C5 `! v* }% j6 Z4 O$ ?4 s9 o7 B
1 \1 y* F* v1 F, u* l- /* Start the FDCAN module */, k& i# `8 j4 w0 B: P
- if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
2 _! [# o9 Z& k. C' N: ? - {% v* K6 z/ A2 ]0 ]. Z
- Error_Handler();, F. l% S' @/ {
- }/ I D- h, }: |: b; k- R! b
: d) L J% F4 \4 A- if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
$ ]7 Q4 x$ ~4 w7 O- I( }9 } - {: Z( v- ?( `& C$ H+ P# ~6 D0 `$ @0 f
- Error_Handler();
( Y a: c( B6 R - }
复制代码 接下来配置发送数据和接收中断callback:6 u8 `1 B3 r- F1 J9 E
- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData) != HAL_OK)
& j% X% O$ W2 s1 ^5 a2 L - {+ s( D# O$ z) P& V' ^. V
- /* Transmission request Error */
; m X1 p% J9 M5 z - Error_Handler();
$ ?2 u% n/ q+ y. f - }
; V: s8 J" B9 _3 e - HAL_Delay(1000);
复制代码- void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)7 j, N0 V+ O0 z
- {
+ v" a0 j# F" ^+ q- w) B& v - if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)' Y! c( f) ~6 p9 c/ B3 s
- {
% Q U9 a& v" J5 {4 Q" {- n - /* Retrieve Rx messages from RX FIFO0 */: A/ s; E5 x1 J" z/ g# j& m
- if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)( B# u0 b8 t& c
- {1 i; V" P% L& p5 w# h6 `0 _; ~& L
- Error_Handler();
2 o% u) h( h" a$ r5 Q5 J+ Z+ O - }& o9 S$ R* i0 q3 D$ j& N, I
8 C! g: L& v2 h7 ?+ w$ S- /* Display LEDx */4 @1 ^/ |4 F3 D. k6 ]) @
- if ((RxHeader.Identifier == 0x123) && (RxHeader.IdType == FDCAN_STANDARD_ID) && (RxHeader.DataLength == FDCAN_DLC_BYTES_64))//FDCAN_DLC_BYTES_8))- \2 P( G. d% L
- {
" _+ Y' y, O1 h# G - // LED_Display(RxData[0]);
- g x- K- }: t4 N# p F) m - // ubKeyNumber = RxData[0];
2 F8 a6 c+ ?) z5 x! F( H. ` - HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);) _! L; _# }0 Q; R
- // Rx_Flag=1;) t+ E' Y! @ L' A$ ? t$ U
- }; B2 F o* K. d* l1 W O* a, ~4 a: i4 {
- }3 d8 O# d0 b* z7 g1 p
- }
复制代码 在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
|