最近工作有点忙,板卡的学习和测试稍有延迟。这次主要来测试该板卡的FDCAN功能。从datasheet上可以看到H503是有一个FDCAN接口的。这个总线通信接口当前用的比较多,所以需要好好学习和测试。现在FDCAN支持8Mbps,以前采购的芯片最高支持到5Mbps。 又把原来测试IC的部分翻出来,按照Power和Rx,Tx将MCU板卡和通讯部分进行连接,如图1所示:
# p5 s; d3 s: K8 D$ ^( {- Z
5 _: F* @2 N( l' x6 O9 r% [& g
图1
' X+ E0 Y- |/ @0 N3 } 主要用到PB12--CANRx,和PB13--CANTx两个FDCAN1接口,从板图上可以看到接口位置,如图2所示:
! M Q7 L6 k, L- j3 k# o
" l8 L3 f" K, o2 N2 R7 A$ C" V7 ?$ H图2
1 R: a/ D5 l( A3 g1 W) e) g6 x0 x) \: m
好了,言归正传。下载的官方资料里并没有这部分的例程,所以测试思路基本还是先用Cubemx生成基本配置,其他接收滤波配置和发送配置再自己添加。H503是支持250MHz主频的。所以FDCAN的时钟也配置位250MHz,如图3所示:
) [+ N' _# _. ^' i7 Q
' ^' p" D6 i5 G* L图3' j. \. L! b: v, u9 v; s# U
( C% z; D( U. F3 j R FDCAN部分采用正常波特率位1Mbps,数据波特率位2Mbps。其基本配置如图4所示:9 g9 P9 p0 B( T( j% |! N
. p( _; o0 Z' Y; n
图4
4 j* R) `/ @( e4 f f/ I 正常生成代码后,添加接收部分设置和发送部分设置,参考代码如下所示:
5 W9 R" @( D$ f; p- FDCAN_FilterTypeDef sFilterConfig;& J6 p9 e" I+ s% f) l
- 4 W+ S. w8 Z8 _
- /* Configure Rx filter */
- Q: n! R( S$ d5 w1 m1 b' G! c/ S - sFilterConfig.IdType = FDCAN_STANDARD_ID;4 B$ S# S. U0 o. j, A9 q" }+ c
- sFilterConfig.FilterIndex = 0;
8 `0 o3 q. \& }! l) I4 { - sFilterConfig.FilterType = FDCAN_FILTER_MASK;8 w! d2 n/ s% p* m5 M' k
- sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;( r6 O: V& }( o0 n: P
- sFilterConfig.FilterID1 = 0x123;//receive ID
6 m% U! v+ f. v! o: g+ p9 S1 ] - sFilterConfig.FilterID2 = 0x7FF;
! h0 v2 f" k$ h l - if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK), A$ z0 q0 K7 T1 X9 M! T. T7 \
- {
+ a; c, I. C) J/ c3 R. w" @" c - Error_Handler();) p/ q4 M0 H3 Z% f9 E
- }
* D7 @" N# _$ K4 S3 n7 v" @& z - 0 r* a$ i2 Z# }$ Y0 V5 F, z
- /* Configure global filter:
/ E' K1 j2 |2 W, d - Filter all remote frames with STD and EXT ID
. x' N- q. A6 B7 U6 o3 ` - Reject non matching frames with STD ID and EXT ID */
0 k! h9 D; D8 G! J0 h - if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)8 F8 D8 P2 Q3 e
- {0 V! i4 l3 `, X8 I/ x
- Error_Handler();0 H* c& v, R% ]# _ J
- }
5 Q6 W- F: g4 b5 v, [9 ?# R
. u! g% M+ [! }0 n- /* Start the FDCAN module */
5 |8 I; @. Q" h- U6 t; t- q# G* | - if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)1 d3 |$ |* y/ F! N) T
- {
" c9 Z/ Y' N! U f6 D3 ? - Error_Handler();8 H c6 A9 J# D. K9 w% [) G
- }
; j4 m1 S+ J/ b5 s
4 B, i. g+ \+ P4 |7 p" w' n/ m* y- if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
; \8 u4 N* k! H$ u- n - {
4 P( ~# j5 k: K. w4 \( G - Error_Handler();
1 I2 x6 `3 F6 e( @' O2 N - }
复制代码- if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData) != HAL_OK)* r$ d* D2 r1 ?" e5 J
- {
; Q Z$ x0 y9 B8 C' Q. T - /* Transmission request Error */" r/ ?8 a" S4 a3 J' c
- Error_Handler();
- ~1 L+ G' T# u" e - }
& A5 s5 q" P- O) { - HAL_Delay(1000);
复制代码
: n3 z" Y2 G0 [' l5 j8 q3 L' f! j; J0 S s
8 S# _8 B+ t1 [9 O, q 上位机测试软件正常接收,如图5所示:
2 X" e! V, l9 p! w
9 ]) Z" a1 F7 I7 t* [6 v图5
! D! p+ L1 f& w0 ]! D9 Q 但是接收中断没有执行,故接收callback函数也没有执行到。暂时还没找到事故原因,配置应该都是正常的。找到原因后,再补充这部分。
; @' [9 S8 N, `7 B/ `5 Q% B/ H |
学习一下