Controller Area Network library for NUCLEO boards equipped with CAN peripheral.

Dependents:   Nucleo-Courtois CANBLE CANnucleo_Hello3 Nucleo_Serialprintf ... more

Controller Area Network library for the NUCLEO and DISCOVERY boards equipped with CAN peripheral


Information

Because CAN support has been finally implemented into the mbed library also for the ST boards there is no need to use the CANnucleo library anymore (however you may if you want). The CAN_Hello example is trying to demonstrate the mbed built-in CAN API with NUCLEO boards.


Provides CAN support for the following boards:

with the following features:

  • Easy to use. Delete the mbed library from your project and import the latest mbed-dev and CANnucleo libraries. In the mbed-dev library open the device.h file associated with the selected target board and add #undef DEVICE_CAN as follows:

device.h

#ifndef MBED_DEVICE_H
#define MBED_DEVICE_H

//=======================================
#define DEVICE_ID_LENGTH       24

#undef DEVICE_CAN

#include "objects.h"

#endif

See the CANnucleo_Hello demo for more details.

  • Automatic recovery from bus-off state can be enabled/disabled in the constructor (defaults to ENABLE).
  • Up to 14 filters (0 - 13) are available for the application to set up for message filtering performed by hardware.
    For more details see below or have a look at the comments in CANnucleo.cpp.
  • One CAN channel per NUCLEO board is supported. The CAN peripheral can be connected either to pins PA_11, PA_12 (Receiver, Transmitter) or to pins PB_8, PB_9 (Receiver, Transmitter). This is configured when creating a CAN instance.
  • Simplifies adding/getting data to/from a CAN message by using the << (append) and the >> (extract) operators.

Import programCANnucleo_Hello

Using CAN bus with NUCLEO boards (Demo for the CANnucleo library).



Filtering performed by the built-in CAN controller without disturbing the CPU

CANnucleo supports only mask mode and 32-bit filter scale. Identifier list mode filtering and 16-bit filter scale are not supported. There are 14 filters available (0 - 13) for the application to set up. Each filter is a 32-bit filter defined by a filter ID and a filter mask. If no filter is set up then no CAN message is accepted! That's why filter #0 is set up in the constructor to accept all CAN messages by default. On reception of a message it is compared with filter #0. If there is a match, the message is accepted and stored. If there is no match, the incoming identifier is then compared with the next filter. If the received identifier does not match any of the identifiers configured in the filters, the message is discarded by hardware without disturbing the software.

CAN filter function - designed to setup a CAN filter

int CAN::filter(unsigned int id, unsigned int mask, CANFormat format, int handle)

Parameters

id - 'Filter ID' defines the bit values to be compared with the corresponding received bits.

Mapping of 32-bits (4-bytes) :

STID[10:3]STID[2:0] EXID[17:13]EXID[12:5]EXID[4:0] IDE RTR 0
  • STID - Stardard Identifier bits
  • EXID - Extended Identifier bits
  • [x:y]- bit range
  • IDE - Identifier Extension bit (0 -> Standard Identifier, 1 -> Extended Identifier)
  • RTR - Remote Transmission Request bit (0 -> Remote Transmission Request, 1 -> Standard message)

mask - 'Filter mask' defines which bits of the 'Filter ID' are compared with the received bits and which are disregarded.
Mapping of 32-bits (4-bytes) :

STID[10:3]STID[2:0] EXID[17:13]EXID[12:5]EXID[4:0] IDE RTR 0
  • STID - Stardard Identifier bits
  • EXID - Extended Identifier bits
  • [x:y]- bit range
  • IDE - Identifier Extension bit
  • RTR - Remote Transmission Request bit
  • 1 -> bit is considered
  • 0 -> bit is disregarded

format - This parameter must be CANAny
handle - Selects the filter. This parameter must be a number between 0 and 13.
retval - 0 - successful, 1 - error, 2 - busy, 3 - time out

Example of filter set up and filtering

Let's assume we would like to accept only messages with standard identifier 0x207:

STID[15:0] = 0x207 = 00000010 00000111


We map the STID to filter ID by shifting the bits adequately:

Filter ID = STID << (16 + (15 - 10)) = STID << 21 = 01000000 11100000 00000000 00000000


