最近工作有点忙,板卡的学习和测试稍有延迟。这次主要来测试该板卡的FDCAN功能。从datasheet上可以看到H503是有一个FDCAN接口的。这个总线通信接口当前用的比较多,所以需要好好学习和测试。现在FDCAN支持8Mbps,以前采购的芯片最高支持到5Mbps。 又把原来测试IC的部分翻出来,按照Power和Rx,Tx将MCU板卡和通讯部分进行连接,如图1所示:2 y5 r0 X; t7 U2 y5 T
' U+ R6 Z/ e. m6 q" _
图1
3 \! s- w2 s: _) _ 主要用到PB12--CANRx,和PB13--CANTx两个FDCAN1接口,从板图上可以看到接口位置,如图2所示:1 i, j6 x' y+ }
B2 s) Y0 N+ v9 R6 C7 k# B
图26 B& v+ s! v% L. o
& k( V! z/ U5 H5 R5 T
好了,言归正传。下载的官方资料里并没有这部分的例程,所以测试思路基本还是先用Cubemx生成基本配置,其他接收滤波配置和发送配置再自己添加。H503是支持250MHz主频的。所以FDCAN的时钟也配置位250MHz,如图3所示:
! o# ^: O/ Q8 B$ g! h
) [# O4 |" u( m- l
图3
3 J/ B$ G% D/ k
" z+ h, ?9 E F# S FDCAN部分采用正常波特率位1Mbps,数据波特率位2Mbps。其基本配置如图4所示:# f! [6 S. @: E* d0 b' Q. a* a y7 c% C
( a2 W. n! ~; u3 {+ Q
图4% Q0 J, J: [: V% C% N3 B
正常生成代码后,添加接收部分设置和发送部分设置,参考代码如下所示:1 q2 ^/ P% Q% c- V: |' U. ]
- FDCAN_FilterTypeDef sFilterConfig;
* K* Z T# x. ?2 s3 X4 v% ? - 5 F. W3 R4 a6 A1 E$ O
- /* Configure Rx filter */
4 S% D' Y% A) ^ - sFilterConfig.IdType = FDCAN_STANDARD_ID;9 `+ t) `3 z+ {: K( B5 m
- sFilterConfig.FilterIndex = 0;; w2 _: B& Z) S8 N; ~0 v
- sFilterConfig.FilterType = FDCAN_FILTER_MASK;
( [5 ~! l5 `* h. a4 u0 b5 L# ] - sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;. d5 n) A( P) S/ z H0 K
- sFilterConfig.FilterID1 = 0x123;//receive ID5 ~! D5 a$ E6 C4 J8 M7 X, U. P
- sFilterConfig.FilterID2 = 0x7FF;( V6 \4 k* l& _+ x% A G: J) t
- if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
* Z4 C0 Y, H# d" Z5 F5 m5 [$ r - {
/ Y6 W( F( u/ [8 s - Error_Handler();
! k; o! w) `! x2 y- d - }
* S8 d1 t4 P3 Y# J4 u2 }0 | - ) ?* Z1 t. V) C) H0 l6 D: s
- /* Configure global filter:0 R2 k+ u; K ^- y/ F, b2 R
- Filter all remote frames with STD and EXT ID
& b$ S- U8 Z$ h/ P- ] - Reject non matching frames with STD ID and EXT ID */
- e+ U# v% J) |3 n% p1 g) d4 n - if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)# E! ~) M. l2 R* W/ ` m" ?
- {
# Q& r! z$ v& ^ - Error_Handler();
: g( C/ m1 P1 p2 K; t - }# f8 F$ H$ G0 I5 q) r0 v
- $ q0 N' m6 p$ T% `, i
- /* Start the FDCAN module */4 |7 W7 ~' _" j, j+ ^' O6 C' I
- if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)4 y" \) \3 Z& p; `7 M- r {
- {- g2 F( C- V: a! C6 l) O# f
- Error_Handler();9 D- E4 u6 i& Q k7 L
- }
, ^: k, v3 T Z6 N# ?& P& _ - 3 n D9 t* ~6 S& T! d
- if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)2 W8 @7 S/ g9 x; c3 r3 T: o8 f
- {/ U8 Z# F* s; F
- Error_Handler();" R) j# y S3 Y2 s8 J5 k4 m- `# U
- }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData) != HAL_OK)
/ h) K3 ]0 { b - {
7 t5 Y6 V* t1 x2 {0 V - /* Transmission request Error */
: Q( w! Z% s' z - Error_Handler();' }7 ?% s4 l& @
- }0 K. \4 K& S, v, t6 _, b! \: B& K
- HAL_Delay(1000);
复制代码
! i% s7 P4 L: w% `. t
; W- n! M1 V/ ?1 b& Z, J
9 R) @$ D9 q) v+ o 上位机测试软件正常接收,如图5所示:) y0 V2 Q' W- q9 f7 f6 M
( p4 d3 ~# D- e
图55 A( E: B0 Z. w5 k4 U0 T$ k
但是接收中断没有执行,故接收callback函数也没有执行到。暂时还没找到事故原因,配置应该都是正常的。找到原因后,再补充这部分。. C- C5 n1 b7 N+ p# N
|
学习一下