最近工作有点忙,板卡的学习和测试稍有延迟。这次主要来测试该板卡的FDCAN功能。从datasheet上可以看到H503是有一个FDCAN接口的。这个总线通信接口当前用的比较多,所以需要好好学习和测试。现在FDCAN支持8Mbps,以前采购的芯片最高支持到5Mbps。 又把原来测试IC的部分翻出来,按照Power和Rx,Tx将MCU板卡和通讯部分进行连接,如图1所示:
s0 Q8 U [$ T& G& N" k' `8 U
. ]. d: w7 T, l
图19 l6 Z+ n/ L& O& g9 k2 m
主要用到PB12--CANRx,和PB13--CANTx两个FDCAN1接口,从板图上可以看到接口位置,如图2所示:9 ~( G$ F9 {% `2 I) @& G
. L% o* z6 o0 b5 @$ A图2. v/ `1 z# i3 [
1 s' @0 L+ n7 y- _8 m+ s [ 好了,言归正传。下载的官方资料里并没有这部分的例程,所以测试思路基本还是先用Cubemx生成基本配置,其他接收滤波配置和发送配置再自己添加。H503是支持250MHz主频的。所以FDCAN的时钟也配置位250MHz,如图3所示:! C" p& t9 {/ Y9 ^7 x! L
) v; R' X2 x! U$ v& O& e, o
图3
0 I: ~0 H9 N2 S1 M
! [8 {7 h7 a& a FDCAN部分采用正常波特率位1Mbps,数据波特率位2Mbps。其基本配置如图4所示:
9 Z( {# s# S1 j3 s
4 K9 m( v* G6 V$ v0 h& x5 B
图4
9 J* A2 W& A( T 正常生成代码后,添加接收部分设置和发送部分设置,参考代码如下所示:
& v- \9 l! l/ e- b% j& D3 h- FDCAN_FilterTypeDef sFilterConfig;. p0 {: J+ T, v+ F- B6 k
- ! E' W6 q- U$ o
- /* Configure Rx filter */
7 D5 c. _7 e; k - sFilterConfig.IdType = FDCAN_STANDARD_ID;: Q' }$ f( R0 ~( _$ E4 }
- sFilterConfig.FilterIndex = 0;" _- O$ a% Q/ H9 ^2 {3 m
- sFilterConfig.FilterType = FDCAN_FILTER_MASK;
& f; |: Y2 Q ~& s5 h - sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;- `/ c* h& x; n' @, w- f" t$ @
- sFilterConfig.FilterID1 = 0x123;//receive ID
; P. W9 O7 |. f- ?) M - sFilterConfig.FilterID2 = 0x7FF;
0 Z' x5 R" G) n" F. @ - if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
6 {3 n' A% z0 f! D7 c* g7 W - {
! z' S: R4 F& z4 N4 s2 b - Error_Handler();. Q* P8 @6 x3 @# n
- }3 H1 V. g! x) A( z0 u9 e3 o5 q
& ~% x# \6 L5 F) `1 C- /* Configure global filter:$ X- g2 Q& v9 m8 Q, T- s; X$ R+ D
- Filter all remote frames with STD and EXT ID
; P' c9 g7 p8 h1 m - Reject non matching frames with STD ID and EXT ID */9 E6 p7 S5 h1 S0 [7 _6 M
- if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
8 B8 `& ^9 k3 Z' f - {
) u/ Z( z0 B; _- S - Error_Handler(); t$ U B- ~- ]$ C9 m
- }$ C* ~( w/ K0 s2 ]$ [4 c- ^
/ D. N) s7 Y6 ?- /* Start the FDCAN module */- M' W7 r9 g/ p4 o- k3 u3 k
- if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
/ x% i2 ~* m& E' A- w2 k- X% L' F - {
* E5 Y/ H; }9 |3 o* ^: P - Error_Handler();" O! f! ?' D6 @& q0 e/ w* t3 y6 o8 m
- }
- n6 r) x' a5 c/ @* g
% Q* u0 t7 E% l' K$ w7 u- if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
* q# F9 A- L% x; }! t* c g - {. a% L. p+ Z# {7 H# L W7 m& g, n
- Error_Handler();* f' \9 p! m' n% f
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData) != HAL_OK)4 D6 n. V" H# ~/ x; U
- {
' i7 c$ x* {7 v* C - /* Transmission request Error */
) Z$ B" R9 F T% K, I: U: Y, w - Error_Handler();1 R& f% [* T' L. D' b
- }4 w' P9 v; u2 l! \( V9 Q( T8 B% E
- HAL_Delay(1000);
复制代码
/ N# [6 H: K! X8 H8 f1 E) j8 ~- W- Y6 e$ Y( H$ n
; |$ Q* C* B7 V7 D* W' Y 上位机测试软件正常接收,如图5所示:. r, ]- |- R# J/ d' R8 `8 Q
- W8 C6 V6 C: Z, Y" n
图55 T2 y- P6 n9 ~
但是接收中断没有执行,故接收callback函数也没有执行到。暂时还没找到事故原因,配置应该都是正常的。找到原因后,再补充这部分。
" k" n5 O: ~" Z" }% `/ V |
学习一下