To compare only the bits representing STID we set the filter mask appropriately:

Filter mask = 11111111 11100000 00000000 00000100 = 0xFFE00004
              |||||||| |||                    |
              -------- ---                    |
                  |     |                     |
           STID[10:3]  STID[2:0]             IDE


Recall that filter #0 has been set up in the constructor to accept all CAN messages by default. So we have to reconfigure it. If we were set up filter #1 here then filter #0 would accept all the messages and no message would reach filter #1!
To reconfigure (set up) filter #0 we call:

can.filter(0x207 << 21, 0xFFE00004, CANAny, 0);


            Only these bits of 'Filter id' (set to 1 here in 'Filter mask') are compared 
            with the corresponding bits of received message (the others are disregarded)
                                |
                 ---------------------------------
                 |||||||| |||                    |
   Filter mask = 11111111 11100000 00000000 00000100 (= 0xFFE00004)
   Filter id   = 01000000 11100000 00000000 00000000 (= 0x40E00000)
                 |||||||| |||                    |
                 ---------------------------------
                                |
            To accept the message the values of these bits must match.
            Otherwise the message is passed to the next filter or
            discarded if this was the last active filter.
                                |
                 ---------------------------------
                 |||||||| |||                    |
   Received id = 01000000 11100000 00000000 00000010 (= 0x40E00002)
                             ||||| |||||||| ||||| ||
                             -----------------------
                                         |
                          These bits (set to 0 in 'Filter mask') are disregarded (masked).
                          They can have arbitrary values.


NOTE: For the meaning of individual bits see the mapping of 32-bits explained above.

We can use the filter function to setup more (up to 14) CAN filters for example as follows:

