Add mcp2518fd canbus code

This commit is contained in:
wangcoolc
2020-12-10 17:10:14 +08:00
committed by Baozhu Zuo
parent dc2fb92dad
commit fd0d620578
4 changed files with 5016 additions and 0 deletions
+3091
View File
File diff suppressed because it is too large Load Diff
+222
View File
@@ -0,0 +1,222 @@
#ifndef _MCP2518FD_H_
#define _MCP2518FD_H_
#include "mcp_can.h"
#include "mcp2518fd_can_def.h"
#include "mcp2518fd_can_dfs.h"
#include <Arduino.h>
#include <SPI.h>
#define MCP2518fd_OK (0)
#define MCP2518fd_FAIL (1)
#define CAN_OK (0)
#define CAN_FAILINIT (1)
#define CAN_FAILTX (2)
// *****************************************************************************
// *****************************************************************************
//! Reset DUT
// Code anchor for break points
#define Nop() asm("nop")
// Index to SPI channel
// Used when multiple MCP25xxFD are connected to the same SPI interface, but with different CS
#define SPI_DEFAULT_BUFFER_LENGTH 96
//extern SPIClass* pSPI;
#define spi_readwrite pSPI->transfer
#define spi_read() spi_readwrite(0x00)
#define spi_write(spi_val) spi_readwrite(spi_val)
#define SPI_BEGIN() pSPI->beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0))
#define SPI_END() pSPI->endTransaction();
// *****************************************************************************
// *****************************************************************************
// Section: Defines
#define CRCBASE 0xFFFF
#define CRCUPPER 1
//! Reverse order of bits in byte
const uint8_t BitReverseTable256[256] = {
0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
};
//! Look-up table for CRC calculation
const uint16_t crc16_table[256] = {
0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011,
0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, 0x0022,
0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, 0x8077, 0x0072,
0x0050, 0x8055, 0x805F, 0x005A, 0x804B, 0x004E, 0x0044, 0x8041,
0x80C3, 0x00C6, 0x00CC, 0x80C9, 0x00D8, 0x80DD, 0x80D7, 0x00D2,
0x00F0, 0x80F5, 0x80FF, 0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1,
0x00A0, 0x80A5, 0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1,
0x8093, 0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082,
0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D, 0x8197, 0x0192,
0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE, 0x01A4, 0x81A1,
0x01E0, 0x81E5, 0x81EF, 0x01EA, 0x81FB, 0x01FE, 0x01F4, 0x81F1,
0x81D3, 0x01D6, 0x01DC, 0x81D9, 0x01C8, 0x81CD, 0x81C7, 0x01C2,
0x0140, 0x8145, 0x814F, 0x014A, 0x815B, 0x015E, 0x0154, 0x8151,
0x8173, 0x0176, 0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162,
0x8123, 0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132,
0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E, 0x0104, 0x8101,
0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D, 0x8317, 0x0312,
0x0330, 0x8335, 0x833F, 0x033A, 0x832B, 0x032E, 0x0324, 0x8321,
0x0360, 0x8365, 0x836F, 0x036A, 0x837B, 0x037E, 0x0374, 0x8371,
0x8353, 0x0356, 0x035C, 0x8359, 0x0348, 0x834D, 0x8347, 0x0342,
0x03C0, 0x83C5, 0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1,
0x83F3, 0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2,
0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD, 0x83B7, 0x03B2,
0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E, 0x0384, 0x8381,
0x0280, 0x8285, 0x828F, 0x028A, 0x829B, 0x029E, 0x0294, 0x8291,
0x82B3, 0x02B6, 0x02BC, 0x82B9, 0x02A8, 0x82AD, 0x82A7, 0x02A2,
0x82E3, 0x02E6, 0x02EC, 0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2,
0x02D0, 0x82D5, 0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1,
0x8243, 0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252,
0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, 0x8261,
0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231,
0x8213, 0x0216, 0x021C, 0x8219, 0x0208, 0x820D, 0x8207, 0x0202
};
class SPIClass;
class mcp2518fd : public MCP_CAN
{
public:
mcp2518fd(byte _CS) : MCP_CAN(_CS), nReservedTx(0){};
public:
virtual void enableTxInterrupt(bool enable = true); // enable transmit interrupt
virtual void reserveTxBuffers(byte nTxBuf = 0)
{
nReservedTx = (nTxBuf < 3 ? nTxBuf : 3 - 1);
}
virtual byte getLastTxBuffer()
{
return 3 - 1; // read index of last tx buffer
}
virtual byte begin(byte speedset,const byte clockset = CAN_SYSCLK_40M); // init can
virtual byte init_Mask(byte num, byte ext, unsigned long ulData);
virtual byte init_Filt(byte num, byte ext, unsigned long ulData); // init filters
virtual void setSleepWakeup(const byte enable);
virtual byte sleep();
virtual byte wake();
virtual byte setMode(const byte opMode);
virtual byte getMode();
virtual byte sendMsgBuf(unsigned long id, byte ext, byte rtrBit, byte len, const byte *buf, bool wait_sent = true);
virtual byte sendMsgBuf(unsigned long id, byte ext, byte len, const byte *buf, bool wait_sent = true);
virtual byte readMsgBuf(byte *len, byte *buf);
virtual byte readMsgBufID(unsigned long *ID, byte *len, byte *buf);
virtual byte checkReceive(void);
virtual byte checkError(void);
virtual unsigned long getCanId(void);
virtual byte isRemoteRequest(void);
virtual byte isExtendedFrame(void);
virtual byte readMsgBufID(byte status, volatile unsigned long *id, volatile byte *ext, volatile byte *rtr, volatile byte *len, volatile byte *buf); // read buf with object ID
virtual byte trySendMsgBuf(unsigned long id, byte ext, byte rtrBit, byte len, const byte *buf, byte iTxBuf = 0xff);
virtual byte sendMsgBuf(byte status, unsigned long id, byte ext, byte rtrBit, byte len, volatile const byte *buf);
virtual void clearBufferTransmitIfFlags(byte flags = 0);
virtual byte readRxTxStatus(void);
virtual byte checkClearRxStatus(byte *status);
virtual byte checkClearTxStatus(byte *status, byte iTxBuf = 0xff);
virtual bool mcpPinMode(const byte pin, const byte mode);
virtual bool mcpDigitalWrite(const byte pin, const byte mode);
virtual byte mcpDigitalRead(const byte pin);
private:
byte mcp2518fd_readMsgBufID(volatile byte *len, volatile byte *buf);
byte mcp2518fd_sendMsgBuf(const byte* buf,byte len,unsigned long id, byte ext,bool wait_sent); // send buf
byte mcp2518fd_sendMsg(const byte* buf,byte len,unsigned long id, byte ext,bool wait_sent);
int8_t mcp2518fd_receiveMsg();
private:
uint8_t mcp2518fd_init(byte speedset,const byte clock); // mcp2518fdinit
int8_t mcp2518fd_reset(void); //reset mcp2518fd
int8_t mcp2518fd_EccEnable(void); //Section: ECC
int8_t mcp2518fd_RamInit(uint8_t d);
int8_t mcp2518fd_ConfigureObjectReset(CAN_CONFIG* config);
int8_t mcp2518fd_Configure(CAN_CONFIG* config);
int8_t mcp2518fd_TransmitChannelConfigureObjectReset(CAN_TX_FIFO_CONFIG* config);
int8_t mcp2518fd_TransmitChannelConfigure(CAN_FIFO_CHANNEL channel, CAN_TX_FIFO_CONFIG* config);
int8_t mcp2518fd_ReceiveChannelConfigureObjectReset(CAN_RX_FIFO_CONFIG* config);
int8_t mcp2518fd_ReceiveChannelConfigure(CAN_FIFO_CHANNEL channel, CAN_RX_FIFO_CONFIG* config);
int8_t mcp2518fd_FilterObjectConfigure(CAN_FILTER filter, CAN_FILTEROBJ_ID* id);
int8_t mcp2518fd_FilterMaskConfigure(CAN_FILTER filter, CAN_MASKOBJ_ID* mask);
int8_t mcp2518fd_FilterToFifoLink(CAN_FILTER filter, CAN_FIFO_CHANNEL channel, bool enable);
int8_t mcp2518fd_BitTimeConfigure(CAN_BITTIME_SETUP bitTime, CAN_SSP_MODE sspMode,CAN_SYSCLK_SPEED clk);
int8_t mcp2518fd_GpioModeConfigure(GPIO_PIN_MODE gpio0, GPIO_PIN_MODE gpio1);
int8_t mcp2518fd_TransmitChannelEventEnable(CAN_FIFO_CHANNEL channel, CAN_TX_FIFO_EVENT flags);
int8_t mcp2518fd_ReceiveChannelEventEnable(CAN_FIFO_CHANNEL channel, CAN_RX_FIFO_EVENT flags);
int8_t mcp2518fd_ModuleEventEnable(CAN_MODULE_EVENT flags);
int8_t mcp2518fd_OperationModeSelect(CAN_OPERATION_MODE opMode);
CAN_OPERATION_MODE mcp2518fd_OperationModeGet();
void mcp2518fd_TransmitMessageQueue();
int8_t mcp2518fd_TransmitChannelEventGet(CAN_FIFO_CHANNEL channel, CAN_TX_FIFO_EVENT* flags);
int8_t mcp2518fd_ErrorCountStateGet(uint8_t* tec, uint8_t* rec, CAN_ERROR_STATE* flags);
int8_t mcp2518fd_TransmitChannelLoad(CAN_FIFO_CHANNEL channel, CAN_TX_MSGOBJ* txObj,
uint8_t *txd, uint32_t txdNumBytes, bool flush);
int8_t mcp2518fd_ReceiveChannelEventGet(CAN_FIFO_CHANNEL channel, CAN_RX_FIFO_EVENT* flags);
int8_t mcp2518fd_ReceiveMessageGet(CAN_FIFO_CHANNEL channel, CAN_RX_MSGOBJ* rxObj,uint8_t *rxd, uint8_t nBytes);
int8_t mcp2518fd_ReceiveChannelUpdate(CAN_FIFO_CHANNEL channel);
int8_t mcp2518fd_TransmitChannelUpdate(CAN_FIFO_CHANNEL channel, bool flush);
int8_t mcp2518fd_ReceiveChannelStatusGet(CAN_FIFO_CHANNEL channel, CAN_RX_FIFO_STATUS* status);
int8_t mcp2518fd_ErrorStateGet(CAN_ERROR_STATE* flags);
int8_t mcp2518fd_ModuleEventRxCodeGet(CAN_RXCODE* rxCode);
int8_t mcp2518fd_ModuleEventTxCodeGet(CAN_TXCODE* txCode);
int8_t mcp2518fd_LowPowerModeEnable();
int8_t mcp2518fd_LowPowerModeDisable();
int8_t mcp2518fd_ReadByte(uint16_t address, uint8_t *rxd);
int8_t mcp2518fd_WriteByte(uint16_t address, uint8_t txd);
int8_t mcp2518fd_ReadWord(uint16_t address,uint32_t *rxd);
int8_t mcp2518fd_WriteWord(uint16_t address,uint32_t txd);
int8_t mcp2518fd_ReadHalfWord(uint16_t address,uint16_t *rxd);
int8_t mcp2518fd_WriteHalfWord(uint16_t address,uint16_t txd);
int8_t mcp2518fd_ReadByteArray(uint16_t address,uint8_t *rxd, uint16_t nBytes);
int8_t mcp2518fd_WriteByteArray(uint16_t address,uint8_t *txd, uint16_t nBytes);
int8_t mcp2518fd_WriteByteSafe(uint16_t address,uint8_t txd);
int8_t mcp2518fd_WriteWordSafe(uint16_t address,uint32_t txd);
int8_t mcp2518fd_ReadByteArrayWithCRC(uint16_t address,uint8_t *rxd, uint16_t nBytes, bool fromRam, bool* crcIsCorrect);
int8_t mcp2518fd_WriteByteArrayWithCRC(uint16_t address,uint8_t *txd, uint16_t nBytes, bool fromRam);
int8_t mcp2518fd_ReadWordArray(uint16_t address,uint32_t *rxd, uint16_t nWords);
int8_t mcp2518fd_WriteWordArray(uint16_t address,uint32_t *txd, uint16_t nWords);
private:
int8_t mcp2518fd_BitTimeConfigureNominal40MHz(CAN_BITTIME_SETUP bitTime);
int8_t mcp2518fd_BitTimeConfigureData40MHz(CAN_BITTIME_SETUP bitTime, CAN_SSP_MODE sspMode);
int8_t mcp2518fd_BitTimeConfigureNominal20MHz(CAN_BITTIME_SETUP bitTime);
int8_t mcp2518fd_BitTimeConfigureData20MHz(CAN_BITTIME_SETUP bitTime, CAN_SSP_MODE sspMode);
int8_t mcp2518fd_BitTimeConfigureNominal10MHz(CAN_BITTIME_SETUP bitTime);
int8_t mcp2518fd_BitTimeConfigureData10MHz(CAN_BITTIME_SETUP bitTime, CAN_SSP_MODE sspMode);
byte ext_flg; // identifier xxxID
// either extended (the 29 LSB) or standard (the 11 LSB)
unsigned long can_id; // can id
byte rtr; // rtr
byte nReservedTx; // Count of tx buffers for reserved send
CAN_OPERATION_MODE mcpMode; // Current controller mode
};
#endif
+894
View File
@@ -0,0 +1,894 @@
/*******************************************************************************
CAN FD SPI Driver: API Defines Header File
Company:
Microchip Technology Inc.
File Name:
drv_canfdspi_defines.h
Summary:
This header file contains object declarations used in the API.
This also contains device specific defines.
Description:
None.
*******************************************************************************/
//DOM-IGNORE-BEGIN
/*******************************************************************************
Copyright (c) 2018 Microchip Technology Inc. and its subsidiaries.
Subject to your compliance with these terms, you may use Microchip software and
any derivatives exclusively with Microchip products. It is your responsibility
to comply with third party license terms applicable to your use of third party
software (including open source software) that may accompany Microchip software.
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER EXPRESS,
IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES
OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER
RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF
THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED
BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO
THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, THAT YOU HAVE PAID
DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
*******************************************************************************/
//DOM-IGNORE-END
#ifndef _DRV_CANFDSPI_DEFINES_H
#define _DRV_CANFDSPI_DEFINES_H
// *****************************************************************************
// *****************************************************************************
// Section: Included Files
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
// DOM-IGNORE-BEGIN
#ifdef __cplusplus // Provide C++ Compatibility
extern "C" {
#endif
// DOM-IGNORE-END
// *****************************************************************************
// *****************************************************************************
// Section: Implementation
// Device selection
//#define MCP2517FD
#define MCP2518FD
// Maximum Size of TX/RX Object
#define MAX_MSG_SIZE 76
// Maximum number of data bytes in message
#define MAX_DATA_BYTES 64
// *****************************************************************************
// *****************************************************************************
// Section: Object definitions
//! CAN FIFO Channels
typedef enum {
CAN_FIFO_CH0, // CAN_TXQUEUE_CH0
CAN_FIFO_CH1,
CAN_FIFO_CH2,
CAN_FIFO_CH3,
CAN_FIFO_CH4,
CAN_FIFO_CH5,
CAN_FIFO_CH6,
CAN_FIFO_CH7,
CAN_FIFO_CH8,
CAN_FIFO_CH9,
CAN_FIFO_CH10,
CAN_FIFO_CH11,
CAN_FIFO_CH12,
CAN_FIFO_CH13,
CAN_FIFO_CH14,
CAN_FIFO_CH15,
CAN_FIFO_CH16,
CAN_FIFO_CH17,
CAN_FIFO_CH18,
CAN_FIFO_CH19,
CAN_FIFO_CH20,
CAN_FIFO_CH21,
CAN_FIFO_CH22,
CAN_FIFO_CH23,
CAN_FIFO_CH24,
CAN_FIFO_CH25,
CAN_FIFO_CH26,
CAN_FIFO_CH27,
CAN_FIFO_CH28,
CAN_FIFO_CH29,
CAN_FIFO_CH30,
CAN_FIFO_CH31,
CAN_FIFO_TOTAL_CHANNELS
} CAN_FIFO_CHANNEL;
// FIFO0 is a special FIFO, the TX Queue
#define CAN_TXQUEUE_CH0 CAN_FIFO_CH0
//! CAN Filter Channels
typedef enum {
CAN_FILTER0,
CAN_FILTER1,
CAN_FILTER2,
CAN_FILTER3,
CAN_FILTER4,
CAN_FILTER5,
CAN_FILTER6,
CAN_FILTER7,
CAN_FILTER8,
CAN_FILTER9,
CAN_FILTER10,
CAN_FILTER11,
CAN_FILTER12,
CAN_FILTER13,
CAN_FILTER14,
CAN_FILTER15,
CAN_FILTER16,
CAN_FILTER17,
CAN_FILTER18,
CAN_FILTER19,
CAN_FILTER20,
CAN_FILTER21,
CAN_FILTER22,
CAN_FILTER23,
CAN_FILTER24,
CAN_FILTER25,
CAN_FILTER26,
CAN_FILTER27,
CAN_FILTER28,
CAN_FILTER29,
CAN_FILTER30,
CAN_FILTER31,
CAN_FILTER_TOTAL,
} CAN_FILTER;
//! CAN Operation Modes
typedef enum {
CAN_NORMAL_MODE = 0x00,
CAN_SLEEP_MODE = 0x01,
CAN_INTERNAL_LOOPBACK_MODE = 0x02,
CAN_LISTEN_ONLY_MODE = 0x03,
CAN_CONFIGURATION_MODE = 0x04,
CAN_EXTERNAL_LOOPBACK_MODE = 0x05,
CAN_CLASSIC_MODE = 0x06,
CAN_RESTRICTED_MODE = 0x07,
CAN_INVALID_MODE = 0xFF
} CAN_OPERATION_MODE;
//! Transmit Bandwidth Sharing
typedef enum {
CAN_TXBWS_NO_DELAY,
CAN_TXBWS_2,
CAN_TXBWS_4,
CAN_TXBWS_8,
CAN_TXBWS_16,
CAN_TXBWS_32,
CAN_TXBWS_64,
CAN_TXBWS_128,
CAN_TXBWS_256,
CAN_TXBWS_512,
CAN_TXBWS_1024,
CAN_TXBWS_2048,
CAN_TXBWS_4096
} CAN_TX_BANDWITH_SHARING;
//! Wake-up Filter Time
typedef enum {
CAN_WFT00,
CAN_WFT01,
CAN_WFT10,
CAN_WFT11
} CAN_WAKEUP_FILTER_TIME;
//! Data Byte Filter Number
typedef enum {
CAN_DNET_FILTER_DISABLE = 0,
CAN_DNET_FILTER_SIZE_1_BIT,
CAN_DNET_FILTER_SIZE_2_BIT,
CAN_DNET_FILTER_SIZE_3_BIT,
CAN_DNET_FILTER_SIZE_4_BIT,
CAN_DNET_FILTER_SIZE_5_BIT,
CAN_DNET_FILTER_SIZE_6_BIT,
CAN_DNET_FILTER_SIZE_7_BIT,
CAN_DNET_FILTER_SIZE_8_BIT,
CAN_DNET_FILTER_SIZE_9_BIT,
CAN_DNET_FILTER_SIZE_10_BIT,
CAN_DNET_FILTER_SIZE_11_BIT,
CAN_DNET_FILTER_SIZE_12_BIT,
CAN_DNET_FILTER_SIZE_13_BIT,
CAN_DNET_FILTER_SIZE_14_BIT,
CAN_DNET_FILTER_SIZE_15_BIT,
CAN_DNET_FILTER_SIZE_16_BIT,
CAN_DNET_FILTER_SIZE_17_BIT,
CAN_DNET_FILTER_SIZE_18_BIT
} CAN_DNET_FILTER_SIZE;
//! FIFO Payload Size
typedef enum {
CAN_PLSIZE_8,
CAN_PLSIZE_12,
CAN_PLSIZE_16,
CAN_PLSIZE_20,
CAN_PLSIZE_24,
CAN_PLSIZE_32,
CAN_PLSIZE_48,
CAN_PLSIZE_64
} CAN_FIFO_PLSIZE;
//! CAN Configure
typedef struct _CAN_CONFIG {
uint32_t DNetFilterCount : 5;
uint32_t IsoCrcEnable : 1;
uint32_t ProtocolExpectionEventDisable : 1;
uint32_t WakeUpFilterEnable : 1;
uint32_t WakeUpFilterTime : 2;
uint32_t BitRateSwitchDisable : 1;
uint32_t RestrictReTxAttempts : 1;
uint32_t EsiInGatewayMode : 1;
uint32_t SystemErrorToListenOnly : 1;
uint32_t StoreInTEF : 1;
uint32_t TXQEnable : 1;
uint32_t TxBandWidthSharing : 4;
} CAN_CONFIG;
//! CAN Transmit Channel Configure
typedef struct _CAN_TX_FIFO_CONFIG {
uint32_t RTREnable : 1;
uint32_t TxPriority : 5;
uint32_t TxAttempts : 2;
uint32_t FifoSize : 5;
uint32_t PayLoadSize : 3;
} CAN_TX_FIFO_CONFIG;
//! CAN Transmit Queue Configure
typedef struct _CAN_TX_QUEUE_CONFIG {
uint32_t TxPriority : 5;
uint32_t TxAttempts : 2;
uint32_t FifoSize : 5;
uint32_t PayLoadSize : 3;
} CAN_TX_QUEUE_CONFIG;
//! CAN Receive Channel Configure
typedef struct _CAN_RX_FIFO_CONFIG {
uint32_t RxTimeStampEnable : 1;
uint32_t FifoSize : 5;
uint32_t PayLoadSize : 3;
} CAN_RX_FIFO_CONFIG;
//! CAN Transmit Event FIFO Configure
typedef struct _CAN_TEF_CONFIG {
uint32_t TimeStampEnable : 1;
uint32_t FifoSize : 5;
} CAN_TEF_CONFIG;
/* CAN Message Objects */
//! CAN Message Object ID
typedef struct _CAN_MSGOBJ_ID {
uint32_t SID : 11;
uint32_t EID : 18;
uint32_t SID11 : 1;
uint32_t unimplemented1 : 2;
} CAN_MSGOBJ_ID;
//! CAN Data Length Code
typedef enum {
CAN_DLC_0,
CAN_DLC_1,
CAN_DLC_2,
CAN_DLC_3,
CAN_DLC_4,
CAN_DLC_5,
CAN_DLC_6,
CAN_DLC_7,
CAN_DLC_8,
CAN_DLC_12,
CAN_DLC_16,
CAN_DLC_20,
CAN_DLC_24,
CAN_DLC_32,
CAN_DLC_48,
CAN_DLC_64
} CAN_DLC;
//! CAN TX Message Object Control
typedef struct _CAN_TX_MSGOBJ_CTRL {
uint32_t DLC : 4;
uint32_t IDE : 1;
uint32_t RTR : 1;
uint32_t BRS : 1;
uint32_t FDF : 1;
uint32_t ESI : 1;
#ifdef MCP2517FD
uint32_t SEQ : 7;
uint32_t unimplemented1 : 16;
#else
uint32_t SEQ : 23;
#endif
} CAN_TX_MSGOBJ_CTRL;
//! CAN RX Message Object Control
typedef struct _CAN_RX_MSGOBJ_CTRL {
uint32_t DLC : 4;
uint32_t IDE : 1;
uint32_t RTR : 1;
uint32_t BRS : 1;
uint32_t FDF : 1;
uint32_t ESI : 1;
uint32_t unimplemented1 : 2;
uint32_t FilterHit : 5;
uint32_t unimplemented2 : 16;
} CAN_RX_MSGOBJ_CTRL;
//! CAN Message Time Stamp
typedef uint32_t CAN_MSG_TIMESTAMP;
//! CAN TX Message Object
typedef union _CAN_TX_MSGOBJ {
struct {
CAN_MSGOBJ_ID id;
CAN_TX_MSGOBJ_CTRL ctrl;
CAN_MSG_TIMESTAMP timeStamp;
} bF;
uint32_t word[3];
uint8_t byte[12];
} CAN_TX_MSGOBJ;
//! CAN RX Message Object
typedef union _CAN_RX_MSGOBJ {
struct {
CAN_MSGOBJ_ID id;
CAN_RX_MSGOBJ_CTRL ctrl;
CAN_MSG_TIMESTAMP timeStamp;
} bF;
uint32_t word[3];
uint8_t byte[12];
} CAN_RX_MSGOBJ;
//! CAN TEF Message Object
typedef union _CAN_TEF_MSGOBJ {
struct {
CAN_MSGOBJ_ID id;
CAN_TX_MSGOBJ_CTRL ctrl;
CAN_MSG_TIMESTAMP timeStamp;
} bF;
uint32_t word[3];
uint8_t byte[12];
} CAN_TEF_MSGOBJ;
//! CAN Filter Object ID
typedef struct _CAN_FILTEROBJ_ID {
uint32_t SID : 11;
uint32_t EID : 18;
uint32_t SID11 : 1;
uint32_t EXIDE : 1;
uint32_t unimplemented1 : 1;
} CAN_FILTEROBJ_ID;
//! CAN Mask Object ID
typedef struct _CAN_MASKOBJ_ID {
uint32_t MSID : 11;
uint32_t MEID : 18;
uint32_t MSID11 : 1;
uint32_t MIDE : 1;
uint32_t unimplemented1 : 1;
} CAN_MASKOBJ_ID;
//! CAN RX FIFO Status
typedef enum {
CAN_RX_FIFO_EMPTY = 0,
CAN_RX_FIFO_STATUS_MASK = 0x0F,
CAN_RX_FIFO_NOT_EMPTY = 0x01,
CAN_RX_FIFO_HALF_FULL = 0x02,
CAN_RX_FIFO_FULL = 0x04,
CAN_RX_FIFO_OVERFLOW = 0x08
} CAN_RX_FIFO_STATUS;
//! CAN TX FIFO Status
typedef enum {
CAN_TX_FIFO_FULL = 0,
CAN_TX_FIFO_STATUS_MASK = 0x1F7,
CAN_TX_FIFO_NOT_FULL = 0x01,
CAN_TX_FIFO_HALF_FULL = 0x02,
CAN_TX_FIFO_EMPTY = 0x04,
CAN_TX_FIFO_ATTEMPTS_EXHAUSTED = 0x10,
CAN_TX_FIFO_ERROR = 0x20,
CAN_TX_FIFO_ARBITRATION_LOST = 0x40,
CAN_TX_FIFO_ABORTED = 0x80,
CAN_TX_FIFO_TRANSMITTING = 0x100
} CAN_TX_FIFO_STATUS;
//! CAN TEF FIFO Status
typedef enum {
CAN_TEF_FIFO_EMPTY = 0,
CAN_TEF_FIFO_STATUS_MASK = 0x0F,
CAN_TEF_FIFO_NOT_EMPTY = 0x01,
CAN_TEF_FIFO_HALF_FULL = 0x02,
CAN_TEF_FIFO_FULL = 0x04,
CAN_TEF_FIFO_OVERFLOW = 0x08
} CAN_TEF_FIFO_STATUS;
//! CAN Module Event (Interrupts)
typedef enum {
CAN_NO_EVENT = 0,
CAN_ALL_EVENTS = 0xFF1F,
CAN_TX_EVENT = 0x0001,
CAN_RX_EVENT = 0x0002,
CAN_TIME_BASE_COUNTER_EVENT = 0x0004,
CAN_OPERATION_MODE_CHANGE_EVENT = 0x0008,
CAN_TEF_EVENT = 0x0010,
CAN_RAM_ECC_EVENT = 0x0100,
CAN_SPI_CRC_EVENT = 0x0200,
CAN_TX_ATTEMPTS_EVENT = 0x0400,
CAN_RX_OVERFLOW_EVENT = 0x0800,
CAN_SYSTEM_ERROR_EVENT = 0x1000,
CAN_BUS_ERROR_EVENT = 0x2000,
CAN_BUS_WAKEUP_EVENT = 0x4000,
CAN_RX_INVALID_MESSAGE_EVENT = 0x8000
} CAN_MODULE_EVENT;
//! CAN TX FIFO Event (Interrupts)
typedef enum {
CAN_TX_FIFO_NO_EVENT = 0,
CAN_TX_FIFO_ALL_EVENTS = 0x17,
CAN_TX_FIFO_NOT_FULL_EVENT = 0x01,
CAN_TX_FIFO_HALF_FULL_EVENT = 0x02,
CAN_TX_FIFO_EMPTY_EVENT = 0x04,
CAN_TX_FIFO_ATTEMPTS_EXHAUSTED_EVENT = 0x10
} CAN_TX_FIFO_EVENT;
//! CAN RX FIFO Event (Interrupts)
typedef enum {
CAN_RX_FIFO_NO_EVENT = 0,
CAN_RX_FIFO_ALL_EVENTS = 0x0F,
CAN_RX_FIFO_NOT_EMPTY_EVENT = 0x01,
CAN_RX_FIFO_HALF_FULL_EVENT = 0x02,
CAN_RX_FIFO_FULL_EVENT = 0x04,
CAN_RX_FIFO_OVERFLOW_EVENT = 0x08
} CAN_RX_FIFO_EVENT;
//! CAN TEF FIFO Event (Interrupts)
typedef enum {
CAN_TEF_FIFO_NO_EVENT = 0,
CAN_TEF_FIFO_ALL_EVENTS = 0x0F,
CAN_TEF_FIFO_NOT_EMPTY_EVENT = 0x01,
CAN_TEF_FIFO_HALF_FULL_EVENT = 0x02,
CAN_TEF_FIFO_FULL_EVENT = 0x04,
CAN_TEF_FIFO_OVERFLOW_EVENT = 0x08
} CAN_TEF_FIFO_EVENT;
//! CAN Bit Time Setup: Arbitration/Data Bit Phase
typedef enum {
CAN_500K_1M, // 0x00
CAN_500K_2M, // 0x01
CAN_500K_3M,
CAN_500K_4M,
CAN_500K_5M, // 0x04
CAN_500K_6M7,
CAN_500K_8M, // 0x06
CAN_500K_10M,
CAN_250K_500K, // 0x08
CAN_250K_833K,
CAN_250K_1M,
CAN_250K_1M5,
CAN_250K_2M,
CAN_250K_3M,
CAN_250K_4M,
CAN_1000K_4M, // 0x0f
CAN_1000K_8M,
CAN_125K_500K // 0x11
} CAN_BITTIME_SETUP;
//! CAN Nominal Bit Time Setup
typedef enum {
CAN_NBT_125K,
CAN_NBT_250K,
CAN_NBT_500K,
CAN_NBT_1M
} CAN_NOMINAL_BITTIME_SETUP;
//! CAN Data Bit Time Setup
typedef enum {
CAN_DBT_500K,
CAN_DBT_833K,
CAN_DBT_1M,
CAN_DBT_1M5,
CAN_DBT_2M,
CAN_DBT_3M,
CAN_DBT_4M,
CAN_DBT_5M,
CAN_DBT_6M7,
CAN_DBT_8M,
CAN_DBT_10M
} CAN_DATA_BITTIME_SETUP;
//! Secondary Sample Point Mode
typedef enum {
CAN_SSP_MODE_OFF,
CAN_SSP_MODE_MANUAL,
CAN_SSP_MODE_AUTO
} CAN_SSP_MODE;
//! CAN Error State
typedef enum {
CAN_ERROR_FREE_STATE = 0,
CAN_ERROR_ALL = 0x3F,
CAN_TX_RX_WARNING_STATE = 0x01,
CAN_RX_WARNING_STATE = 0x02,
CAN_TX_WARNING_STATE = 0x04,
CAN_RX_BUS_PASSIVE_STATE = 0x08,
CAN_TX_BUS_PASSIVE_STATE = 0x10,
CAN_TX_BUS_OFF_STATE = 0x20
} CAN_ERROR_STATE;
//! CAN Time Stamp Mode Select
typedef enum {
CAN_TS_SOF = 0x00,
CAN_TS_EOF = 0x01,
CAN_TS_RES = 0x02
} CAN_TS_MODE;
//! CAN ECC EVENT
typedef enum {
CAN_ECC_NO_EVENT = 0x00,
CAN_ECC_ALL_EVENTS = 0x06,
CAN_ECC_SEC_EVENT = 0x02,
CAN_ECC_DED_EVENT = 0x04
} CAN_ECC_EVENT;
//! CAN CRC EVENT
typedef enum {
CAN_CRC_NO_EVENT = 0x00,
CAN_CRC_ALL_EVENTS = 0x03,
CAN_CRC_CRCERR_EVENT = 0x01,
CAN_CRC_FORMERR_EVENT = 0x02
} CAN_CRC_EVENT;
//! GPIO Pin Position
typedef enum {
GPIO_PIN_0,
GPIO_PIN_1
} GPIO_PIN_POS;
//! GPIO Pin Modes
typedef enum {
GPIO_MODE_INT,
GPIO_MODE_GPIO
} GPIO_PIN_MODE;
//! GPIO Pin Directions
typedef enum {
GPIO_OUTPUT,
GPIO_INPUT
} GPIO_PIN_DIRECTION;
//! GPIO Open Drain Mode
typedef enum {
GPIO_PUSH_PULL,
GPIO_OPEN_DRAIN
} GPIO_OPEN_DRAIN_MODE;
//! GPIO Pin State
typedef enum {
GPIO_LOW,
GPIO_HIGH
} GPIO_PIN_STATE;
//! Clock Output Mode
typedef enum {
GPIO_CLKO_CLOCK,
GPIO_CLKO_SOF
} GPIO_CLKO_MODE;
//! CAN Bus Diagnostic flags
typedef struct _CAN_BUS_DIAG_FLAGS {
uint32_t NBIT0_ERR : 1;
uint32_t NBIT1_ERR : 1;
uint32_t NACK_ERR : 1;
uint32_t NFORM_ERR : 1;
uint32_t NSTUFF_ERR : 1;
uint32_t NCRC_ERR : 1;
uint32_t unimplemented1 : 1;
uint32_t TXBO_ERR : 1;
uint32_t DBIT0_ERR : 1;
uint32_t DBIT1_ERR : 1;
uint32_t unimplemented2 : 1;
uint32_t DFORM_ERR : 1;
uint32_t DSTUFF_ERR : 1;
uint32_t DCRC_ERR : 1;
uint32_t ESI : 1;
uint32_t DLC_MISMATCH : 1;
} CAN_BUS_DIAG_FLAGS;
//! CAN Bus Diagnostic Error Counts
typedef struct _CAN_BUS_ERROR_COUNT {
uint8_t NREC;
uint8_t NTEC;
uint8_t DREC;
uint8_t DTEC;
} CAN_BUS_ERROR_COUNT;
//! CAN BUS DIAGNOSTICS
typedef union _CAN_BUS_DIAGNOSTIC {
struct {
CAN_BUS_ERROR_COUNT errorCount;
uint16_t errorFreeMsgCount;
CAN_BUS_DIAG_FLAGS flag;
} bF;
uint32_t word[3];
uint8_t byte[12];
} CAN_BUS_DIAGNOSTIC;
//! TXREQ Channel Bits
// Multiple channels can be or'ed together
typedef enum {
CAN_TXREQ_CH0 = 0x00000001,
CAN_TXREQ_CH1 = 0x00000002,
CAN_TXREQ_CH2 = 0x00000004,
CAN_TXREQ_CH3 = 0x00000008,
CAN_TXREQ_CH4 = 0x00000010,
CAN_TXREQ_CH5 = 0x00000020,
CAN_TXREQ_CH6 = 0x00000040,
CAN_TXREQ_CH7 = 0x00000080,
CAN_TXREQ_CH8 = 0x00000100,
CAN_TXREQ_CH9 = 0x00000200,
CAN_TXREQ_CH10 = 0x00000400,
CAN_TXREQ_CH11 = 0x00000800,
CAN_TXREQ_CH12 = 0x00001000,
CAN_TXREQ_CH13 = 0x00002000,
CAN_TXREQ_CH14 = 0x00004000,
CAN_TXREQ_CH15 = 0x00008000,
CAN_TXREQ_CH16 = 0x00010000,
CAN_TXREQ_CH17 = 0x00020000,
CAN_TXREQ_CH18 = 0x00040000,
CAN_TXREQ_CH19 = 0x00080000,
CAN_TXREQ_CH20 = 0x00100000,
CAN_TXREQ_CH21 = 0x00200000,
CAN_TXREQ_CH22 = 0x00400000,
CAN_TXREQ_CH23 = 0x00800000,
CAN_TXREQ_CH24 = 0x01000000,
CAN_TXREQ_CH25 = 0x02000000,
CAN_TXREQ_CH26 = 0x04000000,
CAN_TXREQ_CH27 = 0x08000000,
CAN_TXREQ_CH28 = 0x10000000,
CAN_TXREQ_CH29 = 0x20000000,
CAN_TXREQ_CH30 = 0x40000000,
CAN_TXREQ_CH31 = 0x80000000
} CAN_TXREQ_CHANNEL;
//! Oscillator Control
typedef struct _CAN_OSC_CTRL {
uint32_t PllEnable : 1;
uint32_t OscDisable : 1;
uint32_t SclkDivide : 1;
uint32_t ClkOutDivide : 2;
#ifndef MCP2517FD
uint32_t LowPowerModeEnable : 1;
#endif
} CAN_OSC_CTRL;
//! Oscillator Status
typedef struct _CAN_OSC_STATUS {
uint32_t PllReady : 1;
uint32_t OscReady : 1;
uint32_t SclkReady : 1;
} CAN_OSC_STATUS;
//! ICODE
typedef enum {
CAN_ICODE_FIFO_CH0,
CAN_ICODE_FIFO_CH1,
CAN_ICODE_FIFO_CH2,
CAN_ICODE_FIFO_CH3,
CAN_ICODE_FIFO_CH4,
CAN_ICODE_FIFO_CH5,
CAN_ICODE_FIFO_CH6,
CAN_ICODE_FIFO_CH7,
CAN_ICODE_FIFO_CH8,
CAN_ICODE_FIFO_CH9,
CAN_ICODE_FIFO_CH10,
CAN_ICODE_FIFO_CH11,
CAN_ICODE_FIFO_CH12,
CAN_ICODE_FIFO_CH13,
CAN_ICODE_FIFO_CH14,
CAN_ICODE_FIFO_CH15,
CAN_ICODE_FIFO_CH16,
CAN_ICODE_FIFO_CH17,
CAN_ICODE_FIFO_CH18,
CAN_ICODE_FIFO_CH19,
CAN_ICODE_FIFO_CH20,
CAN_ICODE_FIFO_CH21,
CAN_ICODE_FIFO_CH22,
CAN_ICODE_FIFO_CH23,
CAN_ICODE_FIFO_CH24,
CAN_ICODE_FIFO_CH25,
CAN_ICODE_FIFO_CH26,
CAN_ICODE_FIFO_CH27,
CAN_ICODE_FIFO_CH28,
CAN_ICODE_FIFO_CH29,
CAN_ICODE_FIFO_CH30,
CAN_ICODE_FIFO_CH31,
CAN_ICODE_TOTAL_CHANNELS,
CAN_ICODE_NO_INT = 0x40,
CAN_ICODE_CERRIF,
CAN_ICODE_WAKIF,
CAN_ICODE_RXOVIF,
CAN_ICODE_ADDRERR_SERRIF,
CAN_ICODE_MABOV_SERRIF,
CAN_ICODE_TBCIF,
CAN_ICODE_MODIF,
CAN_ICODE_IVMIF,
CAN_ICODE_TEFIF,
CAN_ICODE_TXATIF,
CAN_ICODE_RESERVED
} CAN_ICODE;
//! RXCODE
typedef enum {
CAN_RXCODE_FIFO_CH1=1,
CAN_RXCODE_FIFO_CH2,
CAN_RXCODE_FIFO_CH3,
CAN_RXCODE_FIFO_CH4,
CAN_RXCODE_FIFO_CH5,
CAN_RXCODE_FIFO_CH6,
CAN_RXCODE_FIFO_CH7,
CAN_RXCODE_FIFO_CH8,
CAN_RXCODE_FIFO_CH9,
CAN_RXCODE_FIFO_CH10,
CAN_RXCODE_FIFO_CH11,
CAN_RXCODE_FIFO_CH12,
CAN_RXCODE_FIFO_CH13,
CAN_RXCODE_FIFO_CH14,
CAN_RXCODE_FIFO_CH15,
CAN_RXCODE_FIFO_CH16,
CAN_RXCODE_FIFO_CH17,
CAN_RXCODE_FIFO_CH18,
CAN_RXCODE_FIFO_CH19,
CAN_RXCODE_FIFO_CH20,
CAN_RXCODE_FIFO_CH21,
CAN_RXCODE_FIFO_CH22,
CAN_RXCODE_FIFO_CH23,
CAN_RXCODE_FIFO_CH24,
CAN_RXCODE_FIFO_CH25,
CAN_RXCODE_FIFO_CH26,
CAN_RXCODE_FIFO_CH27,
CAN_RXCODE_FIFO_CH28,
CAN_RXCODE_FIFO_CH29,
CAN_RXCODE_FIFO_CH30,
CAN_RXCODE_FIFO_CH31,
CAN_RXCODE_TOTAL_CHANNELS,
CAN_RXCODE_NO_INT = 0x40,
CAN_RXCODE_RESERVED
} CAN_RXCODE;
//! TXCODE
typedef enum {
CAN_TXCODE_FIFO_CH0,
CAN_TXCODE_FIFO_CH1,
CAN_TXCODE_FIFO_CH2,
CAN_TXCODE_FIFO_CH3,
CAN_TXCODE_FIFO_CH4,
CAN_TXCODE_FIFO_CH5,
CAN_TXCODE_FIFO_CH6,
CAN_TXCODE_FIFO_CH7,
CAN_TXCODE_FIFO_CH8,
CAN_TXCODE_FIFO_CH9,
CAN_TXCODE_FIFO_CH10,
CAN_TXCODE_FIFO_CH11,
CAN_TXCODE_FIFO_CH12,
CAN_TXCODE_FIFO_CH13,
CAN_TXCODE_FIFO_CH14,
CAN_TXCODE_FIFO_CH15,
CAN_TXCODE_FIFO_CH16,
CAN_TXCODE_FIFO_CH17,
CAN_TXCODE_FIFO_CH18,
CAN_TXCODE_FIFO_CH19,
CAN_TXCODE_FIFO_CH20,
CAN_TXCODE_FIFO_CH21,
CAN_TXCODE_FIFO_CH22,
CAN_TXCODE_FIFO_CH23,
CAN_TXCODE_FIFO_CH24,
CAN_TXCODE_FIFO_CH25,
CAN_TXCODE_FIFO_CH26,
CAN_TXCODE_FIFO_CH27,
CAN_TXCODE_FIFO_CH28,
CAN_TXCODE_FIFO_CH29,
CAN_TXCODE_FIFO_CH30,
CAN_TXCODE_FIFO_CH31,
CAN_TXCODE_TOTAL_CHANNELS,
CAN_TXCODE_NO_INT = 0x40,
CAN_TXCODE_RESERVED
} CAN_TXCODE;
//! System Clock Selection
typedef enum {
CAN_SYSCLK_40M,
CAN_SYSCLK_20M,
CAN_SYSCLK_10M
} CAN_SYSCLK_SPEED;
//! CLKO Divide
typedef enum {
OSC_CLKO_DIV1,
OSC_CLKO_DIV2,
OSC_CLKO_DIV4,
OSC_CLKO_DIV10
} OSC_CLKO_DIVIDE;
#ifdef __cplusplus // Provide C++ Compatibility
}
#endif
#endif // _DRV_CANFDSPI_DEFINES_H
+809
View File
@@ -0,0 +1,809 @@
/*******************************************************************************
CAN FD SPI Driver: Register Header File
Company:
Microchip Technology Inc.
File Name:
drv_canfdspi_register.h
Summary:
This header file contains SPI instruction defines, register address defines,
register structures, and reset values of registers.
Description:
This file is used by the API.
*******************************************************************************/
//DOM-IGNORE-BEGIN
/*******************************************************************************
Copyright (c) 2018 Microchip Technology Inc. and its subsidiaries.
Subject to your compliance with these terms, you may use Microchip software and
any derivatives exclusively with Microchip products. It is your responsibility
to comply with third party license terms applicable to your use of third party
software (including open source software) that may accompany Microchip software.
THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER EXPRESS,
IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES
OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER
RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF
THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT ALLOWED
BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO
THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, THAT YOU HAVE PAID
DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
*******************************************************************************/
//DOM-IGNORE-END
#ifndef _DRV_CANFDSPI_REGISTER_H
#define _DRV_CANFDSPI_REGISTER_H
// *****************************************************************************
// *****************************************************************************
// Section: Included Files
#include "mcp2518fd_can_def.h"
#include <Arduino.h>
#include <inttypes.h>
// DOM-IGNORE-BEGIN
#ifdef __cplusplus // Provide C++ Compatibility
extern "C" {
#endif
// DOM-IGNORE-END
// *****************************************************************************
// *****************************************************************************
/* SPI Instruction Set */
#define cINSTRUCTION_RESET 0x00
#define cINSTRUCTION_READ 0x03
#define cINSTRUCTION_READ_CRC 0x0B
#define cINSTRUCTION_WRITE 0x02
#define cINSTRUCTION_WRITE_CRC 0x0A
#define cINSTRUCTION_WRITE_SAFE 0x0C
// *****************************************************************************
// *****************************************************************************
/* Register Addresses */
/* CAN FD Controller */
#define cREGADDR_CiCON 0x000
#define cREGADDR_CiNBTCFG 0x004
#define cREGADDR_CiDBTCFG 0x008
#define cREGADDR_CiTDC 0x00C
#define cREGADDR_CiTBC 0x010
#define cREGADDR_CiTSCON 0x014
#define cREGADDR_CiVEC 0x018
#define cREGADDR_CiINT 0x01C
#define cREGADDR_CiINTFLAG cREGADDR_CiINT
#define cREGADDR_CiINTENABLE (cREGADDR_CiINT+2)
#define cREGADDR_CiRXIF 0x020
#define cREGADDR_CiTXIF 0x024
#define cREGADDR_CiRXOVIF 0x028
#define cREGADDR_CiTXATIF 0x02C
#define cREGADDR_CiTXREQ 0x030
#define cREGADDR_CiTREC 0x034
#define cREGADDR_CiBDIAG0 0x038
#define cREGADDR_CiBDIAG1 0x03C
#define cREGADDR_CiTEFCON 0x040
#define cREGADDR_CiTEFSTA 0x044
#define cREGADDR_CiTEFUA 0x048
#define cREGADDR_CiFIFOBA 0x04C
#define cREGADDR_CiFIFOCON 0x050
#define cREGADDR_CiFIFOSTA 0x054
#define cREGADDR_CiFIFOUA 0x058
#define CiFIFO_OFFSET (3*4)
#define cREGADDR_CiTXQCON 0x050
#define cREGADDR_CiTXQSTA 0x054
#define cREGADDR_CiTXQUA 0x058
// The filters start right after the FIFO control/status registers
#define cREGADDR_CiFLTCON (cREGADDR_CiFIFOCON+(CiFIFO_OFFSET*CAN_FIFO_TOTAL_CHANNELS))
#define cREGADDR_CiFLTOBJ (cREGADDR_CiFLTCON+CAN_FIFO_TOTAL_CHANNELS)
#define cREGADDR_CiMASK (cREGADDR_CiFLTOBJ+4)
#define CiFILTER_OFFSET (2*4)
/* MCP25xxFD Specific */
#define cREGADDR_OSC 0xE00
#define cREGADDR_IOCON 0xE04
#define cREGADDR_CRC 0xE08
#define cREGADDR_ECCCON 0xE0C
#define cREGADDR_ECCSTA 0xE10
#ifndef MCP2517FD
#define cREGADDR_DEVID 0xE14
#endif
/* RAM addresses */
#if defined(MCP2517FD) || defined(MCP2518FD)
#define cRAM_SIZE 2048
#endif
#define cRAMADDR_START 0x400
#define cRAMADDR_END (cRAMADDR_START+cRAM_SIZE)
/*spi cs set*/
extern uint8_t SPICS;
#if defined(MCP2517FD) || defined(MCP2518FD)
#define MCP2518fd_SELECT() pinMode(SPICS, OUTPUT); digitalWrite(SPICS, LOW)
#define MCP2518fd_UNSELECT() pinMode(SPICS, OUTPUT); digitalWrite(SPICS, HIGH)
#endif
// *****************************************************************************
// *****************************************************************************
/* Register Structures */
// *****************************************************************************
//! General 32-bit Register
typedef union _REG_t {
uint8_t byte[4];
uint32_t word;
} REG_t;
// *****************************************************************************
// *****************************************************************************
/* CAN FD Controller */
// *****************************************************************************
//! CAN Control Register
typedef union _REG_CiCON {
struct {
uint32_t DNetFilterCount : 5;
uint32_t IsoCrcEnable : 1;
uint32_t ProtocolExceptionEventDisable : 1;
uint32_t unimplemented1 : 1;
uint32_t WakeUpFilterEnable : 1;
uint32_t WakeUpFilterTime : 2;
uint32_t unimplemented2 : 1;
uint32_t BitRateSwitchDisable : 1;
uint32_t unimplemented3 : 3;
uint32_t RestrictReTxAttempts : 1;
uint32_t EsiInGatewayMode : 1;
uint32_t SystemErrorToListenOnly : 1;
uint32_t StoreInTEF : 1;
uint32_t TXQEnable : 1;
uint32_t OpMode : 3;
uint32_t RequestOpMode : 3;
uint32_t AbortAllTx : 1;
uint32_t TxBandWidthSharing : 4;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_CiCON;
// *****************************************************************************
//! Nominal Bit Time Configuration Register
typedef union _REG_CiNBTCFG {
struct {
uint32_t SJW : 7;
uint32_t unimplemented1 : 1;
uint32_t TSEG2 : 7;
uint32_t unimplemented2 : 1;
uint32_t TSEG1 : 8;
uint32_t BRP : 8;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_CiNBTCFG;
// *****************************************************************************
//! Data Bit Time Configuration Register
typedef union _REG_CiDBTCFG {
struct {
uint32_t SJW : 4;
uint32_t unimplemented1 : 4;
uint32_t TSEG2 : 4;
uint32_t unimplemented2 : 4;
uint32_t TSEG1 : 5;
uint32_t unimplemented3 : 3;
uint32_t BRP : 8;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_CiDBTCFG;
// *****************************************************************************
//! Transmitter Delay Compensation Register
typedef union _REG_CiTDC {
struct {
uint32_t TDCValue : 6;
uint32_t unimplemented1 : 2;
uint32_t TDCOffset : 7;
uint32_t unimplemented2 : 1;
uint32_t TDCMode : 2;
uint32_t unimplemented3 : 6;
uint32_t SID11Enable : 1;
uint32_t EdgeFilterEnable : 1;
uint32_t unimplemented4 : 6;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_CiTDC;
// *****************************************************************************
//! Time Stamp Configuration Register
typedef union _REG_CiTSCON {
struct {
uint32_t TBCPrescaler : 10;
uint32_t unimplemented1 : 6;
uint32_t TBCEnable : 1;
uint32_t TimeStampEOF : 1;
uint32_t unimplemented2 : 14;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_CiTSCON;
// *****************************************************************************
//! Interrupt Vector Register
typedef union _REG_CiVEC {
struct {
uint32_t ICODE : 7;
uint32_t unimplemented1 : 1;
uint32_t FilterHit : 5;
uint32_t unimplemented2 : 3;
uint32_t TXCODE : 7;
uint32_t unimplemented3 : 1;
uint32_t RXCODE : 7;
uint32_t unimplemented4 : 1;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_CiVEC;
// *****************************************************************************
//! Interrupt Flags
typedef struct _CAN_INT_FLAGS {
uint32_t TXIF : 1;
uint32_t RXIF : 1;
uint32_t TBCIF : 1;
uint32_t MODIF : 1;
uint32_t TEFIF : 1;
uint32_t unimplemented1 : 3;
uint32_t ECCIF : 1;
uint32_t SPICRCIF : 1;
uint32_t TXATIF : 1;
uint32_t RXOVIF : 1;
uint32_t SERRIF : 1;
uint32_t CERRIF : 1;
uint32_t WAKIF : 1;
uint32_t IVMIF : 1;
} CAN_INT_FLAGS;
// *****************************************************************************
//! Interrupt Enables
typedef struct _CAN_INT_ENABLES {
uint32_t TXIE : 1;
uint32_t RXIE : 1;
uint32_t TBCIE : 1;
uint32_t MODIE : 1;
uint32_t TEFIE : 1;
uint32_t unimplemented2 : 3;
uint32_t ECCIE : 1;
uint32_t SPICRCIE : 1;
uint32_t TXATIE : 1;
uint32_t RXOVIE : 1;
uint32_t SERRIE : 1;
uint32_t CERRIE : 1;
uint32_t WAKIE : 1;
uint32_t IVMIE : 1;
} CAN_INT_ENABLES;
// *****************************************************************************
//! Interrupt Register
typedef union _REG_CiINT {
struct {
CAN_INT_FLAGS IF;
CAN_INT_ENABLES IE;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_CiINT;
// *****************************************************************************
//! Interrupt Flag Register
typedef union _REG_CiINTFLAG {
CAN_INT_FLAGS IF;
uint16_t word;
uint8_t byte[2];
} REG_CiINTFLAG;
// *****************************************************************************
//! Interrupt Enable Register
typedef union _REG_CiINTENABLE {
CAN_INT_ENABLES IE;
uint16_t word;
uint8_t byte[2];
} REG_CiINTENABLE;
// *****************************************************************************
//! Transmit/Receive Error Count Register
typedef union _REG_CiTREC {
struct {
uint32_t RxErrorCount : 8;
uint32_t TxErrorCount : 8;
uint32_t ErrorStateWarning : 1;
uint32_t RxErrorStateWarning : 1;
uint32_t TxErrorStateWarning : 1;
uint32_t RxErrorStatePassive : 1;
uint32_t TxErrorStatePassive : 1;
uint32_t TxErrorStateBusOff : 1;
uint32_t unimplemented1 : 10;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_CiTREC;
// *****************************************************************************
//! Diagnostic Register 0
typedef union _REG_CiBDIAG0 {
struct {
uint32_t NRxErrorCount : 8;
uint32_t NTxErrorCount : 8;
uint32_t DRxErrorCount : 8;
uint32_t DTxErrorCount : 8;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_CiBDIAG0;
// *****************************************************************************
//! Diagnostic Register 1
typedef union _REG_CiBDIAG1 {
struct {
uint32_t ErrorFreeMsgCount : 16;
uint32_t NBit0Error : 1;
uint32_t NBit1Error : 1;
uint32_t NAckError : 1;
uint32_t NFormError : 1;
uint32_t NStuffError : 1;
uint32_t NCRCError : 1;
uint32_t unimplemented1 : 1;
uint32_t TXBOError : 1;
uint32_t DBit0Error : 1;
uint32_t DBit1Error : 1;
uint32_t DAckError : 1;
uint32_t DFormError : 1;
uint32_t DStuffError : 1;
uint32_t DCRCError : 1;
uint32_t ESI : 1;
uint32_t unimplemented2 : 1;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_CiBDIAG1;
// *****************************************************************************
//! Transmit Event FIFO Control Register
typedef union _REG_CiTEFCON {
struct {
uint32_t TEFNEIE : 1;
uint32_t TEFHFIE : 1;
uint32_t TEFFULIE : 1;
uint32_t TEFOVIE : 1;
uint32_t unimplemented1 : 1;
uint32_t TimeStampEnable : 1;
uint32_t unimplemented2 : 2;
uint32_t UINC : 1;
uint32_t unimplemented3 : 1;
uint32_t FRESET : 1;
uint32_t unimplemented4 : 13;
uint32_t FifoSize : 5;
uint32_t unimplemented5 : 3;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_CiTEFCON;
// *****************************************************************************
//! Transmit Event FIFO Status Register
typedef union _REG_CiTEFSTA {
struct {
uint32_t TEFNotEmptyIF : 1;
uint32_t TEFHalfFullIF : 1;
uint32_t TEFFullIF : 1;
uint32_t TEFOVIF : 1;
uint32_t unimplemented1 : 28;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_CiTEFSTA;
// *****************************************************************************
//! Transmit Queue Control Register
typedef union _REG_CiTXQCON {
struct {
uint32_t TxNotFullIE : 1;
uint32_t unimplemented1 : 1;
uint32_t TxEmptyIE : 1;
uint32_t unimplemented2 : 1;
uint32_t TxAttemptIE : 1;
uint32_t unimplemented3 : 2;
uint32_t TxEnable : 1;
uint32_t UINC : 1;
uint32_t TxRequest : 1;
uint32_t FRESET : 1;
uint32_t unimplemented4 : 5;
uint32_t TxPriority : 5;
uint32_t TxAttempts : 2;
uint32_t unimplemented5 : 1;
uint32_t FifoSize : 5;
uint32_t PayLoadSize : 3;
} txBF;
uint32_t word;
uint8_t byte[4];
} REG_CiTXQCON;
// *****************************************************************************
//! Transmit Queue Status Register
typedef union _REG_CiTXQSTA {
struct {
uint32_t TxNotFullIF : 1;
uint32_t unimplemented1 : 1;
uint32_t TxEmptyIF : 1;
uint32_t unimplemented2 : 1;
uint32_t TxAttemptIF : 1;
uint32_t TxError : 1;
uint32_t TxLostArbitration : 1;
uint32_t TxAborted : 1;
uint32_t FifoIndex : 5;
uint32_t unimplemented3 : 19;
} txBF;
uint32_t word;
uint8_t byte[4];
} REG_CiTXQSTA;
// *****************************************************************************
//! FIFO Control Register
typedef union _REG_CiFIFOCON {
// Receive FIFO
struct {
uint32_t RxNotEmptyIE : 1;
uint32_t RxHalfFullIE : 1;
uint32_t RxFullIE : 1;
uint32_t RxOverFlowIE : 1;
uint32_t unimplemented1 : 1;
uint32_t RxTimeStampEnable : 1;
uint32_t unimplemented2 : 1;
uint32_t TxEnable : 1;
uint32_t UINC : 1;
uint32_t unimplemented3 : 1;
uint32_t FRESET : 1;
uint32_t unimplemented4 : 13;
uint32_t FifoSize : 5;
uint32_t PayLoadSize : 3;
} rxBF;
// Transmit FIFO
struct {
uint32_t TxNotFullIE : 1;
uint32_t TxHalfFullIE : 1;
uint32_t TxEmptyIE : 1;
uint32_t unimplemented1 : 1;
uint32_t TxAttemptIE : 1;
uint32_t unimplemented2 : 1;
uint32_t RTREnable : 1;
uint32_t TxEnable : 1;
uint32_t UINC : 1;
uint32_t TxRequest : 1;
uint32_t FRESET : 1;
uint32_t unimplemented3 : 5;
uint32_t TxPriority : 5;
uint32_t TxAttempts : 2;
uint32_t unimplemented4 : 1;
uint32_t FifoSize : 5;
uint32_t PayLoadSize : 3;
} txBF;
uint32_t word;
uint8_t byte[4];
} REG_CiFIFOCON;
// *****************************************************************************
//! FIFO Status Register
typedef union _REG_CiFIFOSTA {
// Receive FIFO
struct {
uint32_t RxNotEmptyIF : 1;
uint32_t RxHalfFullIF : 1;
uint32_t RxFullIF : 1;
uint32_t RxOverFlowIF : 1;
uint32_t unimplemented1 : 4;
uint32_t FifoIndex : 5;
uint32_t unimplemented2 : 19;
} rxBF;
// Transmit FIFO
struct {
uint32_t TxNotFullIF : 1;
uint32_t TxHalfFullIF : 1;
uint32_t TxEmptyIF : 1;
uint32_t unimplemented1 : 1;
uint32_t TxAttemptIF : 1;
uint32_t TxError : 1;
uint32_t TxLostArbitration : 1;
uint32_t TxAborted : 1;
uint32_t FifoIndex : 5;
uint32_t unimplemented2 : 19;
} txBF;
uint32_t word;
uint8_t byte[4];
} REG_CiFIFOSTA;
// *****************************************************************************
//! FIFO User Address Register
typedef union _REG_CiFIFOUA {
struct {
uint32_t UserAddress : 12;
uint32_t unimplemented1 : 20;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_CiFIFOUA;
// *****************************************************************************
//! Filter Control Register
typedef union _REG_CiFLTCON_BYTE {
struct {
uint32_t BufferPointer : 5;
uint32_t unimplemented1 : 2;
uint32_t Enable : 1;
} bF;
uint8_t byte;
} REG_CiFLTCON_BYTE;
// *****************************************************************************
//! Filter Object Register
typedef union _REG_CiFLTOBJ {
CAN_FILTEROBJ_ID bF;
uint32_t word;
uint8_t byte[4];
} REG_CiFLTOBJ;
// *****************************************************************************
//! Mask Object Register
typedef union _REG_CiMASK {
CAN_MASKOBJ_ID bF;
uint32_t word;
uint8_t byte[4];
} REG_CiMASK;
// *****************************************************************************
// *****************************************************************************
/* MCP25xxFD Specific */
// *****************************************************************************
//! Oscillator Control Register
typedef union _REG_OSC {
struct {
uint32_t PllEnable : 1;
uint32_t unimplemented1 : 1;
uint32_t OscDisable : 1;
#ifdef MCP2517FD
uint32_t unimplemented2 : 1;
#else
uint32_t LowPowerModeEnable : 1;
#endif
uint32_t SCLKDIV : 1;
uint32_t CLKODIV : 2;
uint32_t unimplemented3 : 1;
uint32_t PllReady : 1;
uint32_t unimplemented4 : 1;
uint32_t OscReady : 1;
uint32_t unimplemented5 : 1;
uint32_t SclkReady : 1;
uint32_t unimplemented6 : 19;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_OSC;
// *****************************************************************************
//! I/O Control Register
typedef union _REG_IOCON {
struct {
uint32_t TRIS0 : 1;
uint32_t TRIS1 : 1;
uint32_t unimplemented1 : 2;
uint32_t ClearAutoSleepOnMatch : 1;
uint32_t AutoSleepEnable : 1;
uint32_t XcrSTBYEnable : 1;
uint32_t unimplemented2 : 1;
uint32_t LAT0 : 1;
uint32_t LAT1 : 1;
uint32_t unimplemented3 : 5;
uint32_t HVDETSEL : 1;
uint32_t GPIO0 : 1;
uint32_t GPIO1 : 1;
uint32_t unimplemented4 : 6;
uint32_t PinMode0 : 1;
uint32_t PinMode1 : 1;
uint32_t unimplemented5 : 2;
uint32_t TXCANOpenDrain : 1;
uint32_t SOFOutputEnable : 1;
uint32_t INTPinOpenDrain : 1;
uint32_t unimplemented6 : 1;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_IOCON;
// *****************************************************************************
//! CRC Regsiter
typedef union _REG_CRC {
struct {
uint32_t CRC : 16;
uint32_t CRCERRIF : 1;
uint32_t FERRIF : 1;
uint32_t unimplemented1 : 6;
uint32_t CRCERRIE : 1;
uint32_t FERRIE : 1;
uint32_t unimplemented2 : 6;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_CRC;
// *****************************************************************************
//! ECC Control Register
typedef union _REG_ECCCON {
struct {
uint32_t EccEn : 1;
uint32_t SECIE : 1;
uint32_t DEDIE : 1;
uint32_t unimplemented1 : 5;
uint32_t Parity : 7;
uint32_t unimplemented2 : 17;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_ECCCON;
// *****************************************************************************
//! ECC Status Register
typedef union _REG_ECCSTA {
struct {
uint32_t unimplemented1 : 1;
uint32_t SECIF : 1;
uint32_t DEDIF : 1;
uint32_t unimplemented2 : 13;
uint32_t ErrorAddress : 12;
uint32_t unimplemented3 : 4;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_ECCSTA;
// *****************************************************************************
//! DEVID Register
#ifndef MCP2517FD
typedef union _REG_DEVID {
struct {
uint32_t REV : 4;
uint32_t DEV : 4;
uint32_t unimplemented : 24;
} bF;
uint32_t word;
uint8_t byte[4];
} REG_DEVID;
#endif
// *****************************************************************************
// *****************************************************************************
/* Register Reset Values */
// *****************************************************************************
/* CAN FD Controller */
// Control Register Reset Values up to FIFOs
static const uint32_t canControlResetValues[] = {
/* Address 0x000 to 0x00C */
0x04980760, 0x003E0F0F, 0x000E0303, 0x00021000,
/* Address 0x010 to 0x01C */
0x00000000, 0x00000000, 0x40400040, 0x00000000,
/* Address 0x020 to 0x02C */
0x00000000, 0x00000000, 0x00000000, 0x00000000,
/* Address 0x030 to 0x03C */
0x00000000, 0x00200000, 0x00000000, 0x00000000,
/* Address 0x040 to 0x04C */
0x00000400, 0x00000000, 0x00000000, 0x00000000
};
// FIFO Register Reset Values
static const uint32_t canFifoResetValues[] = {
0x00600400, 0x00000000, 0x00000000
};
// Filter Control Register Reset Values
static const uint32_t canFilterControlResetValue = 0x00000000;
// Filter and Mask Object Reset Values
static const uint32_t canFilterObjectResetValues[] = {
0x00000000, 0x00000000
};
// *****************************************************************************
/* MCP25xxFD */
#if defined(MCP2517FD) || defined(MCP2518FD)
static const uint32_t mcp25xxfdControlResetValues[] = {
0x00000460, 0x00000003, 0x00000000, 0x00000000, 0x00000000
};
#endif
#ifdef __cplusplus // Provide C++ Compatibility
}
#endif
#endif // _DRV_CANFDSPI_REGISTER_H