CAN - Controller Area Network
Description
Controller Area Network API.
The Controller Area Network Interface Bus (CAN) implements a multi-master serial bus for connecting microcontrollers and devices, also known as nodes, to communicate with each other in applications without a host computer. CAN is a message-based protocol, designed originally for automotive applications, but also used in many other scenarios. The complexity of a node can range from a simple I/O device up to an embedded computer with a CAN interface and sophisticated software. The node may also be a gateway allowing a standard computer to communicate over a USB or Ethernet port to the devices on a CAN network. Devices are connected to the bus through a host processor, a CAN controller, and a CAN transceiver.
Data Structures |
|
| struct | CAN_MessageObject_TypeDef |
|
CAN Message Object TypeDef structure.
|
|
| struct | CAN_Init_TypeDef |
|
CAN initialization structure.
|
|
Functions |
|
| void | CAN_Init (CAN_TypeDef *can, const CAN_Init_TypeDef *init) |
|
Initialize CAN.
|
|
| uint32_t | CAN_GetClockFrequency (CAN_TypeDef *can) |
|
Get the CAN module frequency.
|
|
| bool | CAN_MessageLost (CAN_TypeDef *can, uint8_t interface, uint8_t msgNum) |
|
Read a Message Object to find if a message was lost ; reset the 'Message Lost' flag.
|
|
| void | CAN_SetRoute (CAN_TypeDef *can, bool active, uint16_t pinRxLoc, uint16_t pinTxLoc) |
|
Set the ROUTE registers.
|
|
| void | CAN_SetBitTiming (CAN_TypeDef *can, uint32_t bitrate, uint16_t propagationTimeSegment, uint16_t phaseBufferSegment1, uint16_t phaseBufferSegment2, uint16_t synchronisationJumpWidth) |
|
Set the bitrate and its parameters.
|
|
| void | CAN_SetMode (CAN_TypeDef *can, CAN_Mode_TypeDef mode) |
|
Set the CAN operation mode.
|
|
| void | CAN_SetIdAndFilter (CAN_TypeDef *can, uint8_t interface, bool useMask, const CAN_MessageObject_TypeDef *message, bool wait) |
|
Set the ID and the filter for a specific Message Object.
|
|
| void | CAN_ConfigureMessageObject (CAN_TypeDef *can, uint8_t interface, uint8_t msgNum, bool valid, bool tx, bool remoteTransfer, bool endOfBuffer, bool wait) |
|
Configure valid, TX/RX, remoteTransfer for a specific Message Object.
|
|
| void | CAN_SendMessage (CAN_TypeDef *can, uint8_t interface, const CAN_MessageObject_TypeDef *message, bool wait) |
|
Send data from the Message Object message.
|
|
| bool | CAN_ReadMessage (CAN_TypeDef *can, uint8_t interface, CAN_MessageObject_TypeDef *message) |
|
Read data and ID from a Message Object in RAM and store it in a message.
|
|
| void | CAN_AbortSendMessage (CAN_TypeDef *can, uint8_t interface, uint8_t msgNum, bool wait) |
|
Abort sending a message.
|
|
| void | CAN_ResetMessages (CAN_TypeDef *can, uint8_t interface) |
|
Reset all Message Objects and set their data to 0.
|
|
| void | CAN_Reset (CAN_TypeDef *can) |
|
Set all CAN registers to RESETVALUE.
|
|
| void | CAN_WriteData (CAN_TypeDef *can, uint8_t interface, const CAN_MessageObject_TypeDef *message) |
|
Write data from a message to the MIRx registers.
|
|
| void | CAN_SendRequest (CAN_TypeDef *can, uint8_t interface, uint8_t msgNum, bool wait) |
|
Send a request for writing or reading RAM of the Message Object msgNum.
|
|
| void | CAN_Enable (CAN_TypeDef *can, bool enable) |
|
Enable the Host Controller to send messages.
|
|
| bool | CAN_IsEnabled (CAN_TypeDef *can) |
|
Give the communication capabilities state.
|
|
| void | CAN_ReadyWait (CAN_TypeDef *can, uint8_t interface) |
|
Waiting function.
|
|
| CAN_ErrorCode_TypeDef | CAN_GetLastErrorCode (CAN_TypeDef *can) |
|
Get the last error code and clear its register.
|
|
| uint32_t | CAN_HasNewdata (CAN_TypeDef *can) |
|
Indicates which message objects have received new data.
|
|
| void | CAN_StatusIntClear (CAN_TypeDef *can, uint32_t flags) |
|
Clear one or more pending CAN status interrupts.
|
|
| void | CAN_StatusIntDisable (CAN_TypeDef *can, uint32_t flags) |
|
Disable CAN status interrupts.
|
|
| void | CAN_StatusIntEnable (CAN_TypeDef *can, uint32_t flags) |
|
Enable CAN status interrupts.
|
|
| uint32_t | CAN_StatusIntGet (CAN_TypeDef *can) |
|
Get pending CAN status interrupt flags.
|
|
| uint32_t | CAN_StatusIntGetEnabled (CAN_TypeDef *can) |
|
Get pending and enabled CAN status interrupt flags.
|
|
| void | CAN_StatusIntSet (CAN_TypeDef *can, uint32_t flags) |
|
Set one or more CAN status interrupts.
|
|
| uint32_t | CAN_StatusGet (CAN_TypeDef *can) |
|
Get CAN status.
|
|
| void | CAN_StatusClear (CAN_TypeDef *can, uint32_t flags) |
|
Clear CAN status.
|
|
| uint32_t | CAN_GetErrorCount (CAN_TypeDef *can) |
|
Get the error count.
|
|
| void | CAN_MessageIntClear (CAN_TypeDef *can, uint32_t flags) |
|
Clear one or more pending CAN message interrupts.
|
|
| void | CAN_MessageIntDisable (CAN_TypeDef *can, uint32_t flags) |
|
Disable CAN message interrupts.
|
|
| void | CAN_MessageIntEnable (CAN_TypeDef *can, uint32_t flags) |
|
Enable CAN message interrupts.
|
|
| uint32_t | CAN_MessageIntGet (CAN_TypeDef *can) |
|
Get pending CAN message interrupt flags.
|
|
| uint32_t | CAN_MessageIntGetEnabled (CAN_TypeDef *can) |
|
Get CAN message interrupt flags that are pending and enabled.
|
|
| void | CAN_MessageIntSet (CAN_TypeDef *can, uint32_t flags) |
|
Set one or more CAN message interrupts.
|
|
Macros |
|
| #define | CAN_INIT_DEFAULT |
|
Default initialization of
CAN_Init_TypeDef
.
|
|
Enumerations |
|
| enum |
CAN_ErrorCode_TypeDef
{
canErrorNoError = CAN_STATUS_LEC_NONE, canErrorStuff = CAN_STATUS_LEC_STUFF, canErrorForm = CAN_STATUS_LEC_FORM, canErrorAck = CAN_STATUS_LEC_ACK, canErrorBit1 = CAN_STATUS_LEC_BIT1, canErrorBit0 = CAN_STATUS_LEC_BIT0, canErrorCrc = CAN_STATUS_LEC_CRC, canErrorUnused = CAN_STATUS_LEC_UNUSED } |
|
CAN Status codes.
|
|
| enum |
CAN_Mode_TypeDef
{
canModeNormal , canModeBasic , canModeLoopBack , canModeSilentLoopBack , canModeSilent } |
|
CAN peripheral mode.
|
|
Function Documentation
◆ CAN_Init()
| void CAN_Init | ( | CAN_TypeDef * |
can,
|
| const CAN_Init_TypeDef * |
init
|
||
| ) |
Initialize CAN.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] initA pointer to the CAN initialization structure.
◆ CAN_GetClockFrequency()
| uint32_t CAN_GetClockFrequency | ( | CAN_TypeDef * |
can
|
) |
Get the CAN module frequency.
An internal prescaler of 2 is inside the CAN module.
- Parameters
-
[in] canA pointer to the CAN peripheral register block.
- Returns
- A clock value.
◆ CAN_MessageLost()
| bool CAN_MessageLost | ( | CAN_TypeDef * |
can,
|
| uint8_t |
interface,
|
||
| uint8_t |
msgNum
|
||
| ) |
Read a Message Object to find if a message was lost ; reset the 'Message Lost' flag.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] interfaceIndicate which Message Interface Register to use. [in] msgNumA message number of the Message Object, [1 - 32].
- Returns
- True if a message was lost, false otherwise.
◆ CAN_SetRoute()
| void CAN_SetRoute | ( | CAN_TypeDef * |
can,
|
| bool |
active,
|
||
| uint16_t |
pinRxLoc,
|
||
| uint16_t |
pinTxLoc
|
||
| ) |
Set the ROUTE registers.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] activeA boolean indicating whether or not to activate the ROUTE registers. [in] pinRxLocA location of the RX pin. [in] pinTxLocA location of the TX pin.
◆ CAN_SetBitTiming()
| void CAN_SetBitTiming | ( | CAN_TypeDef * |
can,
|
| uint32_t |
bitrate,
|
||
| uint16_t |
propagationTimeSegment,
|
||
| uint16_t |
phaseBufferSegment1,
|
||
| uint16_t |
phaseBufferSegment2,
|
||
| uint16_t |
synchronisationJumpWidth
|
||
| ) |
Set the bitrate and its parameters.
Multiple parameters need to be properly configured. See the reference manual for a detailed description. Careful : the BRP (Baud Rate Prescaler) is calculated by: 'brp = freq / (period * bitrate);'. freq is the frequency of the CAN device, period the time of transmission of a bit. The result is an uint32_t. Hence it's truncated, causing an approximation error. This error is non negligible when the period is high, the bitrate is high, and frequency is low.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] bitrateA wanted bitrate on the CAN bus. [in] propagationTimeSegmentA value for the Propagation Time Segment. [in] phaseBufferSegment1A value for the Phase Buffer Segment 1. [in] phaseBufferSegment2A value for the Phase Buffer Segment 2. [in] synchronisationJumpWidthA value for the Synchronization Jump Width.
◆ CAN_SetMode()
| void CAN_SetMode | ( | CAN_TypeDef * |
can,
|
| CAN_Mode_TypeDef |
mode
|
||
| ) |
Set the CAN operation mode.
In initialization mode, the CAN module is deactivated. Reset the messages in all other modes to be sure that there is no leftover data that needs to be configured before use.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] modeMode of operation : Init, Normal, Loopback, SilentLoopback, Silent, Basic.
◆ CAN_SetIdAndFilter()
| void CAN_SetIdAndFilter | ( | CAN_TypeDef * |
can,
|
| uint8_t |
interface,
|
||
| bool |
useMask,
|
||
| const CAN_MessageObject_TypeDef * |
message,
|
||
| bool |
wait
|
||
| ) |
Set the ID and the filter for a specific Message Object.
The initialization bit has to be 0 to use this function.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] interfaceIndicate which Message Interface Register to use. [in] useMaskA boolean to choose whether or not to use the masks. [in] messageA Message Object. [in] waitIf true, wait for the end of the transfer between the MIRx registers and the RAM to exit. If false, exit immediately, the transfer can still be in progress.
◆ CAN_ConfigureMessageObject()
| void CAN_ConfigureMessageObject | ( | CAN_TypeDef * |
can,
|
| uint8_t |
interface,
|
||
| uint8_t |
msgNum,
|
||
| bool |
valid,
|
||
| bool |
tx,
|
||
| bool |
remoteTransfer,
|
||
| bool |
endOfBuffer,
|
||
| bool |
wait
|
||
| ) |
Configure valid, TX/RX, remoteTransfer for a specific Message Object.
The initialization bit has to be 0 to use this function.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] interfaceIndicate which Message Interface Register to use. [in] msgNumA message number of this Message Object, [1 - 32]. [in] validTrue if the Message Object is valid, false otherwise. [in] txTrue if the Message Object is used for transmission, false if used for reception. [in] remoteTransferTrue if the Message Object is used for remote transmission, false otherwise. [in] endOfBufferTrue if it is for a single Message Object or the end of a FIFO buffer, false if the Message Object is part of a FIFO buffer and not the last. [in] waitIf true, wait for the end of the transfer between the MIRx registers and the RAM to exit. If false, exit immediately, the transfer can still be in progress.
◆ CAN_SendMessage()
| void CAN_SendMessage | ( | CAN_TypeDef * |
can,
|
| uint8_t |
interface,
|
||
| const CAN_MessageObject_TypeDef * |
message,
|
||
| bool |
wait
|
||
| ) |
Send data from the Message Object message.
If the message is configured as TX and remoteTransfer = 0, calling this function will send the data of this Message Object if its parameters are correct. If the message is TX and remoteTransfer = 1, this function will set the data of message to RAM and exit. Data will be automatically sent after reception of a remote frame. If the message is RX and remoteTransfer = 1, this function will send a remote frame to the corresponding ID. If the message is RX and remoteTransfer = 0, the user shouldn't call this function. It will also send a remote frame.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] interfaceIndicate which Message Interface Register to use. [in] messageA Message Object. [in] waitIf true, wait for the end of the transfer between the MIRx registers and RAM to exit. If false, exit immediately. The transfer can still be in progress.
◆ CAN_ReadMessage()
| bool CAN_ReadMessage | ( | CAN_TypeDef * |
can,
|
| uint8_t |
interface,
|
||
| CAN_MessageObject_TypeDef * |
message
|
||
| ) |
Read data and ID from a Message Object in RAM and store it in a message.
Read the information from RAM on this Message Object. Data and the configuration of the Message Object is read. The information is only read if the message stored in the Message Object is new and valid.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] interfaceIndicate which Message Interface Register to use. [in] messageA Message Object.
- Returns
- True if the Message Object in RAM holds a new and valid message, which was not read earlier, false otherwise.
◆ CAN_AbortSendMessage()
| void CAN_AbortSendMessage | ( | CAN_TypeDef * |
can,
|
| uint8_t |
interface,
|
||
| uint8_t |
msgNum,
|
||
| bool |
wait
|
||
| ) |
Abort sending a message.
Set the TXRQST of the CTRL register to 0. Doesn't touch data or the other parameters. The user can call CAN_SendMessage() to send the object after using CAN_AbortSendMessage() .
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] interfaceIndicate which Message Interface Register to use. [in] msgNumA message number of this Message Object, [1 - 32]. [in] waitIf true, wait for the end of the transfer between the MIRx registers and the RAM to exit. If false, exit immediately. The transfer can still be in progress.
◆ CAN_ResetMessages()
| void CAN_ResetMessages | ( | CAN_TypeDef * |
can,
|
| uint8_t |
interface
|
||
| ) |
Reset all Message Objects and set their data to 0.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] interfaceIndicate which Message Interface Register to use.
◆ CAN_Reset()
| void CAN_Reset | ( | CAN_TypeDef * |
can
|
) |
Set all CAN registers to RESETVALUE.
Leave the CAN device disabled.
- Parameters
-
[in] canA pointer to the CAN peripheral register block.
◆ CAN_WriteData()
| void CAN_WriteData | ( | CAN_TypeDef * |
can,
|
| uint8_t |
interface,
|
||
| const CAN_MessageObject_TypeDef * |
message
|
||
| ) |
Write data from a message to the MIRx registers.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] interfaceIndicate which Message Interface Register to use. [in] messageA Message Object.
◆ CAN_SendRequest()
| void CAN_SendRequest | ( | CAN_TypeDef * |
can,
|
| uint8_t |
interface,
|
||
| uint8_t |
msgNum,
|
||
| bool |
wait
|
||
| ) |
Send a request for writing or reading RAM of the Message Object msgNum.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] interfaceIndicate which Message Interface Register to use. [in] msgNumA message number of the Message Object, [1 - 32]. [in] waitIf true, wait for the end of the transfer between the MIRx registers and the RAM to exit. If false, exit immediately. The transfer can still be in progress.
◆ CAN_Enable()
|
inline |
Enable the Host Controller to send messages.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] enableTrue to enable CAN device, false to disable it. If the CAN device is enabled, it goes to normal mode (the default working mode).
◆ CAN_IsEnabled()
|
inline |
Give the communication capabilities state.
- Parameters
-
[in] canA pointer to the CAN peripheral register block.
- Returns
- True if the Host Controller can send messages, false otherwise.
◆ CAN_ReadyWait()
|
inline |
Waiting function.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] interfaceIndicate which Message Interface Register to use.
◆ CAN_GetLastErrorCode()
|
inline |
Get the last error code and clear its register.
- Parameters
-
[in] canPointer to CAN peripheral register block.
- Returns
- return Last error code.
◆ CAN_HasNewdata()
|
inline |
Indicates which message objects have received new data.
- Parameters
-
[in] canA pointer to the CAN peripheral register block.
- Returns
- State of MESSAGEDATA register indicating which message objects have received new data.
◆ CAN_StatusIntClear()
|
inline |
Clear one or more pending CAN status interrupts.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] flagsPending CAN status interrupt source(s) to clear.
◆ CAN_StatusIntDisable()
|
inline |
Disable CAN status interrupts.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] flagsCAN status interrupt source(s) to disable.
◆ CAN_StatusIntEnable()
|
inline |
Enable CAN status interrupts.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] flagsCAN status interrupt source(s) to enable.
◆ CAN_StatusIntGet()
|
inline |
Get pending CAN status interrupt flags.
- Note
- This function does not clear event bits.
- Parameters
-
[in] canA pointer to the CAN peripheral register block.
- Returns
- CAN interrupt source(s) pending.
◆ CAN_StatusIntGetEnabled()
|
inline |
Get pending and enabled CAN status interrupt flags.
- Note
- This function does not clear event bits.
- Parameters
-
[in] canA pointer to the CAN peripheral register block.
- Returns
- CAN interrupt source(s) pending and enabled.
◆ CAN_StatusIntSet()
|
inline |
Set one or more CAN status interrupts.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] flagsCAN status interrupt source(s) to set to pending.
◆ CAN_StatusGet()
|
inline |
Get CAN status.
- Parameters
-
[in] canA pointer to the CAN peripheral register block.
- Returns
- A value of CAN register STATUS.
◆ CAN_StatusClear()
|
inline |
Clear CAN status.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] flagsCAN status bits to clear.
◆ CAN_GetErrorCount()
|
inline |
Get the error count.
- Parameters
-
[in] canA pointer to the CAN peripheral register block.
- Returns
- Error count.
◆ CAN_MessageIntClear()
|
inline |
Clear one or more pending CAN message interrupts.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] flagsPending CAN message interrupt source(s) to clear.
◆ CAN_MessageIntDisable()
|
inline |
Disable CAN message interrupts.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] flagsCAN message interrupt source(s) to disable.
◆ CAN_MessageIntEnable()
|
inline |
Enable CAN message interrupts.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] flagsCAN message interrupt source(s) to enable.
◆ CAN_MessageIntGet()
|
inline |
Get pending CAN message interrupt flags.
- Note
- This function does not clear event bits.
- Parameters
-
[in] canA pointer to the CAN peripheral register block.
- Returns
- CAN message interrupt source(s) pending.
◆ CAN_MessageIntGetEnabled()
|
inline |
Get CAN message interrupt flags that are pending and enabled.
- Note
- This function does not clear event bits.
- Parameters
-
[in] canA pointer to the CAN peripheral register block.
- Returns
- CAN message interrupt source(s) pending and enabled.
◆ CAN_MessageIntSet()
|
inline |
Set one or more CAN message interrupts.
- Parameters
-
[in] canA pointer to the CAN peripheral register block. [in] flagsCAN message interrupt source(s) to set as pending.
Macro Definition Documentation
◆ CAN_INIT_DEFAULT
| #define CAN_INIT_DEFAULT |
Default initialization of CAN_Init_TypeDef .
The total duration of a bit with these default parameters is 10 tq (time quantum : tq = brp/fsys, brp being the baudrate prescaler and being set according to the wanted bitrate, fsys beeing the CAN device frequency).
Enumeration Type Documentation
◆ CAN_ErrorCode_TypeDef
CAN Status codes.
◆ CAN_Mode_TypeDef
| enum CAN_Mode_TypeDef |
CAN peripheral mode.