4 A p4 G' i1 D8 v1 F 从电路上看起来也很简单,stm32也是通过can tx、rx两根线和收发器相连。所以假如我们要测试can的发送,是不是只接can tx脚就可以了? 我最开始也以为这样就可以,但是深究can的总线冲突检测原理就会发现这样行不通的。因为can 在发送数据的时候也会同时接收发送的数据,通过把接收的数据和内部发送寄存器的数据做对比,是不是一致就知道总线有没有冲突。所以在正常情况(这里意味着非正常情况下也可以)下can rx不接就到这发送出去的数据无法收到从而硬件自动判断为发送失败。 : L; I1 l- i p0 x0 |4 p所以要保证发送数据成功,can tx脚和can rx脚要都接上,并且确保can收发器供电正常。 & R0 D& ~3 D9 y6 T硬件上就这些主要注意点,接下来就主要是软件的配置了。 3 `& S" B/ X% o- C+ ~3 y/ H4 a- B. f一般stm32 配置can有以下几大步骤: 4 e5 C6 ~8 y0 q
5 K L: y- z% f1 S7 {. L: b 如上图所示,最关键主要配置如下三个参数,分频数我这里配置48,下面的time Quantum值就会自动计算出来。因为can时钟是48mhz经过48分频后,一个单位时间就是1us=1000ns。 # [5 l. e: |4 b" C) [4 ?因为我想要100k波特率,然后填写下面的Time segment1(简称 Tbs1 )和Time segment2 (简称 Tbs2) 为5和4。那么具体波特率该怎么计算还是要看看官方手册的描述: ! M) M8 P* ?* R+ j8 s; u/ S7 _, q 根据如上描述,能决定波特率的也就是三个参数:分频值、Tbs1、Tbs2。需要注意的是,这个SYNC_SEG的1tq是固定值。和stm32cubemx中的jump width不要弄混淆了。jump width这个时间参数是作为补偿时间的上线,当时间有偏差的时候,就会自动补偿,最长时间不能超过该参数设定值。 0 X# | y# V* j8 k6 D: w* S: f配置完以后就可以生成MDK工程了。 通过stm32cubemx生成的工程就已经配置好了can参数,我们直接调用一条语句就可以启动can。 HAL_CAN_Start(&hcan);' a4 d6 i. M* o3 [ 8 B3 N- K2 Y) O) r u. @- | 第三步:发送数据$ K, n# I5 W' \- Y can数据和串口数据不同,你写0x55就发送0x55。而can的数据都是以包为单位的,所以要发送数据我们就要填充包,在程序里面就是填充结构体,填充完以后进行发送请求。 CAN_TxHeaderTypeDef TxHeader; uint8_t TxData[8]="12345678"; uint32_t TxMailbox;TxHeader.StdId = 0x321; TxHeader.RTR = CAN_RTR_DATA;TxHeader.IDE = CAN_ID_STD; TxHeader.DLC = 8; TxHeader.TransmitGlobalTime = DISABLE;2 F1 | H6 y; D if(HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox)==HAL_OK)( _, v9 X2 M! Z6 c- R6 P6 ~ {( m" b! j" M. o1 V+ V HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);- K/ _0 v T' o, i6 P5 M1 f0 r } 5 Q5 W) I( w4 D0 M9 f 如果硬件没问题,这时候通过can总线就可以接收到发送的数据。(这个要通过pc接收就需要一个usb can接收的硬件工具)。 莫慌,还没完……3 y4 ~3 J% [5 O3 d+ I记不记得在前面,我们提到过在正常情况下can rx和can tx引脚都需要连接到can 收发器。那么实际上stm32 除了正常模式还有几种特殊模式: 0 ~3 w+ F9 L5 y- b
% x- L" y8 R8 I5 q% L 通过上图可以很容易明白这几种模式区别: 0 @* p# G' j2 ]7 r3 u- d T& _正常模式:内部的tx和外部TX引脚相连,内部rx和外部RX引脚相连;内部rx和tx是不相连的。 静音模式:can可以接收外部的数据但是发送不出去,同时内部tx和rx相通 8 D" i$ f: U4 Q5 W回环模式:can可以发送出去数据但是接收不到外部的数据,同时内核tx和rx相通 所以在回环模式下就可以实现CAN RX引脚不接收发器也能发送出来数据。 0 F+ @; f4 \! i* v" O |