Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of SEEED_CAN by
seeed_can_api.h
00001 /* seeed_can_api.h 00002 * Copyright (c) 2013 Sophie Dexter 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 #ifndef _SEEED_CAN_API_H_ 00017 #define _SEEED_CAN_API_H_ 00018 00019 #include "seeed_can_spi.h" 00020 00021 // print debug information... 00022 //#define DEBUG 00023 00024 #ifdef __cplusplus 00025 extern "C" { 00026 #endif 00027 00028 /** CAN driver typedefs 00029 */ 00030 00031 // The 'MCP_xyz' structs mimic MCP register organisations 00032 // A union of the struct and a simple array can be used to: 00033 // Process and manipulate the struct in an ordered way 00034 // Copy the struct to/from the MCP2512 as an array 00035 00036 /// Type definition to hold an MCP2515 Timing Register set structure 00037 struct MCP_CANtiming { 00038 uint8_t phseg2 : 3; // PS2 length bits 2..0 (PHSEG2 + 1) Tq (minimum valid setting is 2 Tq) 00039 uint8_t reserved1 : 3; // Unused bits (read as '0') 00040 uint8_t wakfil : 1; // Wake-up filter enable bit (1 = enabled, 0 = disabled) 00041 uint8_t sof : 1; // Start of frame bit (1 = CLKOUT pin is SOF, 0 = CLKOUT is clock) 00042 uint8_t prseg : 3; // Propagation Segment length bits 2..0 (PRSEG + 1) Tq (minimum valid setting is 1 Tq) 00043 uint8_t phseg1 : 3; // PS2 length bits 2..0 (PRSEG + 1) Tq (minimum valid setting is 1 Tq) 00044 uint8_t sam : 1; // Sample Point Configuration bit (1 = Bus line is sampled 3 times, 0 = sampled once) 00045 uint8_t btlmode : 1; // PS2 Bit Time Length (1 = determined by phseg2, 0 = greater of PS1 an IPT (2 Tq)) 00046 uint8_t brp : 6; // Baud Rate Prescaler bits 5..0 (Tq = 2 x (BRP + 1) / Fosc) 00047 uint8_t sjw : 2; // Synchronisation Jump Width Length bits 1..0 ((SJW + 1) Tq) 00048 }; 00049 typedef struct MCP_CANtiming CANtiming; 00050 00051 /// Type definition to hold an MCP2515 CAN id structure 00052 struct MCP_CANid { 00053 uint8_t sid10_3 : 8; // Bits 10..3 of a standard identifier 00054 uint8_t eid17_16 : 2; // Bits 17..16 of an extended identifier 00055 uint8_t reserved1 : 1; // Unused bit in RXBbSIDL 00056 uint8_t ide : 1; // Extended Identifier Flag 00057 // CANformat 'type' 00058 uint8_t srtr : 1; // Standard Frame Remote Transmit Request Bit (valid when IDE = 0) 00059 // CANtype 'type' 00060 // Unimplimented in TXBnSIDL, filters and acceptance masks 00061 uint8_t sid2_0 : 3; // Bits 2..0 of a standard identifier 00062 uint8_t eid15_8 : 8; // Bits 15..8 of an extended identifier 00063 uint8_t eid7_0 : 8; // Bits 7..0 of an extended identifier 00064 }; 00065 typedef struct MCP_CANid CANid; 00066 00067 /// Type definition to hold an MCP2515 CAN id structure 00068 struct MCP_CANMsg { 00069 CANid id; 00070 uint8_t dlc : 4; // Bits 3..0: DLC - Data Length Counter 00071 uint8_t reserved1 : 2; // unused bits in RXBnDLC 00072 uint8_t ertr : 1; // Extended Frame Remote Transmit Request Bit (valid when IDE = 1) 00073 // CANtype 'type' 00074 uint8_t reserved2 : 1; // unused bit in RXBnDLC 00075 uint8_t data[8]; // CAN Message Data Bytes 0-7 00076 }; 00077 typedef struct MCP_CANMsg CANMsg; 00078 00079 #ifndef MBED_CAN_HELPER_H // These are already defined for some mbed family members 00080 enum CANFormat { 00081 CANStandard = 0, 00082 CANExtended = 1 00083 }; 00084 typedef enum CANFormat CANFormat; 00085 00086 enum CANType { 00087 CANData = 0, 00088 CANRemote = 1 00089 }; 00090 typedef enum CANType CANType; 00091 00092 struct CAN_Message { 00093 unsigned int id; // 11 or 29 bit identifier 00094 unsigned char data[8]; // Data field 00095 unsigned char len; // Length of data field in bytes 00096 CANFormat format; // 0 - STANDARD, 1- EXTENDED IDENTIFIER 00097 CANType type; // 0 - DATA FRAME, 1 - REMOTE FRAME 00098 }; 00099 typedef struct CAN_Message CAN_Message; 00100 #endif 00101 00102 enum MCP_Mode { 00103 _M_NORMAL, 00104 _M_SLEEP, 00105 _M_LOOPBACK, 00106 _M_MONITOR, 00107 _M_CONFIG, 00108 _M_RESET, 00109 }; 00110 typedef MCP_Mode CANMode; 00111 00112 enum MCP_Error_Flags { 00113 _E_ALL, 00114 _E_ERRORS, 00115 _E_WARNINGS, 00116 _E_RX1OVR, 00117 _E_RX0OVR, 00118 _E_TXBO, 00119 _E_TXEP, 00120 _E_RXEP, 00121 _E_TXWAR, 00122 _E_RXWAR, 00123 _E_EWARN 00124 }; 00125 typedef MCP_Error_Flags CANFlags; 00126 00127 enum MCP_Interrupt_Flags { 00128 _I_NONE, 00129 _I_ANY, 00130 _I_RX, 00131 _I_TX, 00132 _I_RX0, 00133 _I_RX1, 00134 _I_TX0, 00135 _I_TX1, 00136 _I_TX2, 00137 _I_ERROR, 00138 _I_WAKE, 00139 _I_M_ERR 00140 }; 00141 typedef MCP_Interrupt_Flags CANIrqs; 00142 00143 /** CAN driver functions 00144 */ 00145 uint8_t mcpInit(mcp_can_t *obj, // Initialise the MCP2515 and set the bit rate 00146 const uint32_t bitRate, 00147 const CANMode mode); 00148 uint8_t mcpSetMode(mcp_can_t *obj, const uint8_t newmode); // set the MCP2515's operation mode 00149 uint8_t mcpSetBitRate(mcp_can_t *obj, const uint32_t bitRate); // set bitrate 00150 00151 void mcpWriteId(mcp_can_t *obj, // write a CAN id 00152 const uint8_t mcp_addr, 00153 const uint8_t ext, 00154 const uint32_t id ); 00155 uint8_t mcpCanRead(mcp_can_t *obj, CAN_Message *msg); // read a CAN message 00156 uint8_t mcpCanWrite(mcp_can_t *obj, CAN_Message msg); // write a CAN message 00157 00158 uint8_t mcpInitMask(mcp_can_t *obj, // initialise an Acceptance Mask 00159 uint8_t num, 00160 uint32_t ulData, 00161 bool ext); 00162 uint8_t mcpInitFilter(mcp_can_t *obj, // initialise an Acceptance Filter 00163 uint8_t num, 00164 uint32_t ulData, 00165 bool ext); 00166 00167 uint8_t mcpErrorType(mcp_can_t *obj, const CANFlags type); // Report on the specified errors and warnings 00168 uint8_t mcpErrorFlags(mcp_can_t *obj); // Return contents of the error and warning flags register 00169 uint8_t mcpReceptionErrorCount(mcp_can_t *obj); // number of message reception errors 00170 uint8_t mcpTransmissionErrorCount(mcp_can_t *obj); // number of message transmission errors 00171 00172 void mcpMonitor(mcp_can_t *obj, const bool silent); // Select between monitor (silent = 1) and normal (silent = 0) modes 00173 uint8_t mcpMode(mcp_can_t *obj, const CANMode mode); // Change CAN operation to the specified mode 00174 00175 void mcpSetInterrupts(mcp_can_t *obj, const CANIrqs irqSet); // Configure interrupt sources 00176 uint8_t mcpInterruptType(mcp_can_t *obj, const CANIrqs irqFlag); // Report on the specified interrupt causes 00177 uint8_t mcpInterruptFlags(mcp_can_t *obj); // Return contents of the interrupt flags register 00178 00179 #ifdef __cplusplus 00180 }; 00181 #endif 00182 00183 #endif // SEEED_CAN_API_H
Generated on Tue Jul 12 2022 19:07:56 by
1.7.2
