最近工作有点忙,板卡的学习和测试稍有延迟。这次主要来测试该板卡的FDCAN功能。从datasheet上可以看到H503是有一个FDCAN接口的。这个总线通信接口当前用的比较多,所以需要好好学习和测试。现在FDCAN支持8Mbps,以前采购的芯片最高支持到5Mbps。 又把原来测试IC的部分翻出来,按照Power和Rx,Tx将MCU板卡和通讯部分进行连接,如图1所示:$ r4 v) f9 y3 f: x8 X- R
% I; f& Y# A7 L1 _" N图1" c/ L7 `1 l$ g9 h8 z
主要用到PB12--CANRx,和PB13--CANTx两个FDCAN1接口,从板图上可以看到接口位置,如图2所示:
( k! s& M$ w& a5 r3 e* n2 ]* a) D
' j3 w- y- [# P- n2 r, z图27 R0 O1 S3 |5 q6 n
: ?: r# f7 E9 K5 [! I( u# T0 M
好了,言归正传。下载的官方资料里并没有这部分的例程,所以测试思路基本还是先用Cubemx生成基本配置,其他接收滤波配置和发送配置再自己添加。H503是支持250MHz主频的。所以FDCAN的时钟也配置位250MHz,如图3所示:! _. |& m5 n9 x( a5 P' O0 o. P
/ ^1 _5 p: a8 M3 n* u- l图34 ^/ c4 s; x9 W2 X
& f, T, L/ P5 F- F
FDCAN部分采用正常波特率位1Mbps,数据波特率位2Mbps。其基本配置如图4所示:
5 ^7 O- x5 y5 e( w5 X
4 d& t. s6 `3 x图44 H+ Y- _" b4 {+ W) V
正常生成代码后,添加接收部分设置和发送部分设置,参考代码如下所示:+ c' m' A, N8 a9 U% b. ~
- FDCAN_FilterTypeDef sFilterConfig;/ r$ i* K" y' z" n' U* u/ V
/ }! L/ V5 _% j2 r# R- ~8 v- /* Configure Rx filter */
7 |, \* J' E* X& Z0 e, C4 e' q - sFilterConfig.IdType = FDCAN_STANDARD_ID;' B0 F4 a5 b5 ]1 r' B: u
- sFilterConfig.FilterIndex = 0;
" j# \: K: q$ t* j6 ~ - sFilterConfig.FilterType = FDCAN_FILTER_MASK;
( v0 H K4 ^* V* S& W) I! g - sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
! _/ w, w6 D6 M) |. n& d - sFilterConfig.FilterID1 = 0x123;//receive ID
9 q- }5 X8 Y( ]5 A6 I - sFilterConfig.FilterID2 = 0x7FF;' S. H! `: E: Z0 v( |
- if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)0 f, K# I K( T4 S# A
- {
7 W; D1 o' |) ~% g - Error_Handler();
6 S7 G& A8 C: v0 A/ \; D/ F - }
0 J' { q- G0 r! |4 m - 8 S3 U, |% Q, l
- /* Configure global filter:& ]$ X% z, q; s6 ^( k3 H9 w+ @' n
- Filter all remote frames with STD and EXT ID
% M0 ^ B3 @+ R+ S - Reject non matching frames with STD ID and EXT ID */
% S, Q) q+ v# u: Q# N$ p - if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK); \5 j/ w% ^5 w
- {
! o) F4 k% B0 t - Error_Handler();& R; b3 d2 f' q8 I% G
- }
! t; P* d7 \5 e7 h0 c - : c, q/ i( l8 N7 C) l; z2 E+ J
- /* Start the FDCAN module */, L. m z8 [& H
- if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
; I) y1 D& N) m5 H$ V7 m - {3 C5 k, A1 ]9 r6 H7 @; x- H* S0 i
- Error_Handler();( j0 p+ r( t! o/ A/ s, C
- }5 q2 w# d" K: ]7 ~0 R0 ?9 v
- P5 ?2 X, I, t# L
- if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
- d8 d9 q- d3 |3 Z - {% a4 T$ L+ u# B9 \# w) Q
- Error_Handler();/ ], `. l' A' o
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData) != HAL_OK); R/ j F( H( o3 z& O4 |+ E
- {
e: E9 _- S( d2 C - /* Transmission request Error */# B; J# G2 j0 J5 X( v
- Error_Handler();
, r- t. [. \ D& @& { - }& Y0 {0 z3 x x, w$ T7 q: E
- HAL_Delay(1000);
复制代码
% q) e! q S& I: I$ p
- U# e; Q: ]' j: ~9 a7 ]
& i# g% g8 P- e+ b& q 上位机测试软件正常接收,如图5所示:
. Q& b T7 D7 r4 S! S% b) R7 ^
' |% ] t) g9 }& [4 G" b8 o( I
图5' n5 e: G+ c* K, m& U1 N# @* h
但是接收中断没有执行,故接收callback函数也没有执行到。暂时还没找到事故原因,配置应该都是正常的。找到原因后,再补充这部分。
1 F/ Q8 e; \8 x |
学习一下