最近工作有点忙,板卡的学习和测试稍有延迟。这次主要来测试该板卡的FDCAN功能。从datasheet上可以看到H503是有一个FDCAN接口的。这个总线通信接口当前用的比较多,所以需要好好学习和测试。现在FDCAN支持8Mbps,以前采购的芯片最高支持到5Mbps。 又把原来测试IC的部分翻出来,按照Power和Rx,Tx将MCU板卡和通讯部分进行连接,如图1所示:. K3 T6 r5 b( c9 r- j5 R
; L; {9 ]8 ^, y7 E& | v, U
图1
! \4 o o- F3 y) v' \+ c 主要用到PB12--CANRx,和PB13--CANTx两个FDCAN1接口,从板图上可以看到接口位置,如图2所示:* |+ m7 s' }$ Z
$ z% T. H- ]2 t8 ^3 r/ B. {/ g0 ^/ \图26 q, ], ]9 J5 a) M9 M- N7 C/ [
- O6 \3 ?4 |$ Y2 U0 J/ }" ~% }; s: A
好了,言归正传。下载的官方资料里并没有这部分的例程,所以测试思路基本还是先用Cubemx生成基本配置,其他接收滤波配置和发送配置再自己添加。H503是支持250MHz主频的。所以FDCAN的时钟也配置位250MHz,如图3所示:9 j/ A" \6 I0 \
) ?. R/ }6 f$ ~图3
]+ {% u4 `' K: n2 D- T% h2 m# _; O; ?! K1 D
FDCAN部分采用正常波特率位1Mbps,数据波特率位2Mbps。其基本配置如图4所示:2 j9 ] a# J0 b1 S
4 J G& G, ^* y6 y8 b4 }; O* l
图4* q9 h: S' I) i, N+ O8 g$ s
正常生成代码后,添加接收部分设置和发送部分设置,参考代码如下所示:
: ?4 I) o. J3 P1 _; g2 m$ d2 Q) w- FDCAN_FilterTypeDef sFilterConfig;" l4 B( W. P- M4 W) T8 i- J6 S
- . [! b% ]5 P) O3 c5 ^% \
- /* Configure Rx filter */
9 g' z) ?4 H, }) [# x, j% J. j& r - sFilterConfig.IdType = FDCAN_STANDARD_ID;
4 o) O n$ M E3 m, [. f+ N - sFilterConfig.FilterIndex = 0;8 F* h8 H) t5 ~3 ~7 R9 _
- sFilterConfig.FilterType = FDCAN_FILTER_MASK;
3 X5 C: b% ]5 Q+ ~" T - sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;& g4 J8 ?+ k7 C* s' y9 ~
- sFilterConfig.FilterID1 = 0x123;//receive ID
# I x! f9 U7 q! T - sFilterConfig.FilterID2 = 0x7FF;
& h6 e: a. R3 O# b0 n2 U - if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)$ q, E- y4 w- V* P
- {5 T( ]5 V0 Y) C) l1 g- |( c- y0 |
- Error_Handler();8 G4 ^) i( r5 Y% I2 L- K
- }" G9 w1 J' [% T& x
- 4 v0 `9 c2 L6 C5 B
- /* Configure global filter:
E4 |/ |" I O; C6 g - Filter all remote frames with STD and EXT ID
# X3 L1 H5 u8 s4 H - Reject non matching frames with STD ID and EXT ID */0 N5 j! {# Y: l" r4 d/ n/ A- @' m
- if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)% u, a' R. J0 {: o/ v. a
- {
4 C9 X S: t' T( K+ b+ J9 d - Error_Handler();/ S- H* t) I7 T5 ^
- }
1 K- a* Z; u$ {; F: g- {2 k
; }" m- g# K# E4 o- /* Start the FDCAN module */
/ N2 a5 Q3 U! s* q, u - if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)1 G# N5 p+ |& f5 Z
- {
, _" v( s' {! U6 w. ]* D: { m - Error_Handler();
& A8 J7 X( T- a - }
6 ^2 g( F, d/ y* B& K1 s - 5 y1 G' [! j% m' d& J
- if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
; t+ C' S8 [' y: J- y - {; R/ X1 `/ G( F" H
- Error_Handler();' m+ W) W2 I+ `1 {7 ~8 }: R* n
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData) != HAL_OK) A# x- ^0 h( e% K+ D- D- v6 e
- {
$ v# ~7 n: x2 r* N) g. s8 E1 ~0 V - /* Transmission request Error */% T$ `2 R& N) Y$ T" Z8 ?
- Error_Handler();
: [. y0 }" x. l; W u2 F& z - }
# N" F" U( ~ b5 L4 ^7 S - HAL_Delay(1000);
复制代码 ! ~! S# B1 E- r7 W1 l
& H5 {/ v; B: {- M& S( V2 W
$ _9 R( {% X* O 上位机测试软件正常接收,如图5所示:2 b6 a0 P: M& w! U. q% }
: K+ r/ ^) z0 h ^5 ?图52 F8 k$ L4 H) w: E o
但是接收中断没有执行,故接收callback函数也没有执行到。暂时还没找到事故原因,配置应该都是正常的。找到原因后,再补充这部分。
3 Y' F, N/ b" I/ Y |
学习一下