can.filter(0x207 << 21, 0xFFE00004, CANAny, 0);    // filter #0
can.filter(0x251 << 21, 0xFFE00004, CANAny, 1);    // filter #1
can.filter(0x304 << 21, 0xFFE00004, CANAny, 2);    // filter #2
...
Committer:
hudakz
Date:
Sun May 28 09:18:54 2017 +0000
Revision:
29:cebc6f21046e
Parent:
27:eed6929956ea
Updated.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 11:439f3a34c42e 1 /**
hudakz 11:439f3a34c42e 2 ******************************************************************************
hudakz 11:439f3a34c42e 3 * @attention
hudakz 11:439f3a34c42e 4 *
hudakz 11:439f3a34c42e 5 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
hudakz 11:439f3a34c42e 6 *
hudakz 11:439f3a34c42e 7 * Redistribution and use in source and binary forms, with or without modification,
hudakz 11:439f3a34c42e 8 * are permitted provided that the following conditions are met:
hudakz 11:439f3a34c42e 9 * 1. Redistributions of source code must retain the above copyright notice,
hudakz 11:439f3a34c42e 10 * this list of conditions and the following disclaimer.
hudakz 11:439f3a34c42e 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
hudakz 11:439f3a34c42e 12 * this list of conditions and the following disclaimer in the documentation
hudakz 11:439f3a34c42e 13 * and/or other materials provided with the distribution.
hudakz 11:439f3a34c42e 14 * 3. Neither the name of STMicroelectronics nor the names of its contributors
hudakz 11:439f3a34c42e 15 * may be used to endorse or promote products derived from this software
hudakz 11:439f3a34c42e 16 * without specific prior written permission.
hudakz 11:439f3a34c42e 17 *
hudakz 11:439f3a34c42e 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
hudakz 11:439f3a34c42e 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
hudakz 11:439f3a34c42e 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
hudakz 11:439f3a34c42e 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
hudakz 11:439f3a34c42e 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
hudakz 11:439f3a34c42e 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
hudakz 11:439f3a34c42e 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
hudakz 11:439f3a34c42e 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
hudakz 11:439f3a34c42e 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
hudakz 11:439f3a34c42e 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
hudakz 11:439f3a34c42e 28 *
hudakz 11:439f3a34c42e 29 ******************************************************************************
hudakz 11:439f3a34c42e 30 *
hudakz 27:eed6929956ea 31 * Modified by Zoltan Hudak <hudakz@outlook.com>
hudakz 11:439f3a34c42e 32 *
hudakz 11:439f3a34c42e 33 ******************************************************************************
hudakz 11:439f3a34c42e 34 */
hudakz 11:439f3a34c42e 35
hudakz 11:439f3a34c42e 36 #ifndef stm32f3xx_hal_H
hudakz 11:439f3a34c42e 37 #define stm32f3xx_hal_H
hudakz 11:439f3a34c42e 38
hudakz 19:249e3f065956 39 #define CAN_IRQ USB_LP_CAN_RX0_IRQn
hudakz 14:0344705e6fb8 40
hudakz 11:439f3a34c42e 41 #include "pinmap.h"
hudakz 11:439f3a34c42e 42
hudakz 11:439f3a34c42e 43 #ifdef __cplusplus
hudakz 11:439f3a34c42e 44 extern "C"
hudakz 11:439f3a34c42e 45 {
hudakz 11:439f3a34c42e 46 #endif
hudakz 11:439f3a34c42e 47
hudakz 11:439f3a34c42e 48 /**
hudakz 11:439f3a34c42e 49 * @brief CAN initialization.
hudakz 11:439f3a34c42e 50 * @param obj: can_t object
hudakz 11:439f3a34c42e 51 * @param rxPin: RX pin name
hudakz 11:439f3a34c42e 52 * @param txPin: TX pin name
hudakz 11:439f3a34c42e 53 * @param abom: Automatic recovery from bus-off state
hudakz 11:439f3a34c42e 54 * @retval None
hudakz 11:439f3a34c42e 55 */
hudakz 20:bcd8161f8f6c 56 void initCAN(PinName rxPin, PinName txPin, FunctionalState abom);
hudakz 11:439f3a34c42e 57
hudakz 11:439f3a34c42e 58 /**
hudakz 11:439f3a34c42e 59 * @brief CAN MSP Initialization
hudakz 11:439f3a34c42e 60 * @param hcan: CAN handle pointer
hudakz 11:439f3a34c42e 61 * @retval None
hudakz 11:439f3a34c42e 62 */
hudakz 11:439f3a34c42e 63 void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan);
hudakz 11:439f3a34c42e 64
hudakz 11:439f3a34c42e 65 /**
hudakz 11:439f3a34c42e 66 * @brief CAN MSP De-Initialization
hudakz 11:439f3a34c42e 67 * This function frees the hardware resources used:
hudakz 11:439f3a34c42e 68 * - Disable the Peripheral's clock
hudakz 11:439f3a34c42e 69 * - Revert GPIO to their default state
hudakz 11:439f3a34c42e 70 * @param hcan: CAN handle pointer
hudakz 11:439f3a34c42e 71 * @retval None
hudakz 11:439f3a34c42e 72 */
hudakz 11:439f3a34c42e 73 void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan);
hudakz 11:439f3a34c42e 74
hudakz 11:439f3a34c42e 75 /**
hudakz 11:439f3a34c42e 76 * @brief Handles CAN1 RX0 interrupt request.
hudakz 11:439f3a34c42e 77 * @param None
hudakz 11:439f3a34c42e 78 * @retval None
hudakz 11:439f3a34c42e 79 */
hudakz 11:439f3a34c42e 80 void USB_LP_CAN_RX0_IRQHandler(void);
hudakz 11:439f3a34c42e 81
hudakz 11:439f3a34c42e 82 /**
hudakz 11:439f3a34c42e 83 * @brief Transmission complete callback in non blocking mode
hudakz 11:439f3a34c42e 84 * @param _canHandle: pointer to a CAN_HandleTypeDef structure that contains
hudakz 11:439f3a34c42e 85 * the configuration information for the specified CAN.
hudakz 11:439f3a34c42e 86 * @retval None
hudakz 11:439f3a34c42e 87 */
hudakz 11:439f3a34c42e 88 void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* _canHandle);
hudakz 11:439f3a34c42e 89
hudakz 11:439f3a34c42e 90 #ifdef __cplusplus
hudakz 11:439f3a34c42e 91 }
hudakz 11:439f3a34c42e 92
hudakz 11:439f3a34c42e 93 #endif
hudakz 11:439f3a34c42e 94
hudakz 20:bcd8161f8f6c 95 #endif
hudakz 27:eed6929956ea 96