Date: March 20, 2011 This library is created from "LPC17xx CMSIS-Compliant Standard Peripheral Firmware Driver Library (GNU, Keil, IAR) (Jan 28, 2011)", available from NXP's website, under "All microcontrollers support documents" [[http://ics.nxp.com/support/documents/microcontrollers/?type=software]] You will need to follow [[/projects/libraries/svn/mbed/trunk/LPC1768/LPC17xx.h]] while using this library Examples provided here [[/users/frank26080115/programs/LPC1700CMSIS_Examples/]] The beautiful thing is that NXP does not place copyright protection on any of the files in here Only a few modifications are made to make it compile with the mbed online compiler, I fixed some warnings as well. This is untested as of March 20, 2011 Forum post about this library: [[/forum/mbed/topic/2030/]]
lpc17xx_can.c@0:84d7747641aa, 2011-03-20 (annotated)
- Committer:
- frank26080115
- Date:
- Sun Mar 20 18:45:15 2011 +0000
- Revision:
- 0:84d7747641aa
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
frank26080115 | 0:84d7747641aa | 1 | /***********************************************************************//** |
frank26080115 | 0:84d7747641aa | 2 | * @file lpc17xx_can.c |
frank26080115 | 0:84d7747641aa | 3 | * @brief Contains all functions support for CAN firmware library on LPC17xx |
frank26080115 | 0:84d7747641aa | 4 | * @version 3.2 |
frank26080115 | 0:84d7747641aa | 5 | * @date 06. Dec. 2010 |
frank26080115 | 0:84d7747641aa | 6 | * @author NXP MCU SW Application Team |
frank26080115 | 0:84d7747641aa | 7 | ************************************************************************** |
frank26080115 | 0:84d7747641aa | 8 | * Software that is described herein is for illustrative purposes only |
frank26080115 | 0:84d7747641aa | 9 | * which provides customers with programming information regarding the |
frank26080115 | 0:84d7747641aa | 10 | * products. This software is supplied "AS IS" without any warranties. |
frank26080115 | 0:84d7747641aa | 11 | * NXP Semiconductors assumes no responsibility or liability for the |
frank26080115 | 0:84d7747641aa | 12 | * use of the software, conveys no license or title under any patent, |
frank26080115 | 0:84d7747641aa | 13 | * copyright, or mask work right to the product. NXP Semiconductors |
frank26080115 | 0:84d7747641aa | 14 | * reserves the right to make changes in the software without |
frank26080115 | 0:84d7747641aa | 15 | * notification. NXP Semiconductors also make no representation or |
frank26080115 | 0:84d7747641aa | 16 | * warranty that such application will be suitable for the specified |
frank26080115 | 0:84d7747641aa | 17 | * use without further testing or modification. |
frank26080115 | 0:84d7747641aa | 18 | **********************************************************************/ |
frank26080115 | 0:84d7747641aa | 19 | |
frank26080115 | 0:84d7747641aa | 20 | /* Peripheral group ----------------------------------------------------------- */ |
frank26080115 | 0:84d7747641aa | 21 | /** @addtogroup CAN |
frank26080115 | 0:84d7747641aa | 22 | * @{ |
frank26080115 | 0:84d7747641aa | 23 | */ |
frank26080115 | 0:84d7747641aa | 24 | |
frank26080115 | 0:84d7747641aa | 25 | /* Includes ------------------------------------------------------------------- */ |
frank26080115 | 0:84d7747641aa | 26 | #include "lpc17xx_can.h" |
frank26080115 | 0:84d7747641aa | 27 | #include "lpc17xx_clkpwr.h" |
frank26080115 | 0:84d7747641aa | 28 | |
frank26080115 | 0:84d7747641aa | 29 | /* If this source file built with example, the LPC17xx FW library configuration |
frank26080115 | 0:84d7747641aa | 30 | * file in each example directory ("lpc17xx_libcfg.h") must be included, |
frank26080115 | 0:84d7747641aa | 31 | * otherwise the default FW library configuration file must be included instead |
frank26080115 | 0:84d7747641aa | 32 | */ |
frank26080115 | 0:84d7747641aa | 33 | #ifdef __BUILD_WITH_EXAMPLE__ |
frank26080115 | 0:84d7747641aa | 34 | #include "lpc17xx_libcfg.h" |
frank26080115 | 0:84d7747641aa | 35 | #else |
frank26080115 | 0:84d7747641aa | 36 | #include "lpc17xx_libcfg_default.h" |
frank26080115 | 0:84d7747641aa | 37 | #endif /* __BUILD_WITH_EXAMPLE__ */ |
frank26080115 | 0:84d7747641aa | 38 | |
frank26080115 | 0:84d7747641aa | 39 | |
frank26080115 | 0:84d7747641aa | 40 | #ifdef _CAN |
frank26080115 | 0:84d7747641aa | 41 | |
frank26080115 | 0:84d7747641aa | 42 | /* Private Variables ---------------------------------------------------------- */ |
frank26080115 | 0:84d7747641aa | 43 | /** @defgroup CAN_Private_Variables CAN Private Variables |
frank26080115 | 0:84d7747641aa | 44 | * @{ |
frank26080115 | 0:84d7747641aa | 45 | */ |
frank26080115 | 0:84d7747641aa | 46 | |
frank26080115 | 0:84d7747641aa | 47 | FunctionalState FULLCAN_ENABLE; |
frank26080115 | 0:84d7747641aa | 48 | |
frank26080115 | 0:84d7747641aa | 49 | |
frank26080115 | 0:84d7747641aa | 50 | /* Counts number of filters (CAN message objects) used */ |
frank26080115 | 0:84d7747641aa | 51 | uint16_t CANAF_FullCAN_cnt = 0; |
frank26080115 | 0:84d7747641aa | 52 | uint16_t CANAF_std_cnt = 0; |
frank26080115 | 0:84d7747641aa | 53 | uint16_t CANAF_gstd_cnt = 0; |
frank26080115 | 0:84d7747641aa | 54 | uint16_t CANAF_ext_cnt = 0; |
frank26080115 | 0:84d7747641aa | 55 | uint16_t CANAF_gext_cnt = 0; |
frank26080115 | 0:84d7747641aa | 56 | |
frank26080115 | 0:84d7747641aa | 57 | /* End of Private Variables ----------------------------------------------------*/ |
frank26080115 | 0:84d7747641aa | 58 | /** |
frank26080115 | 0:84d7747641aa | 59 | * @} |
frank26080115 | 0:84d7747641aa | 60 | */ |
frank26080115 | 0:84d7747641aa | 61 | |
frank26080115 | 0:84d7747641aa | 62 | /* Private Variables ---------------------------------------------------------- */ |
frank26080115 | 0:84d7747641aa | 63 | static void can_SetBaudrate (LPC_CAN_TypeDef *CANx, uint32_t baudrate); |
frank26080115 | 0:84d7747641aa | 64 | |
frank26080115 | 0:84d7747641aa | 65 | /*********************************************************************//** |
frank26080115 | 0:84d7747641aa | 66 | * @brief Setting CAN baud rate (bps) |
frank26080115 | 0:84d7747641aa | 67 | * @param[in] CANx point to LPC_CAN_TypeDef object, should be: |
frank26080115 | 0:84d7747641aa | 68 | * - LPC_CAN1: CAN1 peripheral |
frank26080115 | 0:84d7747641aa | 69 | * - LPC_CAN2: CAN2 peripheral |
frank26080115 | 0:84d7747641aa | 70 | * @param[in] baudrate: is the baud rate value will be set |
frank26080115 | 0:84d7747641aa | 71 | * @return None |
frank26080115 | 0:84d7747641aa | 72 | ***********************************************************************/ |
frank26080115 | 0:84d7747641aa | 73 | static void can_SetBaudrate (LPC_CAN_TypeDef *CANx, uint32_t baudrate) |
frank26080115 | 0:84d7747641aa | 74 | { |
frank26080115 | 0:84d7747641aa | 75 | uint32_t result = 0; |
frank26080115 | 0:84d7747641aa | 76 | uint8_t NT, TSEG1 = 0, TSEG2 = 0, BRFail; |
frank26080115 | 0:84d7747641aa | 77 | uint32_t CANPclk = 0; |
frank26080115 | 0:84d7747641aa | 78 | uint32_t BRP = 0; |
frank26080115 | 0:84d7747641aa | 79 | CHECK_PARAM(PARAM_CANx(CANx)); |
frank26080115 | 0:84d7747641aa | 80 | |
frank26080115 | 0:84d7747641aa | 81 | if (CANx == LPC_CAN1) |
frank26080115 | 0:84d7747641aa | 82 | { |
frank26080115 | 0:84d7747641aa | 83 | CANPclk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_CAN1); |
frank26080115 | 0:84d7747641aa | 84 | } |
frank26080115 | 0:84d7747641aa | 85 | else |
frank26080115 | 0:84d7747641aa | 86 | { |
frank26080115 | 0:84d7747641aa | 87 | CANPclk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_CAN2); |
frank26080115 | 0:84d7747641aa | 88 | } |
frank26080115 | 0:84d7747641aa | 89 | result = CANPclk / baudrate; |
frank26080115 | 0:84d7747641aa | 90 | /* Calculate suitable nominal time value |
frank26080115 | 0:84d7747641aa | 91 | * NT (nominal time) = (TSEG1 + TSEG2 + 3) |
frank26080115 | 0:84d7747641aa | 92 | * NT <= 24 |
frank26080115 | 0:84d7747641aa | 93 | * TSEG1 >= 2*TSEG2 |
frank26080115 | 0:84d7747641aa | 94 | */ |
frank26080115 | 0:84d7747641aa | 95 | BRFail = 1; |
frank26080115 | 0:84d7747641aa | 96 | for(NT=24;NT>0;NT=NT-2) |
frank26080115 | 0:84d7747641aa | 97 | { |
frank26080115 | 0:84d7747641aa | 98 | if ((result%NT)==0) |
frank26080115 | 0:84d7747641aa | 99 | { |
frank26080115 | 0:84d7747641aa | 100 | BRP = result / NT - 1; |
frank26080115 | 0:84d7747641aa | 101 | NT--; |
frank26080115 | 0:84d7747641aa | 102 | TSEG2 = (NT/3) - 1; |
frank26080115 | 0:84d7747641aa | 103 | TSEG1 = NT -(NT/3) - 1; |
frank26080115 | 0:84d7747641aa | 104 | BRFail = 0; |
frank26080115 | 0:84d7747641aa | 105 | break; |
frank26080115 | 0:84d7747641aa | 106 | } |
frank26080115 | 0:84d7747641aa | 107 | } |
frank26080115 | 0:84d7747641aa | 108 | if(BRFail) |
frank26080115 | 0:84d7747641aa | 109 | while(1); // Failed to calculate exact CAN baud rate |
frank26080115 | 0:84d7747641aa | 110 | /* Enter reset mode */ |
frank26080115 | 0:84d7747641aa | 111 | CANx->MOD = 0x01; |
frank26080115 | 0:84d7747641aa | 112 | /* Set bit timing |
frank26080115 | 0:84d7747641aa | 113 | * Default: SAM = 0x00; |
frank26080115 | 0:84d7747641aa | 114 | * SJW = 0x03; |
frank26080115 | 0:84d7747641aa | 115 | */ |
frank26080115 | 0:84d7747641aa | 116 | CANx->BTR = (TSEG2<<20)|(TSEG1<<16)|(3<<14)|BRP; |
frank26080115 | 0:84d7747641aa | 117 | /* Return to normal operating */ |
frank26080115 | 0:84d7747641aa | 118 | CANx->MOD = 0; |
frank26080115 | 0:84d7747641aa | 119 | } |
frank26080115 | 0:84d7747641aa | 120 | /* End of Private Functions ----------------------------------------------------*/ |
frank26080115 | 0:84d7747641aa | 121 | |
frank26080115 | 0:84d7747641aa | 122 | |
frank26080115 | 0:84d7747641aa | 123 | /* Public Functions ----------------------------------------------------------- */ |
frank26080115 | 0:84d7747641aa | 124 | /** @addtogroup CAN_Public_Functions |
frank26080115 | 0:84d7747641aa | 125 | * @{ |
frank26080115 | 0:84d7747641aa | 126 | */ |
frank26080115 | 0:84d7747641aa | 127 | |
frank26080115 | 0:84d7747641aa | 128 | /********************************************************************//** |
frank26080115 | 0:84d7747641aa | 129 | * @brief Initialize CAN peripheral with given baudrate |
frank26080115 | 0:84d7747641aa | 130 | * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: |
frank26080115 | 0:84d7747641aa | 131 | * - LPC_CAN1: CAN1 peripheral |
frank26080115 | 0:84d7747641aa | 132 | * - LPC_CAN2: CAN2 peripheral |
frank26080115 | 0:84d7747641aa | 133 | * @param[in] baudrate: the value of CAN baudrate will be set (bps) |
frank26080115 | 0:84d7747641aa | 134 | * @return None |
frank26080115 | 0:84d7747641aa | 135 | *********************************************************************/ |
frank26080115 | 0:84d7747641aa | 136 | void CAN_Init(LPC_CAN_TypeDef *CANx, uint32_t baudrate) |
frank26080115 | 0:84d7747641aa | 137 | { |
frank26080115 | 0:84d7747641aa | 138 | uint16_t i; |
frank26080115 | 0:84d7747641aa | 139 | CHECK_PARAM(PARAM_CANx(CANx)); |
frank26080115 | 0:84d7747641aa | 140 | |
frank26080115 | 0:84d7747641aa | 141 | if(CANx == LPC_CAN1) |
frank26080115 | 0:84d7747641aa | 142 | { |
frank26080115 | 0:84d7747641aa | 143 | /* Turn on power and clock for CAN1 */ |
frank26080115 | 0:84d7747641aa | 144 | CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN1, ENABLE); |
frank26080115 | 0:84d7747641aa | 145 | /* Set clock divide for CAN1 */ |
frank26080115 | 0:84d7747641aa | 146 | } |
frank26080115 | 0:84d7747641aa | 147 | else |
frank26080115 | 0:84d7747641aa | 148 | { |
frank26080115 | 0:84d7747641aa | 149 | /* Turn on power and clock for CAN1 */ |
frank26080115 | 0:84d7747641aa | 150 | CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN2, ENABLE); |
frank26080115 | 0:84d7747641aa | 151 | /* Set clock divide for CAN2 */ |
frank26080115 | 0:84d7747641aa | 152 | } |
frank26080115 | 0:84d7747641aa | 153 | CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_CAN1, CLKPWR_PCLKSEL_CCLK_DIV_2); |
frank26080115 | 0:84d7747641aa | 154 | CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_CAN2, CLKPWR_PCLKSEL_CCLK_DIV_2); |
frank26080115 | 0:84d7747641aa | 155 | CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_ACF, CLKPWR_PCLKSEL_CCLK_DIV_2); |
frank26080115 | 0:84d7747641aa | 156 | |
frank26080115 | 0:84d7747641aa | 157 | CANx->MOD = 1; // Enter Reset Mode |
frank26080115 | 0:84d7747641aa | 158 | CANx->IER = 0; // Disable All CAN Interrupts |
frank26080115 | 0:84d7747641aa | 159 | CANx->GSR = 0; |
frank26080115 | 0:84d7747641aa | 160 | /* Request command to release Rx, Tx buffer and clear data overrun */ |
frank26080115 | 0:84d7747641aa | 161 | //CANx->CMR = CAN_CMR_AT | CAN_CMR_RRB | CAN_CMR_CDO; |
frank26080115 | 0:84d7747641aa | 162 | CANx->CMR = (1<<1)|(1<<2)|(1<<3); |
frank26080115 | 0:84d7747641aa | 163 | /* Read to clear interrupt pending in interrupt capture register */ |
frank26080115 | 0:84d7747641aa | 164 | volatile uint32_t temp = CANx->ICR; |
frank26080115 | 0:84d7747641aa | 165 | CANx->MOD = 0;// Return Normal operating |
frank26080115 | 0:84d7747641aa | 166 | |
frank26080115 | 0:84d7747641aa | 167 | //Reset CANAF value |
frank26080115 | 0:84d7747641aa | 168 | LPC_CANAF->AFMR = 0x01; |
frank26080115 | 0:84d7747641aa | 169 | |
frank26080115 | 0:84d7747641aa | 170 | //clear ALUT RAM |
frank26080115 | 0:84d7747641aa | 171 | for (i = 0; i < 512; i++) { |
frank26080115 | 0:84d7747641aa | 172 | LPC_CANAF_RAM->mask[i] = 0x00; |
frank26080115 | 0:84d7747641aa | 173 | } |
frank26080115 | 0:84d7747641aa | 174 | |
frank26080115 | 0:84d7747641aa | 175 | LPC_CANAF->SFF_sa = 0x00; |
frank26080115 | 0:84d7747641aa | 176 | LPC_CANAF->SFF_GRP_sa = 0x00; |
frank26080115 | 0:84d7747641aa | 177 | LPC_CANAF->EFF_sa = 0x00; |
frank26080115 | 0:84d7747641aa | 178 | LPC_CANAF->EFF_GRP_sa = 0x00; |
frank26080115 | 0:84d7747641aa | 179 | LPC_CANAF->ENDofTable = 0x00; |
frank26080115 | 0:84d7747641aa | 180 | |
frank26080115 | 0:84d7747641aa | 181 | LPC_CANAF->AFMR = 0x00; |
frank26080115 | 0:84d7747641aa | 182 | /* Set baudrate */ |
frank26080115 | 0:84d7747641aa | 183 | can_SetBaudrate (CANx, baudrate); |
frank26080115 | 0:84d7747641aa | 184 | } |
frank26080115 | 0:84d7747641aa | 185 | |
frank26080115 | 0:84d7747641aa | 186 | /********************************************************************//** |
frank26080115 | 0:84d7747641aa | 187 | * @brief CAN deInit |
frank26080115 | 0:84d7747641aa | 188 | * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: |
frank26080115 | 0:84d7747641aa | 189 | * - LPC_CAN1: CAN1 peripheral |
frank26080115 | 0:84d7747641aa | 190 | * - LPC_CAN2: CAN2 peripheral |
frank26080115 | 0:84d7747641aa | 191 | * @return None |
frank26080115 | 0:84d7747641aa | 192 | *********************************************************************/ |
frank26080115 | 0:84d7747641aa | 193 | void CAN_DeInit(LPC_CAN_TypeDef *CANx) |
frank26080115 | 0:84d7747641aa | 194 | { |
frank26080115 | 0:84d7747641aa | 195 | CHECK_PARAM(PARAM_CANx(CANx)); |
frank26080115 | 0:84d7747641aa | 196 | |
frank26080115 | 0:84d7747641aa | 197 | if(CANx == LPC_CAN1) |
frank26080115 | 0:84d7747641aa | 198 | { |
frank26080115 | 0:84d7747641aa | 199 | /* Turn on power and clock for CAN1 */ |
frank26080115 | 0:84d7747641aa | 200 | CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN1, DISABLE); |
frank26080115 | 0:84d7747641aa | 201 | } |
frank26080115 | 0:84d7747641aa | 202 | else |
frank26080115 | 0:84d7747641aa | 203 | { |
frank26080115 | 0:84d7747641aa | 204 | /* Turn on power and clock for CAN1 */ |
frank26080115 | 0:84d7747641aa | 205 | CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCAN2, DISABLE); |
frank26080115 | 0:84d7747641aa | 206 | } |
frank26080115 | 0:84d7747641aa | 207 | } |
frank26080115 | 0:84d7747641aa | 208 | |
frank26080115 | 0:84d7747641aa | 209 | /********************************************************************//** |
frank26080115 | 0:84d7747641aa | 210 | * @brief Setup Acceptance Filter Look-Up Table |
frank26080115 | 0:84d7747641aa | 211 | * @param[in] CANAFx pointer to LPC_CANAF_TypeDef |
frank26080115 | 0:84d7747641aa | 212 | * Should be: LPC_CANAF |
frank26080115 | 0:84d7747641aa | 213 | * @param[in] AFSection the pointer to AF_SectionDef structure |
frank26080115 | 0:84d7747641aa | 214 | * It contain information about 5 sections will be install in AFLUT |
frank26080115 | 0:84d7747641aa | 215 | * @return CAN Error could be: |
frank26080115 | 0:84d7747641aa | 216 | * - CAN_OBJECTS_FULL_ERROR: No more rx or tx objects available |
frank26080115 | 0:84d7747641aa | 217 | * - CAN_AF_ENTRY_ERROR: table error-violation of ascending numerical order |
frank26080115 | 0:84d7747641aa | 218 | * - CAN_OK: ID is added into table successfully |
frank26080115 | 0:84d7747641aa | 219 | *********************************************************************/ |
frank26080115 | 0:84d7747641aa | 220 | CAN_ERROR CAN_SetupAFLUT(LPC_CANAF_TypeDef* CANAFx, AF_SectionDef* AFSection) |
frank26080115 | 0:84d7747641aa | 221 | { |
frank26080115 | 0:84d7747641aa | 222 | uint8_t ctrl1,ctrl2; |
frank26080115 | 0:84d7747641aa | 223 | uint8_t dis1, dis2; |
frank26080115 | 0:84d7747641aa | 224 | uint16_t SID, SID_temp,i, count = 0; |
frank26080115 | 0:84d7747641aa | 225 | uint32_t EID, EID_temp, entry, buf; |
frank26080115 | 0:84d7747641aa | 226 | uint16_t lowerSID, upperSID; |
frank26080115 | 0:84d7747641aa | 227 | uint32_t lowerEID, upperEID; |
frank26080115 | 0:84d7747641aa | 228 | |
frank26080115 | 0:84d7747641aa | 229 | CHECK_PARAM(PARAM_CANAFx(CANAFx)); |
frank26080115 | 0:84d7747641aa | 230 | CANAFx->AFMR = 0x01; |
frank26080115 | 0:84d7747641aa | 231 | |
frank26080115 | 0:84d7747641aa | 232 | /***** setup FullCAN Table *****/ |
frank26080115 | 0:84d7747641aa | 233 | if(AFSection->FullCAN_Sec == NULL) |
frank26080115 | 0:84d7747641aa | 234 | { |
frank26080115 | 0:84d7747641aa | 235 | FULLCAN_ENABLE = DISABLE; |
frank26080115 | 0:84d7747641aa | 236 | } |
frank26080115 | 0:84d7747641aa | 237 | else |
frank26080115 | 0:84d7747641aa | 238 | { |
frank26080115 | 0:84d7747641aa | 239 | FULLCAN_ENABLE = ENABLE; |
frank26080115 | 0:84d7747641aa | 240 | for(i=0;i<(AFSection->FC_NumEntry);i++) |
frank26080115 | 0:84d7747641aa | 241 | { |
frank26080115 | 0:84d7747641aa | 242 | if(count + 1 > 64) |
frank26080115 | 0:84d7747641aa | 243 | { |
frank26080115 | 0:84d7747641aa | 244 | return CAN_OBJECTS_FULL_ERROR; |
frank26080115 | 0:84d7747641aa | 245 | } |
frank26080115 | 0:84d7747641aa | 246 | ctrl1 = AFSection->FullCAN_Sec->controller; |
frank26080115 | 0:84d7747641aa | 247 | SID = AFSection->FullCAN_Sec->id_11; |
frank26080115 | 0:84d7747641aa | 248 | dis1 = AFSection->FullCAN_Sec->disable; |
frank26080115 | 0:84d7747641aa | 249 | |
frank26080115 | 0:84d7747641aa | 250 | CHECK_PARAM(PARAM_CTRL(ctrl1)); |
frank26080115 | 0:84d7747641aa | 251 | CHECK_PARAM(PARAM_ID_11(SID)); |
frank26080115 | 0:84d7747641aa | 252 | CHECK_PARAM(PARAM_MSG_DISABLE(dis1)); |
frank26080115 | 0:84d7747641aa | 253 | entry = 0x00; //reset entry value |
frank26080115 | 0:84d7747641aa | 254 | if((CANAF_FullCAN_cnt & 0x00000001)==0) |
frank26080115 | 0:84d7747641aa | 255 | { |
frank26080115 | 0:84d7747641aa | 256 | if(count!=0x00) |
frank26080115 | 0:84d7747641aa | 257 | { |
frank26080115 | 0:84d7747641aa | 258 | buf = LPC_CANAF_RAM->mask[count-1]; |
frank26080115 | 0:84d7747641aa | 259 | SID_temp = (buf & 0x000003FF); |
frank26080115 | 0:84d7747641aa | 260 | if(SID_temp > SID) |
frank26080115 | 0:84d7747641aa | 261 | { |
frank26080115 | 0:84d7747641aa | 262 | return CAN_AF_ENTRY_ERROR; |
frank26080115 | 0:84d7747641aa | 263 | } |
frank26080115 | 0:84d7747641aa | 264 | } |
frank26080115 | 0:84d7747641aa | 265 | entry = (ctrl1<<29)|(dis1<<28)|(SID<<16)|(1<<27); |
frank26080115 | 0:84d7747641aa | 266 | LPC_CANAF_RAM->mask[count] &= 0x0000FFFF; |
frank26080115 | 0:84d7747641aa | 267 | LPC_CANAF_RAM->mask[count] |= entry; |
frank26080115 | 0:84d7747641aa | 268 | CANAF_FullCAN_cnt++; |
frank26080115 | 0:84d7747641aa | 269 | } |
frank26080115 | 0:84d7747641aa | 270 | else |
frank26080115 | 0:84d7747641aa | 271 | { |
frank26080115 | 0:84d7747641aa | 272 | buf = LPC_CANAF_RAM->mask[count]; |
frank26080115 | 0:84d7747641aa | 273 | SID_temp = (buf & 0x03FF0000)>>16; |
frank26080115 | 0:84d7747641aa | 274 | if(SID_temp > SID) |
frank26080115 | 0:84d7747641aa | 275 | { |
frank26080115 | 0:84d7747641aa | 276 | return CAN_AF_ENTRY_ERROR; |
frank26080115 | 0:84d7747641aa | 277 | } |
frank26080115 | 0:84d7747641aa | 278 | entry = (ctrl1<<13)|(dis1<<12)|(SID<<0)|(1<<11); |
frank26080115 | 0:84d7747641aa | 279 | LPC_CANAF_RAM->mask[count] &= 0xFFFF0000; |
frank26080115 | 0:84d7747641aa | 280 | LPC_CANAF_RAM->mask[count]|= entry; |
frank26080115 | 0:84d7747641aa | 281 | count++; |
frank26080115 | 0:84d7747641aa | 282 | CANAF_FullCAN_cnt++; |
frank26080115 | 0:84d7747641aa | 283 | } |
frank26080115 | 0:84d7747641aa | 284 | AFSection->FullCAN_Sec = (FullCAN_Entry *)((uint32_t)(AFSection->FullCAN_Sec)+ sizeof(FullCAN_Entry)); |
frank26080115 | 0:84d7747641aa | 285 | } |
frank26080115 | 0:84d7747641aa | 286 | } |
frank26080115 | 0:84d7747641aa | 287 | |
frank26080115 | 0:84d7747641aa | 288 | /***** Setup Explicit Standard Frame Format Section *****/ |
frank26080115 | 0:84d7747641aa | 289 | if(AFSection->SFF_Sec != NULL) |
frank26080115 | 0:84d7747641aa | 290 | { |
frank26080115 | 0:84d7747641aa | 291 | for(i=0;i<(AFSection->SFF_NumEntry);i++) |
frank26080115 | 0:84d7747641aa | 292 | { |
frank26080115 | 0:84d7747641aa | 293 | if(count + 1 > 512) |
frank26080115 | 0:84d7747641aa | 294 | { |
frank26080115 | 0:84d7747641aa | 295 | return CAN_OBJECTS_FULL_ERROR; |
frank26080115 | 0:84d7747641aa | 296 | } |
frank26080115 | 0:84d7747641aa | 297 | ctrl1 = AFSection->SFF_Sec->controller; |
frank26080115 | 0:84d7747641aa | 298 | SID = AFSection->SFF_Sec->id_11; |
frank26080115 | 0:84d7747641aa | 299 | dis1 = AFSection->SFF_Sec->disable; |
frank26080115 | 0:84d7747641aa | 300 | |
frank26080115 | 0:84d7747641aa | 301 | //check parameter |
frank26080115 | 0:84d7747641aa | 302 | CHECK_PARAM(PARAM_CTRL(ctrl1)); |
frank26080115 | 0:84d7747641aa | 303 | CHECK_PARAM(PARAM_ID_11(SID)); |
frank26080115 | 0:84d7747641aa | 304 | CHECK_PARAM(PARAM_MSG_DISABLE(dis1)); |
frank26080115 | 0:84d7747641aa | 305 | |
frank26080115 | 0:84d7747641aa | 306 | entry = 0x00; //reset entry value |
frank26080115 | 0:84d7747641aa | 307 | if((CANAF_std_cnt & 0x00000001)==0) |
frank26080115 | 0:84d7747641aa | 308 | { |
frank26080115 | 0:84d7747641aa | 309 | if(CANAF_std_cnt !=0 ) |
frank26080115 | 0:84d7747641aa | 310 | { |
frank26080115 | 0:84d7747641aa | 311 | buf = LPC_CANAF_RAM->mask[count-1]; |
frank26080115 | 0:84d7747641aa | 312 | SID_temp = (buf & 0x00000FFF); |
frank26080115 | 0:84d7747641aa | 313 | if(SID_temp > SID) |
frank26080115 | 0:84d7747641aa | 314 | { |
frank26080115 | 0:84d7747641aa | 315 | return CAN_AF_ENTRY_ERROR; |
frank26080115 | 0:84d7747641aa | 316 | } |
frank26080115 | 0:84d7747641aa | 317 | } |
frank26080115 | 0:84d7747641aa | 318 | entry = (ctrl1<<29)|(dis1<<28)|(SID<<16); |
frank26080115 | 0:84d7747641aa | 319 | LPC_CANAF_RAM->mask[count] &= 0x0000FFFF; |
frank26080115 | 0:84d7747641aa | 320 | LPC_CANAF_RAM->mask[count] |= entry; |
frank26080115 | 0:84d7747641aa | 321 | CANAF_std_cnt++; |
frank26080115 | 0:84d7747641aa | 322 | } |
frank26080115 | 0:84d7747641aa | 323 | else |
frank26080115 | 0:84d7747641aa | 324 | { |
frank26080115 | 0:84d7747641aa | 325 | buf = LPC_CANAF_RAM->mask[count]; |
frank26080115 | 0:84d7747641aa | 326 | SID_temp = (buf & 0x0FFF0000)>>16; |
frank26080115 | 0:84d7747641aa | 327 | if(SID_temp > SID) |
frank26080115 | 0:84d7747641aa | 328 | { |
frank26080115 | 0:84d7747641aa | 329 | return CAN_AF_ENTRY_ERROR; |
frank26080115 | 0:84d7747641aa | 330 | } |
frank26080115 | 0:84d7747641aa | 331 | entry = (ctrl1<<13)|(dis1<<12)|(SID<<0); |
frank26080115 | 0:84d7747641aa | 332 | LPC_CANAF_RAM->mask[count] &= 0xFFFF0000; |
frank26080115 | 0:84d7747641aa | 333 | LPC_CANAF_RAM->mask[count] |= entry; |
frank26080115 | 0:84d7747641aa | 334 | count++; |
frank26080115 | 0:84d7747641aa | 335 | CANAF_std_cnt++; |
frank26080115 | 0:84d7747641aa | 336 | } |
frank26080115 | 0:84d7747641aa | 337 | AFSection->SFF_Sec = (SFF_Entry *)((uint32_t)(AFSection->SFF_Sec)+ sizeof(SFF_Entry)); |
frank26080115 | 0:84d7747641aa | 338 | } |
frank26080115 | 0:84d7747641aa | 339 | } |
frank26080115 | 0:84d7747641aa | 340 | |
frank26080115 | 0:84d7747641aa | 341 | /***** Setup Group of Standard Frame Format Identifier Section *****/ |
frank26080115 | 0:84d7747641aa | 342 | if(AFSection->SFF_GPR_Sec != NULL) |
frank26080115 | 0:84d7747641aa | 343 | { |
frank26080115 | 0:84d7747641aa | 344 | for(i=0;i<(AFSection->SFF_GPR_NumEntry);i++) |
frank26080115 | 0:84d7747641aa | 345 | { |
frank26080115 | 0:84d7747641aa | 346 | if(count + 1 > 512) |
frank26080115 | 0:84d7747641aa | 347 | { |
frank26080115 | 0:84d7747641aa | 348 | return CAN_OBJECTS_FULL_ERROR; |
frank26080115 | 0:84d7747641aa | 349 | } |
frank26080115 | 0:84d7747641aa | 350 | ctrl1 = AFSection->SFF_GPR_Sec->controller1; |
frank26080115 | 0:84d7747641aa | 351 | ctrl2 = AFSection->SFF_GPR_Sec->controller2; |
frank26080115 | 0:84d7747641aa | 352 | dis1 = AFSection->SFF_GPR_Sec->disable1; |
frank26080115 | 0:84d7747641aa | 353 | dis2 = AFSection->SFF_GPR_Sec->disable2; |
frank26080115 | 0:84d7747641aa | 354 | lowerSID = AFSection->SFF_GPR_Sec->lowerID; |
frank26080115 | 0:84d7747641aa | 355 | upperSID = AFSection->SFF_GPR_Sec->upperID; |
frank26080115 | 0:84d7747641aa | 356 | |
frank26080115 | 0:84d7747641aa | 357 | /* check parameter */ |
frank26080115 | 0:84d7747641aa | 358 | CHECK_PARAM(PARAM_CTRL(ctrl1)); |
frank26080115 | 0:84d7747641aa | 359 | CHECK_PARAM(PARAM_CTRL(ctrl2)); |
frank26080115 | 0:84d7747641aa | 360 | CHECK_PARAM(PARAM_MSG_DISABLE(dis1)); |
frank26080115 | 0:84d7747641aa | 361 | CHECK_PARAM(PARAM_MSG_DISABLE(dis2)); |
frank26080115 | 0:84d7747641aa | 362 | CHECK_PARAM(PARAM_ID_11(lowerSID)); |
frank26080115 | 0:84d7747641aa | 363 | CHECK_PARAM(PARAM_ID_11(upperSID)); |
frank26080115 | 0:84d7747641aa | 364 | |
frank26080115 | 0:84d7747641aa | 365 | entry = 0x00; |
frank26080115 | 0:84d7747641aa | 366 | if(CANAF_gstd_cnt!=0) |
frank26080115 | 0:84d7747641aa | 367 | { |
frank26080115 | 0:84d7747641aa | 368 | buf = LPC_CANAF_RAM->mask[count-1]; |
frank26080115 | 0:84d7747641aa | 369 | SID_temp = buf & 0x00000FFF; |
frank26080115 | 0:84d7747641aa | 370 | if(SID_temp > lowerSID) |
frank26080115 | 0:84d7747641aa | 371 | { |
frank26080115 | 0:84d7747641aa | 372 | return CAN_AF_ENTRY_ERROR; |
frank26080115 | 0:84d7747641aa | 373 | } |
frank26080115 | 0:84d7747641aa | 374 | } |
frank26080115 | 0:84d7747641aa | 375 | entry = (ctrl1 << 29)|(dis1 << 28)|(lowerSID << 16)| \ |
frank26080115 | 0:84d7747641aa | 376 | (ctrl2 << 13)|(dis2 << 12)|(upperSID << 0); |
frank26080115 | 0:84d7747641aa | 377 | LPC_CANAF_RAM->mask[count] = entry; |
frank26080115 | 0:84d7747641aa | 378 | CANAF_gstd_cnt++; |
frank26080115 | 0:84d7747641aa | 379 | count++; |
frank26080115 | 0:84d7747641aa | 380 | AFSection->SFF_GPR_Sec = (SFF_GPR_Entry *)((uint32_t)(AFSection->SFF_GPR_Sec)+ sizeof(SFF_GPR_Entry)); |
frank26080115 | 0:84d7747641aa | 381 | } |
frank26080115 | 0:84d7747641aa | 382 | } |
frank26080115 | 0:84d7747641aa | 383 | |
frank26080115 | 0:84d7747641aa | 384 | /***** Setup Explicit Extend Frame Format Identifier Section *****/ |
frank26080115 | 0:84d7747641aa | 385 | if(AFSection->EFF_Sec != NULL) |
frank26080115 | 0:84d7747641aa | 386 | { |
frank26080115 | 0:84d7747641aa | 387 | for(i=0;i<(AFSection->EFF_NumEntry);i++) |
frank26080115 | 0:84d7747641aa | 388 | { |
frank26080115 | 0:84d7747641aa | 389 | if(count + 1 > 512) |
frank26080115 | 0:84d7747641aa | 390 | { |
frank26080115 | 0:84d7747641aa | 391 | return CAN_OBJECTS_FULL_ERROR; |
frank26080115 | 0:84d7747641aa | 392 | } |
frank26080115 | 0:84d7747641aa | 393 | EID = AFSection->EFF_Sec->ID_29; |
frank26080115 | 0:84d7747641aa | 394 | ctrl1 = AFSection->EFF_Sec->controller; |
frank26080115 | 0:84d7747641aa | 395 | |
frank26080115 | 0:84d7747641aa | 396 | // check parameter |
frank26080115 | 0:84d7747641aa | 397 | CHECK_PARAM(PARAM_ID_29(EID)); |
frank26080115 | 0:84d7747641aa | 398 | CHECK_PARAM(PARAM_CTRL(ctrl1)); |
frank26080115 | 0:84d7747641aa | 399 | |
frank26080115 | 0:84d7747641aa | 400 | entry = 0x00; //reset entry value |
frank26080115 | 0:84d7747641aa | 401 | if(CANAF_ext_cnt != 0) |
frank26080115 | 0:84d7747641aa | 402 | { |
frank26080115 | 0:84d7747641aa | 403 | buf = LPC_CANAF_RAM->mask[count-1]; |
frank26080115 | 0:84d7747641aa | 404 | EID_temp = buf & 0x0FFFFFFF; |
frank26080115 | 0:84d7747641aa | 405 | if(EID_temp > EID) |
frank26080115 | 0:84d7747641aa | 406 | { |
frank26080115 | 0:84d7747641aa | 407 | return CAN_AF_ENTRY_ERROR; |
frank26080115 | 0:84d7747641aa | 408 | } |
frank26080115 | 0:84d7747641aa | 409 | } |
frank26080115 | 0:84d7747641aa | 410 | entry = (ctrl1 << 29)|(EID << 0); |
frank26080115 | 0:84d7747641aa | 411 | LPC_CANAF_RAM->mask[count] = entry; |
frank26080115 | 0:84d7747641aa | 412 | CANAF_ext_cnt ++; |
frank26080115 | 0:84d7747641aa | 413 | count++; |
frank26080115 | 0:84d7747641aa | 414 | AFSection->EFF_Sec = (EFF_Entry *)((uint32_t)(AFSection->EFF_Sec)+ sizeof(EFF_Entry)); |
frank26080115 | 0:84d7747641aa | 415 | } |
frank26080115 | 0:84d7747641aa | 416 | } |
frank26080115 | 0:84d7747641aa | 417 | |
frank26080115 | 0:84d7747641aa | 418 | /***** Setup Group of Extended Frame Format Identifier Section *****/ |
frank26080115 | 0:84d7747641aa | 419 | if(AFSection->EFF_GPR_Sec != NULL) |
frank26080115 | 0:84d7747641aa | 420 | { |
frank26080115 | 0:84d7747641aa | 421 | for(i=0;i<(AFSection->EFF_GPR_NumEntry);i++) |
frank26080115 | 0:84d7747641aa | 422 | { |
frank26080115 | 0:84d7747641aa | 423 | if(count + 2 > 512) |
frank26080115 | 0:84d7747641aa | 424 | { |
frank26080115 | 0:84d7747641aa | 425 | return CAN_OBJECTS_FULL_ERROR; |
frank26080115 | 0:84d7747641aa | 426 | } |
frank26080115 | 0:84d7747641aa | 427 | ctrl1 = AFSection->EFF_GPR_Sec->controller1; |
frank26080115 | 0:84d7747641aa | 428 | ctrl2 = AFSection->EFF_GPR_Sec->controller2; |
frank26080115 | 0:84d7747641aa | 429 | lowerEID = AFSection->EFF_GPR_Sec->lowerEID; |
frank26080115 | 0:84d7747641aa | 430 | upperEID = AFSection->EFF_GPR_Sec->upperEID; |
frank26080115 | 0:84d7747641aa | 431 | |
frank26080115 | 0:84d7747641aa | 432 | //check parameter |
frank26080115 | 0:84d7747641aa | 433 | CHECK_PARAM(PARAM_CTRL(ctrl1)); |
frank26080115 | 0:84d7747641aa | 434 | CHECK_PARAM(PARAM_CTRL(ctrl2)); |
frank26080115 | 0:84d7747641aa | 435 | CHECK_PARAM(PARAM_ID_29(lowerEID)); |
frank26080115 | 0:84d7747641aa | 436 | CHECK_PARAM(PARAM_ID_29(upperEID)); |
frank26080115 | 0:84d7747641aa | 437 | |
frank26080115 | 0:84d7747641aa | 438 | entry = 0x00; |
frank26080115 | 0:84d7747641aa | 439 | if(CANAF_gext_cnt != 0) |
frank26080115 | 0:84d7747641aa | 440 | { |
frank26080115 | 0:84d7747641aa | 441 | buf = LPC_CANAF_RAM->mask[count-1]; |
frank26080115 | 0:84d7747641aa | 442 | EID_temp = buf & 0x0FFFFFFF; |
frank26080115 | 0:84d7747641aa | 443 | if(EID_temp > lowerEID) |
frank26080115 | 0:84d7747641aa | 444 | { |
frank26080115 | 0:84d7747641aa | 445 | return CAN_AF_ENTRY_ERROR; |
frank26080115 | 0:84d7747641aa | 446 | } |
frank26080115 | 0:84d7747641aa | 447 | } |
frank26080115 | 0:84d7747641aa | 448 | entry = (ctrl1 << 29)|(lowerEID << 0); |
frank26080115 | 0:84d7747641aa | 449 | LPC_CANAF_RAM->mask[count++] = entry; |
frank26080115 | 0:84d7747641aa | 450 | entry = (ctrl2 << 29)|(upperEID << 0); |
frank26080115 | 0:84d7747641aa | 451 | LPC_CANAF_RAM->mask[count++] = entry; |
frank26080115 | 0:84d7747641aa | 452 | CANAF_gext_cnt++; |
frank26080115 | 0:84d7747641aa | 453 | AFSection->EFF_GPR_Sec = (EFF_GPR_Entry *)((uint32_t)(AFSection->EFF_GPR_Sec)+ sizeof(EFF_GPR_Entry)); |
frank26080115 | 0:84d7747641aa | 454 | } |
frank26080115 | 0:84d7747641aa | 455 | } |
frank26080115 | 0:84d7747641aa | 456 | //update address values |
frank26080115 | 0:84d7747641aa | 457 | LPC_CANAF->SFF_sa = ((CANAF_FullCAN_cnt + 1)>>1)<<2; |
frank26080115 | 0:84d7747641aa | 458 | LPC_CANAF->SFF_GRP_sa = LPC_CANAF->SFF_sa + (((CANAF_std_cnt+1)>>1)<< 2); |
frank26080115 | 0:84d7747641aa | 459 | LPC_CANAF->EFF_sa = LPC_CANAF->SFF_GRP_sa + (CANAF_gstd_cnt << 2); |
frank26080115 | 0:84d7747641aa | 460 | LPC_CANAF->EFF_GRP_sa = LPC_CANAF->EFF_sa + (CANAF_ext_cnt << 2); |
frank26080115 | 0:84d7747641aa | 461 | LPC_CANAF->ENDofTable = LPC_CANAF->EFF_GRP_sa + (CANAF_gext_cnt << 3); |
frank26080115 | 0:84d7747641aa | 462 | |
frank26080115 | 0:84d7747641aa | 463 | if(FULLCAN_ENABLE == DISABLE) |
frank26080115 | 0:84d7747641aa | 464 | { |
frank26080115 | 0:84d7747641aa | 465 | LPC_CANAF->AFMR = 0x00; // Normal mode |
frank26080115 | 0:84d7747641aa | 466 | } |
frank26080115 | 0:84d7747641aa | 467 | else |
frank26080115 | 0:84d7747641aa | 468 | { |
frank26080115 | 0:84d7747641aa | 469 | LPC_CANAF->AFMR = 0x04; |
frank26080115 | 0:84d7747641aa | 470 | } |
frank26080115 | 0:84d7747641aa | 471 | return CAN_OK; |
frank26080115 | 0:84d7747641aa | 472 | } |
frank26080115 | 0:84d7747641aa | 473 | /********************************************************************//** |
frank26080115 | 0:84d7747641aa | 474 | * @brief Add Explicit ID into AF Look-Up Table dynamically. |
frank26080115 | 0:84d7747641aa | 475 | * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: |
frank26080115 | 0:84d7747641aa | 476 | * - LPC_CAN1: CAN1 peripheral |
frank26080115 | 0:84d7747641aa | 477 | * - LPC_CAN2: CAN2 peripheral |
frank26080115 | 0:84d7747641aa | 478 | * @param[in] id: The ID of entry will be added |
frank26080115 | 0:84d7747641aa | 479 | * @param[in] format: is the type of ID Frame Format, should be: |
frank26080115 | 0:84d7747641aa | 480 | * - STD_ID_FORMAT: 11-bit ID value |
frank26080115 | 0:84d7747641aa | 481 | * - EXT_ID_FORMAT: 29-bit ID value |
frank26080115 | 0:84d7747641aa | 482 | * @return CAN Error, could be: |
frank26080115 | 0:84d7747641aa | 483 | * - CAN_OBJECTS_FULL_ERROR: No more rx or tx objects available |
frank26080115 | 0:84d7747641aa | 484 | * - CAN_ID_EXIT_ERROR: ID exited in table |
frank26080115 | 0:84d7747641aa | 485 | * - CAN_OK: ID is added into table successfully |
frank26080115 | 0:84d7747641aa | 486 | *********************************************************************/ |
frank26080115 | 0:84d7747641aa | 487 | CAN_ERROR CAN_LoadExplicitEntry(LPC_CAN_TypeDef* CANx, uint32_t id, CAN_ID_FORMAT_Type format) |
frank26080115 | 0:84d7747641aa | 488 | { |
frank26080115 | 0:84d7747641aa | 489 | uint32_t tmp0 = 0; |
frank26080115 | 0:84d7747641aa | 490 | uint32_t buf0=0, buf1=0; |
frank26080115 | 0:84d7747641aa | 491 | int16_t cnt1=0, cnt2=0, bound1=0, total=0; |
frank26080115 | 0:84d7747641aa | 492 | |
frank26080115 | 0:84d7747641aa | 493 | |
frank26080115 | 0:84d7747641aa | 494 | CHECK_PARAM(PARAM_CANx(CANx)); |
frank26080115 | 0:84d7747641aa | 495 | CHECK_PARAM(PARAM_ID_FORMAT(format)); |
frank26080115 | 0:84d7747641aa | 496 | |
frank26080115 | 0:84d7747641aa | 497 | if (CANx == LPC_CAN1) |
frank26080115 | 0:84d7747641aa | 498 | { |
frank26080115 | 0:84d7747641aa | 499 | tmp0 = 0; |
frank26080115 | 0:84d7747641aa | 500 | } |
frank26080115 | 0:84d7747641aa | 501 | else if (CANx == LPC_CAN2) |
frank26080115 | 0:84d7747641aa | 502 | { |
frank26080115 | 0:84d7747641aa | 503 | tmp0 = 1; |
frank26080115 | 0:84d7747641aa | 504 | } |
frank26080115 | 0:84d7747641aa | 505 | |
frank26080115 | 0:84d7747641aa | 506 | /* Acceptance Filter Memory full - return */ |
frank26080115 | 0:84d7747641aa | 507 | total =((CANAF_FullCAN_cnt+1)>>1)+ CANAF_FullCAN_cnt*3 +((CANAF_std_cnt + 1) >> 1)+ \ |
frank26080115 | 0:84d7747641aa | 508 | CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1); |
frank26080115 | 0:84d7747641aa | 509 | if (total >= 512){ //don't have enough space |
frank26080115 | 0:84d7747641aa | 510 | return CAN_OBJECTS_FULL_ERROR; |
frank26080115 | 0:84d7747641aa | 511 | } |
frank26080115 | 0:84d7747641aa | 512 | |
frank26080115 | 0:84d7747641aa | 513 | /* Setup Acceptance Filter Configuration |
frank26080115 | 0:84d7747641aa | 514 | Acceptance Filter Mode Register = Off */ |
frank26080115 | 0:84d7747641aa | 515 | LPC_CANAF->AFMR = 0x00000001; |
frank26080115 | 0:84d7747641aa | 516 | |
frank26080115 | 0:84d7747641aa | 517 | /*********** Add Explicit Standard Identifier Frame Format entry *********/ |
frank26080115 | 0:84d7747641aa | 518 | if(format == STD_ID_FORMAT) |
frank26080115 | 0:84d7747641aa | 519 | { |
frank26080115 | 0:84d7747641aa | 520 | id &= 0x07FF; |
frank26080115 | 0:84d7747641aa | 521 | id |= (tmp0 << 13); /* Add controller number */ |
frank26080115 | 0:84d7747641aa | 522 | /* Move all remaining sections one place up |
frank26080115 | 0:84d7747641aa | 523 | if new entry will increase FullCAN list */ |
frank26080115 | 0:84d7747641aa | 524 | if ((CANAF_std_cnt & 0x0001) == 0) |
frank26080115 | 0:84d7747641aa | 525 | { |
frank26080115 | 0:84d7747641aa | 526 | cnt1 = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt+1)>>1); |
frank26080115 | 0:84d7747641aa | 527 | bound1 = total - cnt1; |
frank26080115 | 0:84d7747641aa | 528 | buf0 = LPC_CANAF_RAM->mask[cnt1]; |
frank26080115 | 0:84d7747641aa | 529 | while(bound1--) |
frank26080115 | 0:84d7747641aa | 530 | { |
frank26080115 | 0:84d7747641aa | 531 | cnt1++; |
frank26080115 | 0:84d7747641aa | 532 | buf1 = LPC_CANAF_RAM->mask[cnt1]; |
frank26080115 | 0:84d7747641aa | 533 | LPC_CANAF_RAM->mask[cnt1] = buf0; |
frank26080115 | 0:84d7747641aa | 534 | buf0 = buf1; |
frank26080115 | 0:84d7747641aa | 535 | } |
frank26080115 | 0:84d7747641aa | 536 | } |
frank26080115 | 0:84d7747641aa | 537 | if (CANAF_std_cnt == 0) |
frank26080115 | 0:84d7747641aa | 538 | { |
frank26080115 | 0:84d7747641aa | 539 | cnt2 = (CANAF_FullCAN_cnt + 1)>>1; |
frank26080115 | 0:84d7747641aa | 540 | /* For entering first ID */ |
frank26080115 | 0:84d7747641aa | 541 | LPC_CANAF_RAM->mask[cnt2] = 0x0000FFFF | (id << 16); |
frank26080115 | 0:84d7747641aa | 542 | } |
frank26080115 | 0:84d7747641aa | 543 | else if (CANAF_std_cnt == 1) |
frank26080115 | 0:84d7747641aa | 544 | { |
frank26080115 | 0:84d7747641aa | 545 | cnt2 = (CANAF_FullCAN_cnt + 1)>>1; |
frank26080115 | 0:84d7747641aa | 546 | /* For entering second ID */ |
frank26080115 | 0:84d7747641aa | 547 | if ((LPC_CANAF_RAM->mask[cnt2] >> 16) > id) |
frank26080115 | 0:84d7747641aa | 548 | { |
frank26080115 | 0:84d7747641aa | 549 | LPC_CANAF_RAM->mask[cnt2] = (LPC_CANAF_RAM->mask[cnt2] >> 16) | (id << 16); |
frank26080115 | 0:84d7747641aa | 550 | } |
frank26080115 | 0:84d7747641aa | 551 | else |
frank26080115 | 0:84d7747641aa | 552 | { |
frank26080115 | 0:84d7747641aa | 553 | LPC_CANAF_RAM->mask[cnt2] = (LPC_CANAF_RAM->mask[cnt2] & 0xFFFF0000) | id; |
frank26080115 | 0:84d7747641aa | 554 | } |
frank26080115 | 0:84d7747641aa | 555 | } |
frank26080115 | 0:84d7747641aa | 556 | else |
frank26080115 | 0:84d7747641aa | 557 | { |
frank26080115 | 0:84d7747641aa | 558 | /* Find where to insert new ID */ |
frank26080115 | 0:84d7747641aa | 559 | cnt1 = (CANAF_FullCAN_cnt+1)>>1; |
frank26080115 | 0:84d7747641aa | 560 | cnt2 = CANAF_std_cnt; |
frank26080115 | 0:84d7747641aa | 561 | bound1 = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt+1)>>1); |
frank26080115 | 0:84d7747641aa | 562 | while (cnt1 < bound1) |
frank26080115 | 0:84d7747641aa | 563 | { |
frank26080115 | 0:84d7747641aa | 564 | /* Loop through standard existing IDs */ |
frank26080115 | 0:84d7747641aa | 565 | if ((LPC_CANAF_RAM->mask[cnt1] >> 16) > id) |
frank26080115 | 0:84d7747641aa | 566 | { |
frank26080115 | 0:84d7747641aa | 567 | cnt2 = cnt1 * 2; |
frank26080115 | 0:84d7747641aa | 568 | break; |
frank26080115 | 0:84d7747641aa | 569 | } |
frank26080115 | 0:84d7747641aa | 570 | |
frank26080115 | 0:84d7747641aa | 571 | if ((LPC_CANAF_RAM->mask[cnt1] & 0x0000FFFF) > id) |
frank26080115 | 0:84d7747641aa | 572 | { |
frank26080115 | 0:84d7747641aa | 573 | cnt2 = cnt1 * 2 + 1; |
frank26080115 | 0:84d7747641aa | 574 | break; |
frank26080115 | 0:84d7747641aa | 575 | } |
frank26080115 | 0:84d7747641aa | 576 | |
frank26080115 | 0:84d7747641aa | 577 | cnt1++; |
frank26080115 | 0:84d7747641aa | 578 | } |
frank26080115 | 0:84d7747641aa | 579 | /* cnt1 = U32 where to insert new ID */ |
frank26080115 | 0:84d7747641aa | 580 | /* cnt2 = U16 where to insert new ID */ |
frank26080115 | 0:84d7747641aa | 581 | |
frank26080115 | 0:84d7747641aa | 582 | if (cnt1 == bound1) |
frank26080115 | 0:84d7747641aa | 583 | { |
frank26080115 | 0:84d7747641aa | 584 | /* Adding ID as last entry */ |
frank26080115 | 0:84d7747641aa | 585 | /* Even number of IDs exists */ |
frank26080115 | 0:84d7747641aa | 586 | if ((CANAF_std_cnt & 0x0001) == 0) |
frank26080115 | 0:84d7747641aa | 587 | { |
frank26080115 | 0:84d7747641aa | 588 | LPC_CANAF_RAM->mask[cnt1] = 0x0000FFFF | (id << 16); |
frank26080115 | 0:84d7747641aa | 589 | } |
frank26080115 | 0:84d7747641aa | 590 | /* Odd number of IDs exists */ |
frank26080115 | 0:84d7747641aa | 591 | else |
frank26080115 | 0:84d7747641aa | 592 | { |
frank26080115 | 0:84d7747641aa | 593 | LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | id; |
frank26080115 | 0:84d7747641aa | 594 | } |
frank26080115 | 0:84d7747641aa | 595 | } |
frank26080115 | 0:84d7747641aa | 596 | else |
frank26080115 | 0:84d7747641aa | 597 | { |
frank26080115 | 0:84d7747641aa | 598 | buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */ |
frank26080115 | 0:84d7747641aa | 599 | if ((cnt2 & 0x0001) == 0) |
frank26080115 | 0:84d7747641aa | 600 | { |
frank26080115 | 0:84d7747641aa | 601 | /* Insert new mask to even address*/ |
frank26080115 | 0:84d7747641aa | 602 | buf1 = (id << 16) | (buf0 >> 16); |
frank26080115 | 0:84d7747641aa | 603 | } |
frank26080115 | 0:84d7747641aa | 604 | else |
frank26080115 | 0:84d7747641aa | 605 | { |
frank26080115 | 0:84d7747641aa | 606 | /* Insert new mask to odd address */ |
frank26080115 | 0:84d7747641aa | 607 | buf1 = (buf0 & 0xFFFF0000) | id; |
frank26080115 | 0:84d7747641aa | 608 | } |
frank26080115 | 0:84d7747641aa | 609 | LPC_CANAF_RAM->mask[cnt1] = buf1;/* Insert mask */ |
frank26080115 | 0:84d7747641aa | 610 | bound1 = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt+1)>>1)-1; |
frank26080115 | 0:84d7747641aa | 611 | /* Move all remaining standard mask entries one place up */ |
frank26080115 | 0:84d7747641aa | 612 | while (cnt1 < bound1) |
frank26080115 | 0:84d7747641aa | 613 | { |
frank26080115 | 0:84d7747641aa | 614 | cnt1++; |
frank26080115 | 0:84d7747641aa | 615 | buf1 = LPC_CANAF_RAM->mask[cnt1]; |
frank26080115 | 0:84d7747641aa | 616 | LPC_CANAF_RAM->mask[cnt1] = (buf1 >> 16) | (buf0 << 16); |
frank26080115 | 0:84d7747641aa | 617 | buf0 = buf1; |
frank26080115 | 0:84d7747641aa | 618 | } |
frank26080115 | 0:84d7747641aa | 619 | |
frank26080115 | 0:84d7747641aa | 620 | if ((CANAF_std_cnt & 0x0001) == 0) |
frank26080115 | 0:84d7747641aa | 621 | { |
frank26080115 | 0:84d7747641aa | 622 | /* Even number of IDs exists */ |
frank26080115 | 0:84d7747641aa | 623 | LPC_CANAF_RAM->mask[cnt1+1] = (buf0 <<16) |(0x0000FFFF); |
frank26080115 | 0:84d7747641aa | 624 | } |
frank26080115 | 0:84d7747641aa | 625 | } |
frank26080115 | 0:84d7747641aa | 626 | } |
frank26080115 | 0:84d7747641aa | 627 | CANAF_std_cnt++; |
frank26080115 | 0:84d7747641aa | 628 | //update address values |
frank26080115 | 0:84d7747641aa | 629 | LPC_CANAF->SFF_GRP_sa +=0x04 ; |
frank26080115 | 0:84d7747641aa | 630 | LPC_CANAF->EFF_sa +=0x04 ; |
frank26080115 | 0:84d7747641aa | 631 | LPC_CANAF->EFF_GRP_sa +=0x04; |
frank26080115 | 0:84d7747641aa | 632 | LPC_CANAF->ENDofTable +=0x04; |
frank26080115 | 0:84d7747641aa | 633 | } |
frank26080115 | 0:84d7747641aa | 634 | |
frank26080115 | 0:84d7747641aa | 635 | /*********** Add Explicit Extended Identifier Frame Format entry *********/ |
frank26080115 | 0:84d7747641aa | 636 | else |
frank26080115 | 0:84d7747641aa | 637 | { |
frank26080115 | 0:84d7747641aa | 638 | /* Add controller number */ |
frank26080115 | 0:84d7747641aa | 639 | id |= (tmp0) << 29; |
frank26080115 | 0:84d7747641aa | 640 | |
frank26080115 | 0:84d7747641aa | 641 | cnt1 = ((CANAF_FullCAN_cnt+1)>>1)+(((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt); |
frank26080115 | 0:84d7747641aa | 642 | cnt2 = 0; |
frank26080115 | 0:84d7747641aa | 643 | while (cnt2 < CANAF_ext_cnt) |
frank26080115 | 0:84d7747641aa | 644 | { |
frank26080115 | 0:84d7747641aa | 645 | /* Loop through extended existing masks*/ |
frank26080115 | 0:84d7747641aa | 646 | if (LPC_CANAF_RAM->mask[cnt1] > id) |
frank26080115 | 0:84d7747641aa | 647 | { |
frank26080115 | 0:84d7747641aa | 648 | break; |
frank26080115 | 0:84d7747641aa | 649 | } |
frank26080115 | 0:84d7747641aa | 650 | cnt1++;/* cnt1 = U32 where to insert new mask */ |
frank26080115 | 0:84d7747641aa | 651 | cnt2++; |
frank26080115 | 0:84d7747641aa | 652 | } |
frank26080115 | 0:84d7747641aa | 653 | |
frank26080115 | 0:84d7747641aa | 654 | buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */ |
frank26080115 | 0:84d7747641aa | 655 | LPC_CANAF_RAM->mask[cnt1] = id; /* Insert mask */ |
frank26080115 | 0:84d7747641aa | 656 | |
frank26080115 | 0:84d7747641aa | 657 | CANAF_ext_cnt++; |
frank26080115 | 0:84d7747641aa | 658 | |
frank26080115 | 0:84d7747641aa | 659 | bound1 = total; |
frank26080115 | 0:84d7747641aa | 660 | /* Move all remaining extended mask entries one place up*/ |
frank26080115 | 0:84d7747641aa | 661 | while (cnt2 < bound1) |
frank26080115 | 0:84d7747641aa | 662 | { |
frank26080115 | 0:84d7747641aa | 663 | cnt1++; |
frank26080115 | 0:84d7747641aa | 664 | cnt2++; |
frank26080115 | 0:84d7747641aa | 665 | buf1 = LPC_CANAF_RAM->mask[cnt1]; |
frank26080115 | 0:84d7747641aa | 666 | LPC_CANAF_RAM->mask[cnt1] = buf0; |
frank26080115 | 0:84d7747641aa | 667 | buf0 = buf1; |
frank26080115 | 0:84d7747641aa | 668 | } |
frank26080115 | 0:84d7747641aa | 669 | /* update address values */ |
frank26080115 | 0:84d7747641aa | 670 | LPC_CANAF->EFF_GRP_sa += 4; |
frank26080115 | 0:84d7747641aa | 671 | LPC_CANAF->ENDofTable += 4; |
frank26080115 | 0:84d7747641aa | 672 | } |
frank26080115 | 0:84d7747641aa | 673 | if(CANAF_FullCAN_cnt == 0) //not use FullCAN mode |
frank26080115 | 0:84d7747641aa | 674 | { |
frank26080115 | 0:84d7747641aa | 675 | LPC_CANAF->AFMR = 0x00;//not use FullCAN mode |
frank26080115 | 0:84d7747641aa | 676 | } |
frank26080115 | 0:84d7747641aa | 677 | else |
frank26080115 | 0:84d7747641aa | 678 | { |
frank26080115 | 0:84d7747641aa | 679 | LPC_CANAF->AFMR = 0x04; |
frank26080115 | 0:84d7747641aa | 680 | } |
frank26080115 | 0:84d7747641aa | 681 | |
frank26080115 | 0:84d7747641aa | 682 | return CAN_OK; |
frank26080115 | 0:84d7747641aa | 683 | } |
frank26080115 | 0:84d7747641aa | 684 | |
frank26080115 | 0:84d7747641aa | 685 | /********************************************************************//** |
frank26080115 | 0:84d7747641aa | 686 | * @brief Load FullCAN entry into AFLUT |
frank26080115 | 0:84d7747641aa | 687 | * @param[in] CANx: CAN peripheral selected, should be: |
frank26080115 | 0:84d7747641aa | 688 | * - LPC_CAN1: CAN1 peripheral |
frank26080115 | 0:84d7747641aa | 689 | * - LPC_CAN2: CAN2 peripheral |
frank26080115 | 0:84d7747641aa | 690 | * @param[in] id: identifier of entry that will be added |
frank26080115 | 0:84d7747641aa | 691 | * @return CAN_ERROR, could be: |
frank26080115 | 0:84d7747641aa | 692 | * - CAN_OK: loading is successful |
frank26080115 | 0:84d7747641aa | 693 | * - CAN_ID_EXIT_ERROR: ID exited in FullCAN Section |
frank26080115 | 0:84d7747641aa | 694 | * - CAN_OBJECTS_FULL_ERROR: no more space available |
frank26080115 | 0:84d7747641aa | 695 | *********************************************************************/ |
frank26080115 | 0:84d7747641aa | 696 | CAN_ERROR CAN_LoadFullCANEntry (LPC_CAN_TypeDef* CANx, uint16_t id) |
frank26080115 | 0:84d7747641aa | 697 | { |
frank26080115 | 0:84d7747641aa | 698 | uint32_t ctrl0 = 0; |
frank26080115 | 0:84d7747641aa | 699 | uint32_t buf0=0, buf1=0, buf2=0; |
frank26080115 | 0:84d7747641aa | 700 | uint32_t tmp0=0, tmp1=0, tmp2=0; |
frank26080115 | 0:84d7747641aa | 701 | int16_t cnt1=0, cnt2=0, bound1=0, total=0; |
frank26080115 | 0:84d7747641aa | 702 | |
frank26080115 | 0:84d7747641aa | 703 | CHECK_PARAM(PARAM_CANx(CANx)); |
frank26080115 | 0:84d7747641aa | 704 | |
frank26080115 | 0:84d7747641aa | 705 | if (CANx == LPC_CAN1) |
frank26080115 | 0:84d7747641aa | 706 | { |
frank26080115 | 0:84d7747641aa | 707 | ctrl0 = 0; |
frank26080115 | 0:84d7747641aa | 708 | } |
frank26080115 | 0:84d7747641aa | 709 | else if (CANx == LPC_CAN2) |
frank26080115 | 0:84d7747641aa | 710 | { |
frank26080115 | 0:84d7747641aa | 711 | ctrl0 = 1; |
frank26080115 | 0:84d7747641aa | 712 | } |
frank26080115 | 0:84d7747641aa | 713 | |
frank26080115 | 0:84d7747641aa | 714 | /* Acceptance Filter Memory full - return */ |
frank26080115 | 0:84d7747641aa | 715 | total =((CANAF_FullCAN_cnt+1)>>1)+ CANAF_FullCAN_cnt*3 +((CANAF_std_cnt + 1) >> 1)+ \ |
frank26080115 | 0:84d7747641aa | 716 | CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1); |
frank26080115 | 0:84d7747641aa | 717 | //don't have enough space for this fullCAN Entry and its Object(3*32 bytes) |
frank26080115 | 0:84d7747641aa | 718 | if ((total >=508)||(CANAF_FullCAN_cnt>=64)){ |
frank26080115 | 0:84d7747641aa | 719 | return CAN_OBJECTS_FULL_ERROR; |
frank26080115 | 0:84d7747641aa | 720 | } |
frank26080115 | 0:84d7747641aa | 721 | /* Setup Acceptance Filter Configuration |
frank26080115 | 0:84d7747641aa | 722 | Acceptance Filter Mode Register = Off */ |
frank26080115 | 0:84d7747641aa | 723 | LPC_CANAF->AFMR = 0x00000001; |
frank26080115 | 0:84d7747641aa | 724 | |
frank26080115 | 0:84d7747641aa | 725 | /* Add mask for standard identifiers */ |
frank26080115 | 0:84d7747641aa | 726 | id &= 0x07FF; |
frank26080115 | 0:84d7747641aa | 727 | id |= (ctrl0 << 13) | (1 << 11); /* Add controller number */ |
frank26080115 | 0:84d7747641aa | 728 | // total = ((CANAF_std_cnt + 1) >> 1)+ CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1); |
frank26080115 | 0:84d7747641aa | 729 | /* Move all remaining sections one place up |
frank26080115 | 0:84d7747641aa | 730 | if new entry will increase FullCAN list */ |
frank26080115 | 0:84d7747641aa | 731 | if (((CANAF_FullCAN_cnt & 0x0001) == 0)&&(total!=0)) |
frank26080115 | 0:84d7747641aa | 732 | { |
frank26080115 | 0:84d7747641aa | 733 | //then remove remaining section |
frank26080115 | 0:84d7747641aa | 734 | cnt1 = (CANAF_FullCAN_cnt >> 1); |
frank26080115 | 0:84d7747641aa | 735 | bound1 = total; |
frank26080115 | 0:84d7747641aa | 736 | buf0 = LPC_CANAF_RAM->mask[cnt1]; |
frank26080115 | 0:84d7747641aa | 737 | |
frank26080115 | 0:84d7747641aa | 738 | while (bound1--) |
frank26080115 | 0:84d7747641aa | 739 | { |
frank26080115 | 0:84d7747641aa | 740 | cnt1++; |
frank26080115 | 0:84d7747641aa | 741 | buf1 = LPC_CANAF_RAM->mask[cnt1]; |
frank26080115 | 0:84d7747641aa | 742 | LPC_CANAF_RAM->mask[cnt1] = buf0; |
frank26080115 | 0:84d7747641aa | 743 | buf0 = buf1; |
frank26080115 | 0:84d7747641aa | 744 | } |
frank26080115 | 0:84d7747641aa | 745 | } |
frank26080115 | 0:84d7747641aa | 746 | if (CANAF_FullCAN_cnt == 0) |
frank26080115 | 0:84d7747641aa | 747 | { |
frank26080115 | 0:84d7747641aa | 748 | /* For entering first ID */ |
frank26080115 | 0:84d7747641aa | 749 | LPC_CANAF_RAM->mask[0] = 0x0000FFFF | (id << 16); |
frank26080115 | 0:84d7747641aa | 750 | } |
frank26080115 | 0:84d7747641aa | 751 | else if (CANAF_FullCAN_cnt == 1) |
frank26080115 | 0:84d7747641aa | 752 | { |
frank26080115 | 0:84d7747641aa | 753 | /* For entering second ID */ |
frank26080115 | 0:84d7747641aa | 754 | if ((LPC_CANAF_RAM->mask[0] >> 16) > id) |
frank26080115 | 0:84d7747641aa | 755 | { |
frank26080115 | 0:84d7747641aa | 756 | LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] >> 16) | (id << 16); |
frank26080115 | 0:84d7747641aa | 757 | } |
frank26080115 | 0:84d7747641aa | 758 | else |
frank26080115 | 0:84d7747641aa | 759 | { |
frank26080115 | 0:84d7747641aa | 760 | LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] & 0xFFFF0000) | id; |
frank26080115 | 0:84d7747641aa | 761 | } |
frank26080115 | 0:84d7747641aa | 762 | } |
frank26080115 | 0:84d7747641aa | 763 | else |
frank26080115 | 0:84d7747641aa | 764 | { |
frank26080115 | 0:84d7747641aa | 765 | /* Find where to insert new ID */ |
frank26080115 | 0:84d7747641aa | 766 | cnt1 = 0; |
frank26080115 | 0:84d7747641aa | 767 | cnt2 = CANAF_FullCAN_cnt; |
frank26080115 | 0:84d7747641aa | 768 | bound1 = (CANAF_FullCAN_cnt - 1) >> 1; |
frank26080115 | 0:84d7747641aa | 769 | while (cnt1 <= bound1) |
frank26080115 | 0:84d7747641aa | 770 | { |
frank26080115 | 0:84d7747641aa | 771 | /* Loop through standard existing IDs */ |
frank26080115 | 0:84d7747641aa | 772 | if ((LPC_CANAF_RAM->mask[cnt1] >> 16) > id) |
frank26080115 | 0:84d7747641aa | 773 | { |
frank26080115 | 0:84d7747641aa | 774 | cnt2 = cnt1 * 2; |
frank26080115 | 0:84d7747641aa | 775 | break; |
frank26080115 | 0:84d7747641aa | 776 | } |
frank26080115 | 0:84d7747641aa | 777 | |
frank26080115 | 0:84d7747641aa | 778 | if ((LPC_CANAF_RAM->mask[cnt1] & 0x0000FFFF) > id) |
frank26080115 | 0:84d7747641aa | 779 | { |
frank26080115 | 0:84d7747641aa | 780 | cnt2 = cnt1 * 2 + 1; |
frank26080115 | 0:84d7747641aa | 781 | break; |
frank26080115 | 0:84d7747641aa | 782 | } |
frank26080115 | 0:84d7747641aa | 783 | |
frank26080115 | 0:84d7747641aa | 784 | cnt1++; |
frank26080115 | 0:84d7747641aa | 785 | } |
frank26080115 | 0:84d7747641aa | 786 | /* cnt1 = U32 where to insert new ID */ |
frank26080115 | 0:84d7747641aa | 787 | /* cnt2 = U16 where to insert new ID */ |
frank26080115 | 0:84d7747641aa | 788 | |
frank26080115 | 0:84d7747641aa | 789 | if (cnt1 > bound1) |
frank26080115 | 0:84d7747641aa | 790 | { |
frank26080115 | 0:84d7747641aa | 791 | /* Adding ID as last entry */ |
frank26080115 | 0:84d7747641aa | 792 | /* Even number of IDs exists */ |
frank26080115 | 0:84d7747641aa | 793 | if ((CANAF_FullCAN_cnt & 0x0001) == 0) |
frank26080115 | 0:84d7747641aa | 794 | { |
frank26080115 | 0:84d7747641aa | 795 | LPC_CANAF_RAM->mask[cnt1] = 0x0000FFFF | (id << 16); |
frank26080115 | 0:84d7747641aa | 796 | } |
frank26080115 | 0:84d7747641aa | 797 | /* Odd number of IDs exists */ |
frank26080115 | 0:84d7747641aa | 798 | else |
frank26080115 | 0:84d7747641aa | 799 | { |
frank26080115 | 0:84d7747641aa | 800 | LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | id; |
frank26080115 | 0:84d7747641aa | 801 | } |
frank26080115 | 0:84d7747641aa | 802 | } |
frank26080115 | 0:84d7747641aa | 803 | else |
frank26080115 | 0:84d7747641aa | 804 | { |
frank26080115 | 0:84d7747641aa | 805 | buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */ |
frank26080115 | 0:84d7747641aa | 806 | if ((cnt2 & 0x0001) == 0) |
frank26080115 | 0:84d7747641aa | 807 | { |
frank26080115 | 0:84d7747641aa | 808 | /* Insert new mask to even address*/ |
frank26080115 | 0:84d7747641aa | 809 | buf1 = (id << 16) | (buf0 >> 16); |
frank26080115 | 0:84d7747641aa | 810 | } |
frank26080115 | 0:84d7747641aa | 811 | else |
frank26080115 | 0:84d7747641aa | 812 | { |
frank26080115 | 0:84d7747641aa | 813 | /* Insert new mask to odd address */ |
frank26080115 | 0:84d7747641aa | 814 | buf1 = (buf0 & 0xFFFF0000) | id; |
frank26080115 | 0:84d7747641aa | 815 | } |
frank26080115 | 0:84d7747641aa | 816 | LPC_CANAF_RAM->mask[cnt1] = buf1;/* Insert mask */ |
frank26080115 | 0:84d7747641aa | 817 | bound1 = CANAF_FullCAN_cnt >> 1; |
frank26080115 | 0:84d7747641aa | 818 | /* Move all remaining standard mask entries one place up */ |
frank26080115 | 0:84d7747641aa | 819 | while (cnt1 < bound1) |
frank26080115 | 0:84d7747641aa | 820 | { |
frank26080115 | 0:84d7747641aa | 821 | cnt1++; |
frank26080115 | 0:84d7747641aa | 822 | buf1 = LPC_CANAF_RAM->mask[cnt1]; |
frank26080115 | 0:84d7747641aa | 823 | LPC_CANAF_RAM->mask[cnt1] = (buf1 >> 16) | (buf0 << 16); |
frank26080115 | 0:84d7747641aa | 824 | buf0 = buf1; |
frank26080115 | 0:84d7747641aa | 825 | } |
frank26080115 | 0:84d7747641aa | 826 | |
frank26080115 | 0:84d7747641aa | 827 | if ((CANAF_FullCAN_cnt & 0x0001) == 0) |
frank26080115 | 0:84d7747641aa | 828 | { |
frank26080115 | 0:84d7747641aa | 829 | /* Even number of IDs exists */ |
frank26080115 | 0:84d7747641aa | 830 | LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) |
frank26080115 | 0:84d7747641aa | 831 | | (0x0000FFFF); |
frank26080115 | 0:84d7747641aa | 832 | } |
frank26080115 | 0:84d7747641aa | 833 | } |
frank26080115 | 0:84d7747641aa | 834 | } |
frank26080115 | 0:84d7747641aa | 835 | //restruct FulCAN Object Section |
frank26080115 | 0:84d7747641aa | 836 | bound1 = CANAF_FullCAN_cnt - cnt2; |
frank26080115 | 0:84d7747641aa | 837 | cnt1 = total - (CANAF_FullCAN_cnt)*3 + cnt2*3 + 1; |
frank26080115 | 0:84d7747641aa | 838 | buf0 = LPC_CANAF_RAM->mask[cnt1]; |
frank26080115 | 0:84d7747641aa | 839 | buf1 = LPC_CANAF_RAM->mask[cnt1+1]; |
frank26080115 | 0:84d7747641aa | 840 | buf2 = LPC_CANAF_RAM->mask[cnt1+2]; |
frank26080115 | 0:84d7747641aa | 841 | LPC_CANAF_RAM->mask[cnt1]=LPC_CANAF_RAM->mask[cnt1+1]= LPC_CANAF_RAM->mask[cnt1+2]=0x00; |
frank26080115 | 0:84d7747641aa | 842 | cnt1+=3; |
frank26080115 | 0:84d7747641aa | 843 | while(bound1--) |
frank26080115 | 0:84d7747641aa | 844 | { |
frank26080115 | 0:84d7747641aa | 845 | tmp0 = LPC_CANAF_RAM->mask[cnt1]; |
frank26080115 | 0:84d7747641aa | 846 | tmp1 = LPC_CANAF_RAM->mask[cnt1+1]; |
frank26080115 | 0:84d7747641aa | 847 | tmp2 = LPC_CANAF_RAM->mask[cnt1+2]; |
frank26080115 | 0:84d7747641aa | 848 | LPC_CANAF_RAM->mask[cnt1]= buf0; |
frank26080115 | 0:84d7747641aa | 849 | LPC_CANAF_RAM->mask[cnt1+1]= buf1; |
frank26080115 | 0:84d7747641aa | 850 | LPC_CANAF_RAM->mask[cnt1+2]= buf2; |
frank26080115 | 0:84d7747641aa | 851 | buf0 = tmp0; |
frank26080115 | 0:84d7747641aa | 852 | buf1 = tmp1; |
frank26080115 | 0:84d7747641aa | 853 | buf2 = tmp2; |
frank26080115 | 0:84d7747641aa | 854 | cnt1+=3; |
frank26080115 | 0:84d7747641aa | 855 | } |
frank26080115 | 0:84d7747641aa | 856 | CANAF_FullCAN_cnt++; |
frank26080115 | 0:84d7747641aa | 857 | //update address values |
frank26080115 | 0:84d7747641aa | 858 | LPC_CANAF->SFF_sa +=0x04; |
frank26080115 | 0:84d7747641aa | 859 | LPC_CANAF->SFF_GRP_sa +=0x04 ; |
frank26080115 | 0:84d7747641aa | 860 | LPC_CANAF->EFF_sa +=0x04 ; |
frank26080115 | 0:84d7747641aa | 861 | LPC_CANAF->EFF_GRP_sa +=0x04; |
frank26080115 | 0:84d7747641aa | 862 | LPC_CANAF->ENDofTable +=0x04; |
frank26080115 | 0:84d7747641aa | 863 | |
frank26080115 | 0:84d7747641aa | 864 | LPC_CANAF->AFMR = 0x04; |
frank26080115 | 0:84d7747641aa | 865 | return CAN_OK; |
frank26080115 | 0:84d7747641aa | 866 | } |
frank26080115 | 0:84d7747641aa | 867 | |
frank26080115 | 0:84d7747641aa | 868 | /********************************************************************//** |
frank26080115 | 0:84d7747641aa | 869 | * @brief Load Group entry into AFLUT |
frank26080115 | 0:84d7747641aa | 870 | * @param[in] CANx: CAN peripheral selected, should be: |
frank26080115 | 0:84d7747641aa | 871 | * - LPC_CAN1: CAN1 peripheral |
frank26080115 | 0:84d7747641aa | 872 | * - LPC_CAN2: CAN2 peripheral |
frank26080115 | 0:84d7747641aa | 873 | * @param[in] lowerID, upperID: lower and upper identifier of entry |
frank26080115 | 0:84d7747641aa | 874 | * @param[in] format: type of ID format, should be: |
frank26080115 | 0:84d7747641aa | 875 | * - STD_ID_FORMAT: Standard ID format (11-bit value) |
frank26080115 | 0:84d7747641aa | 876 | * - EXT_ID_FORMAT: Extended ID format (29-bit value) |
frank26080115 | 0:84d7747641aa | 877 | * @return CAN_ERROR, could be: |
frank26080115 | 0:84d7747641aa | 878 | * - CAN_OK: loading is successful |
frank26080115 | 0:84d7747641aa | 879 | * - CAN_CONFLICT_ID_ERROR: Conflict ID occurs |
frank26080115 | 0:84d7747641aa | 880 | * - CAN_OBJECTS_FULL_ERROR: no more space available |
frank26080115 | 0:84d7747641aa | 881 | *********************************************************************/ |
frank26080115 | 0:84d7747641aa | 882 | CAN_ERROR CAN_LoadGroupEntry(LPC_CAN_TypeDef* CANx, uint32_t lowerID, \ |
frank26080115 | 0:84d7747641aa | 883 | uint32_t upperID, CAN_ID_FORMAT_Type format) |
frank26080115 | 0:84d7747641aa | 884 | { |
frank26080115 | 0:84d7747641aa | 885 | uint16_t tmp = 0; |
frank26080115 | 0:84d7747641aa | 886 | uint32_t buf0 = 0, buf1 = 0, entry1, entry2, LID,UID; |
frank26080115 | 0:84d7747641aa | 887 | int16_t cnt1, bound1, total; |
frank26080115 | 0:84d7747641aa | 888 | |
frank26080115 | 0:84d7747641aa | 889 | CHECK_PARAM(PARAM_CANx(CANx)); |
frank26080115 | 0:84d7747641aa | 890 | CHECK_PARAM(PARAM_ID_FORMAT(format)); |
frank26080115 | 0:84d7747641aa | 891 | |
frank26080115 | 0:84d7747641aa | 892 | if(lowerID > upperID) return CAN_CONFLICT_ID_ERROR; |
frank26080115 | 0:84d7747641aa | 893 | if(CANx == LPC_CAN1) |
frank26080115 | 0:84d7747641aa | 894 | { |
frank26080115 | 0:84d7747641aa | 895 | tmp = 0; |
frank26080115 | 0:84d7747641aa | 896 | } |
frank26080115 | 0:84d7747641aa | 897 | else |
frank26080115 | 0:84d7747641aa | 898 | { |
frank26080115 | 0:84d7747641aa | 899 | tmp = 1; |
frank26080115 | 0:84d7747641aa | 900 | } |
frank26080115 | 0:84d7747641aa | 901 | |
frank26080115 | 0:84d7747641aa | 902 | total =((CANAF_FullCAN_cnt+1)>>1)+ CANAF_FullCAN_cnt*3 +((CANAF_std_cnt + 1) >> 1)+ \ |
frank26080115 | 0:84d7747641aa | 903 | CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1); |
frank26080115 | 0:84d7747641aa | 904 | |
frank26080115 | 0:84d7747641aa | 905 | /* Setup Acceptance Filter Configuration |
frank26080115 | 0:84d7747641aa | 906 | Acceptance Filter Mode Register = Off */ |
frank26080115 | 0:84d7747641aa | 907 | LPC_CANAF->AFMR = 0x00000001; |
frank26080115 | 0:84d7747641aa | 908 | |
frank26080115 | 0:84d7747641aa | 909 | /*********Add Group of Standard Identifier Frame Format************/ |
frank26080115 | 0:84d7747641aa | 910 | if(format == STD_ID_FORMAT) |
frank26080115 | 0:84d7747641aa | 911 | { |
frank26080115 | 0:84d7747641aa | 912 | if ((total >= 512)){//don't have enough space |
frank26080115 | 0:84d7747641aa | 913 | return CAN_OBJECTS_FULL_ERROR; |
frank26080115 | 0:84d7747641aa | 914 | } |
frank26080115 | 0:84d7747641aa | 915 | lowerID &=0x7FF; //mask ID |
frank26080115 | 0:84d7747641aa | 916 | upperID &=0x7FF; |
frank26080115 | 0:84d7747641aa | 917 | entry1 = (tmp << 29)|(lowerID << 16)|(tmp << 13)|(upperID << 0); |
frank26080115 | 0:84d7747641aa | 918 | cnt1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1); |
frank26080115 | 0:84d7747641aa | 919 | |
frank26080115 | 0:84d7747641aa | 920 | //if this is the first Group standard ID entry |
frank26080115 | 0:84d7747641aa | 921 | if(CANAF_gstd_cnt == 0) |
frank26080115 | 0:84d7747641aa | 922 | { |
frank26080115 | 0:84d7747641aa | 923 | LPC_CANAF_RAM->mask[cnt1] = entry1; |
frank26080115 | 0:84d7747641aa | 924 | } |
frank26080115 | 0:84d7747641aa | 925 | else |
frank26080115 | 0:84d7747641aa | 926 | { |
frank26080115 | 0:84d7747641aa | 927 | //find the position to add new Group entry |
frank26080115 | 0:84d7747641aa | 928 | bound1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt; |
frank26080115 | 0:84d7747641aa | 929 | while(cnt1 < bound1) |
frank26080115 | 0:84d7747641aa | 930 | { |
frank26080115 | 0:84d7747641aa | 931 | buf0 = LPC_CANAF_RAM->mask[cnt1]; |
frank26080115 | 0:84d7747641aa | 932 | LID = (buf0 >> 16)&0x7FF; |
frank26080115 | 0:84d7747641aa | 933 | UID = buf0 & 0x7FF; |
frank26080115 | 0:84d7747641aa | 934 | if (upperID <= LID) |
frank26080115 | 0:84d7747641aa | 935 | { |
frank26080115 | 0:84d7747641aa | 936 | //add new entry before this entry |
frank26080115 | 0:84d7747641aa | 937 | LPC_CANAF_RAM->mask[cnt1] = entry1; |
frank26080115 | 0:84d7747641aa | 938 | break; |
frank26080115 | 0:84d7747641aa | 939 | } |
frank26080115 | 0:84d7747641aa | 940 | else if (lowerID >= UID) |
frank26080115 | 0:84d7747641aa | 941 | { |
frank26080115 | 0:84d7747641aa | 942 | //load next entry to compare |
frank26080115 | 0:84d7747641aa | 943 | cnt1 ++; |
frank26080115 | 0:84d7747641aa | 944 | } |
frank26080115 | 0:84d7747641aa | 945 | else |
frank26080115 | 0:84d7747641aa | 946 | return CAN_CONFLICT_ID_ERROR; |
frank26080115 | 0:84d7747641aa | 947 | } |
frank26080115 | 0:84d7747641aa | 948 | if(cnt1 >= bound1) |
frank26080115 | 0:84d7747641aa | 949 | { |
frank26080115 | 0:84d7747641aa | 950 | //add new entry at the last position in this list |
frank26080115 | 0:84d7747641aa | 951 | buf0 = LPC_CANAF_RAM->mask[cnt1]; |
frank26080115 | 0:84d7747641aa | 952 | LPC_CANAF_RAM->mask[cnt1] = entry1; |
frank26080115 | 0:84d7747641aa | 953 | } |
frank26080115 | 0:84d7747641aa | 954 | |
frank26080115 | 0:84d7747641aa | 955 | //remove all remaining entry of this section one place up |
frank26080115 | 0:84d7747641aa | 956 | bound1 = total - cnt1; |
frank26080115 | 0:84d7747641aa | 957 | while(bound1--) |
frank26080115 | 0:84d7747641aa | 958 | { |
frank26080115 | 0:84d7747641aa | 959 | cnt1++; |
frank26080115 | 0:84d7747641aa | 960 | buf1 = LPC_CANAF_RAM->mask[cnt1]; |
frank26080115 | 0:84d7747641aa | 961 | LPC_CANAF_RAM->mask[cnt1] = buf0; |
frank26080115 | 0:84d7747641aa | 962 | buf0 = buf1; |
frank26080115 | 0:84d7747641aa | 963 | } |
frank26080115 | 0:84d7747641aa | 964 | } |
frank26080115 | 0:84d7747641aa | 965 | CANAF_gstd_cnt++; |
frank26080115 | 0:84d7747641aa | 966 | //update address values |
frank26080115 | 0:84d7747641aa | 967 | LPC_CANAF->EFF_sa +=0x04 ; |
frank26080115 | 0:84d7747641aa | 968 | LPC_CANAF->EFF_GRP_sa +=0x04; |
frank26080115 | 0:84d7747641aa | 969 | LPC_CANAF->ENDofTable +=0x04; |
frank26080115 | 0:84d7747641aa | 970 | } |
frank26080115 | 0:84d7747641aa | 971 | |
frank26080115 | 0:84d7747641aa | 972 | |
frank26080115 | 0:84d7747641aa | 973 | /*********Add Group of Extended Identifier Frame Format************/ |
frank26080115 | 0:84d7747641aa | 974 | else |
frank26080115 | 0:84d7747641aa | 975 | { |
frank26080115 | 0:84d7747641aa | 976 | if ((total >= 511)){//don't have enough space |
frank26080115 | 0:84d7747641aa | 977 | return CAN_OBJECTS_FULL_ERROR; |
frank26080115 | 0:84d7747641aa | 978 | } |
frank26080115 | 0:84d7747641aa | 979 | lowerID &= 0x1FFFFFFF; //mask ID |
frank26080115 | 0:84d7747641aa | 980 | upperID &= 0x1FFFFFFF; |
frank26080115 | 0:84d7747641aa | 981 | entry1 = (tmp << 29)|(lowerID << 0); |
frank26080115 | 0:84d7747641aa | 982 | entry2 = (tmp << 29)|(upperID << 0); |
frank26080115 | 0:84d7747641aa | 983 | |
frank26080115 | 0:84d7747641aa | 984 | cnt1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt + CANAF_ext_cnt; |
frank26080115 | 0:84d7747641aa | 985 | //if this is the first Group standard ID entry |
frank26080115 | 0:84d7747641aa | 986 | if(CANAF_gext_cnt == 0) |
frank26080115 | 0:84d7747641aa | 987 | { |
frank26080115 | 0:84d7747641aa | 988 | LPC_CANAF_RAM->mask[cnt1] = entry1; |
frank26080115 | 0:84d7747641aa | 989 | LPC_CANAF_RAM->mask[cnt1+1] = entry2; |
frank26080115 | 0:84d7747641aa | 990 | } |
frank26080115 | 0:84d7747641aa | 991 | else |
frank26080115 | 0:84d7747641aa | 992 | { |
frank26080115 | 0:84d7747641aa | 993 | //find the position to add new Group entry |
frank26080115 | 0:84d7747641aa | 994 | bound1 = ((CANAF_FullCAN_cnt+1)>>1) + ((CANAF_std_cnt + 1) >> 1) + CANAF_gstd_cnt \ |
frank26080115 | 0:84d7747641aa | 995 | + CANAF_ext_cnt + (CANAF_gext_cnt<<1); |
frank26080115 | 0:84d7747641aa | 996 | while(cnt1 < bound1) |
frank26080115 | 0:84d7747641aa | 997 | { |
frank26080115 | 0:84d7747641aa | 998 | buf0 = LPC_CANAF_RAM->mask[cnt1]; |
frank26080115 | 0:84d7747641aa | 999 | buf1 = LPC_CANAF_RAM->mask[cnt1+1]; |
frank26080115 | 0:84d7747641aa | 1000 | LID = buf0 & 0x1FFFFFFF; //mask ID |
frank26080115 | 0:84d7747641aa | 1001 | UID = buf1 & 0x1FFFFFFF; |
frank26080115 | 0:84d7747641aa | 1002 | if (upperID <= LID) |
frank26080115 | 0:84d7747641aa | 1003 | { |
frank26080115 | 0:84d7747641aa | 1004 | //add new entry before this entry |
frank26080115 | 0:84d7747641aa | 1005 | LPC_CANAF_RAM->mask[cnt1] = entry1; |
frank26080115 | 0:84d7747641aa | 1006 | LPC_CANAF_RAM->mask[++cnt1] = entry2; |
frank26080115 | 0:84d7747641aa | 1007 | break; |
frank26080115 | 0:84d7747641aa | 1008 | } |
frank26080115 | 0:84d7747641aa | 1009 | else if (lowerID >= UID) |
frank26080115 | 0:84d7747641aa | 1010 | { |
frank26080115 | 0:84d7747641aa | 1011 | //load next entry to compare |
frank26080115 | 0:84d7747641aa | 1012 | cnt1 +=2; |
frank26080115 | 0:84d7747641aa | 1013 | } |
frank26080115 | 0:84d7747641aa | 1014 | else |
frank26080115 | 0:84d7747641aa | 1015 | return CAN_CONFLICT_ID_ERROR; |
frank26080115 | 0:84d7747641aa | 1016 | } |
frank26080115 | 0:84d7747641aa | 1017 | if(cnt1 >= bound1) |
frank26080115 | 0:84d7747641aa | 1018 | { |
frank26080115 | 0:84d7747641aa | 1019 | //add new entry at the last position in this list |
frank26080115 | 0:84d7747641aa | 1020 | buf0 = LPC_CANAF_RAM->mask[cnt1]; |
frank26080115 | 0:84d7747641aa | 1021 | buf1 = LPC_CANAF_RAM->mask[cnt1+1]; |
frank26080115 | 0:84d7747641aa | 1022 | LPC_CANAF_RAM->mask[cnt1] = entry1; |
frank26080115 | 0:84d7747641aa | 1023 | LPC_CANAF_RAM->mask[++cnt1] = entry2; |
frank26080115 | 0:84d7747641aa | 1024 | } |
frank26080115 | 0:84d7747641aa | 1025 | //remove all remaining entry of this section two place up |
frank26080115 | 0:84d7747641aa | 1026 | bound1 = total - cnt1 + 1; |
frank26080115 | 0:84d7747641aa | 1027 | cnt1++; |
frank26080115 | 0:84d7747641aa | 1028 | while(bound1>0) |
frank26080115 | 0:84d7747641aa | 1029 | { |
frank26080115 | 0:84d7747641aa | 1030 | entry1 = LPC_CANAF_RAM->mask[cnt1]; |
frank26080115 | 0:84d7747641aa | 1031 | entry2 = LPC_CANAF_RAM->mask[cnt1+1]; |
frank26080115 | 0:84d7747641aa | 1032 | LPC_CANAF_RAM->mask[cnt1] = buf0; |
frank26080115 | 0:84d7747641aa | 1033 | LPC_CANAF_RAM->mask[cnt1+1] = buf1; |
frank26080115 | 0:84d7747641aa | 1034 | buf0 = entry1; |
frank26080115 | 0:84d7747641aa | 1035 | buf1 = entry2; |
frank26080115 | 0:84d7747641aa | 1036 | cnt1 +=2; |
frank26080115 | 0:84d7747641aa | 1037 | bound1 -=2; |
frank26080115 | 0:84d7747641aa | 1038 | } |
frank26080115 | 0:84d7747641aa | 1039 | } |
frank26080115 | 0:84d7747641aa | 1040 | CANAF_gext_cnt++; |
frank26080115 | 0:84d7747641aa | 1041 | //update address values |
frank26080115 | 0:84d7747641aa | 1042 | LPC_CANAF->ENDofTable +=0x08; |
frank26080115 | 0:84d7747641aa | 1043 | } |
frank26080115 | 0:84d7747641aa | 1044 | LPC_CANAF->AFMR = 0x04; |
frank26080115 | 0:84d7747641aa | 1045 | return CAN_OK; |
frank26080115 | 0:84d7747641aa | 1046 | } |
frank26080115 | 0:84d7747641aa | 1047 | |
frank26080115 | 0:84d7747641aa | 1048 | /********************************************************************//** |
frank26080115 | 0:84d7747641aa | 1049 | * @brief Remove AFLUT entry (FullCAN entry and Explicit Standard entry) |
frank26080115 | 0:84d7747641aa | 1050 | * @param[in] EntryType: the type of entry that want to remove, should be: |
frank26080115 | 0:84d7747641aa | 1051 | * - FULLCAN_ENTRY |
frank26080115 | 0:84d7747641aa | 1052 | * - EXPLICIT_STANDARD_ENTRY |
frank26080115 | 0:84d7747641aa | 1053 | * - GROUP_STANDARD_ENTRY |
frank26080115 | 0:84d7747641aa | 1054 | * - EXPLICIT_EXTEND_ENTRY |
frank26080115 | 0:84d7747641aa | 1055 | * - GROUP_EXTEND_ENTRY |
frank26080115 | 0:84d7747641aa | 1056 | * @param[in] position: the position of this entry in its section |
frank26080115 | 0:84d7747641aa | 1057 | * Note: the first position is 0 |
frank26080115 | 0:84d7747641aa | 1058 | * @return CAN_ERROR, could be: |
frank26080115 | 0:84d7747641aa | 1059 | * - CAN_OK: removing is successful |
frank26080115 | 0:84d7747641aa | 1060 | * - CAN_ENTRY_NOT_EXIT_ERROR: entry want to remove is not exit |
frank26080115 | 0:84d7747641aa | 1061 | *********************************************************************/ |
frank26080115 | 0:84d7747641aa | 1062 | CAN_ERROR CAN_RemoveEntry(AFLUT_ENTRY_Type EntryType, uint16_t position) |
frank26080115 | 0:84d7747641aa | 1063 | { |
frank26080115 | 0:84d7747641aa | 1064 | uint16_t cnt, bound, total; |
frank26080115 | 0:84d7747641aa | 1065 | uint32_t buf0, buf1; |
frank26080115 | 0:84d7747641aa | 1066 | CHECK_PARAM(PARAM_AFLUT_ENTRY_TYPE(EntryType)); |
frank26080115 | 0:84d7747641aa | 1067 | CHECK_PARAM(PARAM_POSITION(position)); |
frank26080115 | 0:84d7747641aa | 1068 | |
frank26080115 | 0:84d7747641aa | 1069 | /* Setup Acceptance Filter Configuration |
frank26080115 | 0:84d7747641aa | 1070 | Acceptance Filter Mode Register = Off */ |
frank26080115 | 0:84d7747641aa | 1071 | LPC_CANAF->AFMR = 0x00000001; |
frank26080115 | 0:84d7747641aa | 1072 | total = ((CANAF_FullCAN_cnt+1)>>1)+((CANAF_std_cnt + 1) >> 1) + \ |
frank26080115 | 0:84d7747641aa | 1073 | CANAF_gstd_cnt + CANAF_ext_cnt + (CANAF_gext_cnt<<1); |
frank26080115 | 0:84d7747641aa | 1074 | |
frank26080115 | 0:84d7747641aa | 1075 | |
frank26080115 | 0:84d7747641aa | 1076 | /************** Remove FullCAN Entry *************/ |
frank26080115 | 0:84d7747641aa | 1077 | if(EntryType == FULLCAN_ENTRY) |
frank26080115 | 0:84d7747641aa | 1078 | { |
frank26080115 | 0:84d7747641aa | 1079 | if((CANAF_FullCAN_cnt==0)||(position >= CANAF_FullCAN_cnt)) |
frank26080115 | 0:84d7747641aa | 1080 | { |
frank26080115 | 0:84d7747641aa | 1081 | return CAN_ENTRY_NOT_EXIT_ERROR; |
frank26080115 | 0:84d7747641aa | 1082 | } |
frank26080115 | 0:84d7747641aa | 1083 | else |
frank26080115 | 0:84d7747641aa | 1084 | { |
frank26080115 | 0:84d7747641aa | 1085 | cnt = position >> 1; |
frank26080115 | 0:84d7747641aa | 1086 | buf0 = LPC_CANAF_RAM->mask[cnt]; |
frank26080115 | 0:84d7747641aa | 1087 | bound = (CANAF_FullCAN_cnt - position -1)>>1; |
frank26080115 | 0:84d7747641aa | 1088 | if((position & 0x0001) == 0) //event position |
frank26080115 | 0:84d7747641aa | 1089 | { |
frank26080115 | 0:84d7747641aa | 1090 | while(bound--) |
frank26080115 | 0:84d7747641aa | 1091 | { |
frank26080115 | 0:84d7747641aa | 1092 | //remove all remaining FullCAN entry one place down |
frank26080115 | 0:84d7747641aa | 1093 | buf1 = LPC_CANAF_RAM->mask[cnt+1]; |
frank26080115 | 0:84d7747641aa | 1094 | LPC_CANAF_RAM->mask[cnt] = (buf1 >> 16) | (buf0 << 16); |
frank26080115 | 0:84d7747641aa | 1095 | buf0 = buf1; |
frank26080115 | 0:84d7747641aa | 1096 | cnt++; |
frank26080115 | 0:84d7747641aa | 1097 | } |
frank26080115 | 0:84d7747641aa | 1098 | } |
frank26080115 | 0:84d7747641aa | 1099 | else //odd position |
frank26080115 | 0:84d7747641aa | 1100 | { |
frank26080115 | 0:84d7747641aa | 1101 | while(bound--) |
frank26080115 | 0:84d7747641aa | 1102 | { |
frank26080115 | 0:84d7747641aa | 1103 | //remove all remaining FullCAN entry one place down |
frank26080115 | 0:84d7747641aa | 1104 | buf1 = LPC_CANAF_RAM->mask[cnt+1]; |
frank26080115 | 0:84d7747641aa | 1105 | LPC_CANAF_RAM->mask[cnt] = (buf0 & 0xFFFF0000)|(buf1 >> 16); |
frank26080115 | 0:84d7747641aa | 1106 | LPC_CANAF_RAM->mask[cnt+1] = LPC_CANAF_RAM->mask[cnt+1] << 16; |
frank26080115 | 0:84d7747641aa | 1107 | buf0 = buf1<<16; |
frank26080115 | 0:84d7747641aa | 1108 | cnt++; |
frank26080115 | 0:84d7747641aa | 1109 | } |
frank26080115 | 0:84d7747641aa | 1110 | } |
frank26080115 | 0:84d7747641aa | 1111 | if((CANAF_FullCAN_cnt & 0x0001) == 0) |
frank26080115 | 0:84d7747641aa | 1112 | { |
frank26080115 | 0:84d7747641aa | 1113 | if((position & 0x0001)==0) |
frank26080115 | 0:84d7747641aa | 1114 | LPC_CANAF_RAM->mask[cnt] = (buf0 << 16) | (0x0000FFFF); |
frank26080115 | 0:84d7747641aa | 1115 | else |
frank26080115 | 0:84d7747641aa | 1116 | LPC_CANAF_RAM->mask[cnt] = buf0 | 0x0000FFFF; |
frank26080115 | 0:84d7747641aa | 1117 | } |
frank26080115 | 0:84d7747641aa | 1118 | else |
frank26080115 | 0:84d7747641aa | 1119 | { |
frank26080115 | 0:84d7747641aa | 1120 | //remove all remaining section one place down |
frank26080115 | 0:84d7747641aa | 1121 | cnt = (CANAF_FullCAN_cnt + 1)>>1; |
frank26080115 | 0:84d7747641aa | 1122 | bound = total + CANAF_FullCAN_cnt * 3; |
frank26080115 | 0:84d7747641aa | 1123 | while(bound>cnt) |
frank26080115 | 0:84d7747641aa | 1124 | { |
frank26080115 | 0:84d7747641aa | 1125 | LPC_CANAF_RAM->mask[cnt-1] = LPC_CANAF_RAM->mask[cnt]; |
frank26080115 | 0:84d7747641aa | 1126 | cnt++; |
frank26080115 | 0:84d7747641aa | 1127 | } |
frank26080115 | 0:84d7747641aa | 1128 | LPC_CANAF_RAM->mask[cnt-1]=0x00; |
frank26080115 | 0:84d7747641aa | 1129 | //update address values |
frank26080115 | 0:84d7747641aa | 1130 | LPC_CANAF->SFF_sa -=0x04; |
frank26080115 | 0:84d7747641aa | 1131 | LPC_CANAF->SFF_GRP_sa -=0x04 ; |
frank26080115 | 0:84d7747641aa | 1132 | LPC_CANAF->EFF_sa -=0x04 ; |
frank26080115 | 0:84d7747641aa | 1133 | LPC_CANAF->EFF_GRP_sa -=0x04; |
frank26080115 | 0:84d7747641aa | 1134 | LPC_CANAF->ENDofTable -=0x04; |
frank26080115 | 0:84d7747641aa | 1135 | } |
frank26080115 | 0:84d7747641aa | 1136 | CANAF_FullCAN_cnt--; |
frank26080115 | 0:84d7747641aa | 1137 | |
frank26080115 | 0:84d7747641aa | 1138 | //delete its FullCAN Object in the FullCAN Object section |
frank26080115 | 0:84d7747641aa | 1139 | //remove all remaining FullCAN Object three place down |
frank26080115 | 0:84d7747641aa | 1140 | cnt = total + position * 3; |
frank26080115 | 0:84d7747641aa | 1141 | bound = (CANAF_FullCAN_cnt - position + 1) * 3; |
frank26080115 | 0:84d7747641aa | 1142 | |
frank26080115 | 0:84d7747641aa | 1143 | while(bound) |
frank26080115 | 0:84d7747641aa | 1144 | { |
frank26080115 | 0:84d7747641aa | 1145 | LPC_CANAF_RAM->mask[cnt]=LPC_CANAF_RAM->mask[cnt+3];; |
frank26080115 | 0:84d7747641aa | 1146 | LPC_CANAF_RAM->mask[cnt+1]=LPC_CANAF_RAM->mask[cnt+4]; |
frank26080115 | 0:84d7747641aa | 1147 | LPC_CANAF_RAM->mask[cnt+2]=LPC_CANAF_RAM->mask[cnt+5]; |
frank26080115 | 0:84d7747641aa | 1148 | bound -=3; |
frank26080115 | 0:84d7747641aa | 1149 | cnt +=3; |
frank26080115 | 0:84d7747641aa | 1150 | } |
frank26080115 | 0:84d7747641aa | 1151 | } |
frank26080115 | 0:84d7747641aa | 1152 | } |
frank26080115 | 0:84d7747641aa | 1153 | |
frank26080115 | 0:84d7747641aa | 1154 | /************** Remove Explicit Standard ID Entry *************/ |
frank26080115 | 0:84d7747641aa | 1155 | else if(EntryType == EXPLICIT_STANDARD_ENTRY) |
frank26080115 | 0:84d7747641aa | 1156 | { |
frank26080115 | 0:84d7747641aa | 1157 | if((CANAF_std_cnt==0)||(position >= CANAF_std_cnt)) |
frank26080115 | 0:84d7747641aa | 1158 | { |
frank26080115 | 0:84d7747641aa | 1159 | return CAN_ENTRY_NOT_EXIT_ERROR; |
frank26080115 | 0:84d7747641aa | 1160 | } |
frank26080115 | 0:84d7747641aa | 1161 | else |
frank26080115 | 0:84d7747641aa | 1162 | { |
frank26080115 | 0:84d7747641aa | 1163 | cnt = ((CANAF_FullCAN_cnt+1)>>1)+ (position >> 1); |
frank26080115 | 0:84d7747641aa | 1164 | buf0 = LPC_CANAF_RAM->mask[cnt]; |
frank26080115 | 0:84d7747641aa | 1165 | bound = (CANAF_std_cnt - position - 1)>>1; |
frank26080115 | 0:84d7747641aa | 1166 | if((position & 0x0001) == 0) //event position |
frank26080115 | 0:84d7747641aa | 1167 | { |
frank26080115 | 0:84d7747641aa | 1168 | while(bound--) |
frank26080115 | 0:84d7747641aa | 1169 | { |
frank26080115 | 0:84d7747641aa | 1170 | //remove all remaining FullCAN entry one place down |
frank26080115 | 0:84d7747641aa | 1171 | buf1 = LPC_CANAF_RAM->mask[cnt+1]; |
frank26080115 | 0:84d7747641aa | 1172 | LPC_CANAF_RAM->mask[cnt] = (buf1 >> 16) | (buf0 << 16); |
frank26080115 | 0:84d7747641aa | 1173 | buf0 = buf1; |
frank26080115 | 0:84d7747641aa | 1174 | cnt++; |
frank26080115 | 0:84d7747641aa | 1175 | } |
frank26080115 | 0:84d7747641aa | 1176 | } |
frank26080115 | 0:84d7747641aa | 1177 | else //odd position |
frank26080115 | 0:84d7747641aa | 1178 | { |
frank26080115 | 0:84d7747641aa | 1179 | while(bound--) |
frank26080115 | 0:84d7747641aa | 1180 | { |
frank26080115 | 0:84d7747641aa | 1181 | //remove all remaining FullCAN entry one place down |
frank26080115 | 0:84d7747641aa | 1182 | buf1 = LPC_CANAF_RAM->mask[cnt+1]; |
frank26080115 | 0:84d7747641aa | 1183 | LPC_CANAF_RAM->mask[cnt] = (buf0 & 0xFFFF0000)|(buf1 >> 16); |
frank26080115 | 0:84d7747641aa | 1184 | LPC_CANAF_RAM->mask[cnt+1] = LPC_CANAF_RAM->mask[cnt+1] << 16; |
frank26080115 | 0:84d7747641aa | 1185 | buf0 = buf1<<16; |
frank26080115 | 0:84d7747641aa | 1186 | cnt++; |
frank26080115 | 0:84d7747641aa | 1187 | } |
frank26080115 | 0:84d7747641aa | 1188 | } |
frank26080115 | 0:84d7747641aa | 1189 | if((CANAF_std_cnt & 0x0001) == 0) |
frank26080115 | 0:84d7747641aa | 1190 | { |
frank26080115 | 0:84d7747641aa | 1191 | if((position & 0x0001)==0) |
frank26080115 | 0:84d7747641aa | 1192 | LPC_CANAF_RAM->mask[cnt] = (buf0 << 16) | (0x0000FFFF); |
frank26080115 | 0:84d7747641aa | 1193 | else |
frank26080115 | 0:84d7747641aa | 1194 | LPC_CANAF_RAM->mask[cnt] = buf0 | 0x0000FFFF; |
frank26080115 | 0:84d7747641aa | 1195 | } |
frank26080115 | 0:84d7747641aa | 1196 | else |
frank26080115 | 0:84d7747641aa | 1197 | { |
frank26080115 | 0:84d7747641aa | 1198 | //remove all remaining section one place down |
frank26080115 | 0:84d7747641aa | 1199 | cnt = ((CANAF_FullCAN_cnt + 1)>>1) + ((CANAF_std_cnt + 1) >> 1); |
frank26080115 | 0:84d7747641aa | 1200 | bound = total + CANAF_FullCAN_cnt * 3; |
frank26080115 | 0:84d7747641aa | 1201 | while(bound>cnt) |
frank26080115 | 0:84d7747641aa | 1202 | { |
frank26080115 | 0:84d7747641aa | 1203 | LPC_CANAF_RAM->mask[cnt-1] = LPC_CANAF_RAM->mask[cnt]; |
frank26080115 | 0:84d7747641aa | 1204 | cnt++; |
frank26080115 | 0:84d7747641aa | 1205 | } |
frank26080115 | 0:84d7747641aa | 1206 | LPC_CANAF_RAM->mask[cnt-1]=0x00; |
frank26080115 | 0:84d7747641aa | 1207 | //update address value |
frank26080115 | 0:84d7747641aa | 1208 | LPC_CANAF->SFF_GRP_sa -=0x04 ; |
frank26080115 | 0:84d7747641aa | 1209 | LPC_CANAF->EFF_sa -=0x04 ; |
frank26080115 | 0:84d7747641aa | 1210 | LPC_CANAF->EFF_GRP_sa -=0x04; |
frank26080115 | 0:84d7747641aa | 1211 | LPC_CANAF->ENDofTable -=0x04; |
frank26080115 | 0:84d7747641aa | 1212 | } |
frank26080115 | 0:84d7747641aa | 1213 | CANAF_std_cnt--; |
frank26080115 | 0:84d7747641aa | 1214 | } |
frank26080115 | 0:84d7747641aa | 1215 | } |
frank26080115 | 0:84d7747641aa | 1216 | |
frank26080115 | 0:84d7747641aa | 1217 | /************** Remove Group of Standard ID Entry *************/ |
frank26080115 | 0:84d7747641aa | 1218 | else if(EntryType == GROUP_STANDARD_ENTRY) |
frank26080115 | 0:84d7747641aa | 1219 | { |
frank26080115 | 0:84d7747641aa | 1220 | if((CANAF_gstd_cnt==0)||(position >= CANAF_gstd_cnt)) |
frank26080115 | 0:84d7747641aa | 1221 | { |
frank26080115 | 0:84d7747641aa | 1222 | return CAN_ENTRY_NOT_EXIT_ERROR; |
frank26080115 | 0:84d7747641aa | 1223 | } |
frank26080115 | 0:84d7747641aa | 1224 | else |
frank26080115 | 0:84d7747641aa | 1225 | { |
frank26080115 | 0:84d7747641aa | 1226 | cnt = ((CANAF_FullCAN_cnt + 1)>>1) + ((CANAF_std_cnt + 1) >> 1)+ position + 1; |
frank26080115 | 0:84d7747641aa | 1227 | bound = total + CANAF_FullCAN_cnt * 3; |
frank26080115 | 0:84d7747641aa | 1228 | while (cnt<bound) |
frank26080115 | 0:84d7747641aa | 1229 | { |
frank26080115 | 0:84d7747641aa | 1230 | LPC_CANAF_RAM->mask[cnt-1] = LPC_CANAF_RAM->mask[cnt]; |
frank26080115 | 0:84d7747641aa | 1231 | cnt++; |
frank26080115 | 0:84d7747641aa | 1232 | } |
frank26080115 | 0:84d7747641aa | 1233 | LPC_CANAF_RAM->mask[cnt-1]=0x00; |
frank26080115 | 0:84d7747641aa | 1234 | } |
frank26080115 | 0:84d7747641aa | 1235 | CANAF_gstd_cnt--; |
frank26080115 | 0:84d7747641aa | 1236 | //update address value |
frank26080115 | 0:84d7747641aa | 1237 | LPC_CANAF->EFF_sa -=0x04; |
frank26080115 | 0:84d7747641aa | 1238 | LPC_CANAF->EFF_GRP_sa -=0x04; |
frank26080115 | 0:84d7747641aa | 1239 | LPC_CANAF->ENDofTable -=0x04; |
frank26080115 | 0:84d7747641aa | 1240 | } |
frank26080115 | 0:84d7747641aa | 1241 | |
frank26080115 | 0:84d7747641aa | 1242 | /************** Remove Explicit Extended ID Entry *************/ |
frank26080115 | 0:84d7747641aa | 1243 | else if(EntryType == EXPLICIT_EXTEND_ENTRY) |
frank26080115 | 0:84d7747641aa | 1244 | { |
frank26080115 | 0:84d7747641aa | 1245 | if((CANAF_ext_cnt==0)||(position >= CANAF_ext_cnt)) |
frank26080115 | 0:84d7747641aa | 1246 | { |
frank26080115 | 0:84d7747641aa | 1247 | return CAN_ENTRY_NOT_EXIT_ERROR; |
frank26080115 | 0:84d7747641aa | 1248 | } |
frank26080115 | 0:84d7747641aa | 1249 | else |
frank26080115 | 0:84d7747641aa | 1250 | { |
frank26080115 | 0:84d7747641aa | 1251 | cnt = ((CANAF_FullCAN_cnt + 1)>>1) + ((CANAF_std_cnt + 1) >> 1)+ CANAF_gstd_cnt + position + 1; |
frank26080115 | 0:84d7747641aa | 1252 | bound = total + CANAF_FullCAN_cnt * 3; |
frank26080115 | 0:84d7747641aa | 1253 | while (cnt<bound) |
frank26080115 | 0:84d7747641aa | 1254 | { |
frank26080115 | 0:84d7747641aa | 1255 | LPC_CANAF_RAM->mask[cnt-1] = LPC_CANAF_RAM->mask[cnt]; |
frank26080115 | 0:84d7747641aa | 1256 | cnt++; |
frank26080115 | 0:84d7747641aa | 1257 | } |
frank26080115 | 0:84d7747641aa | 1258 | LPC_CANAF_RAM->mask[cnt-1]=0x00; |
frank26080115 | 0:84d7747641aa | 1259 | } |
frank26080115 | 0:84d7747641aa | 1260 | CANAF_ext_cnt--; |
frank26080115 | 0:84d7747641aa | 1261 | LPC_CANAF->EFF_GRP_sa -=0x04; |
frank26080115 | 0:84d7747641aa | 1262 | LPC_CANAF->ENDofTable -=0x04; |
frank26080115 | 0:84d7747641aa | 1263 | } |
frank26080115 | 0:84d7747641aa | 1264 | |
frank26080115 | 0:84d7747641aa | 1265 | /************** Remove Group of Extended ID Entry *************/ |
frank26080115 | 0:84d7747641aa | 1266 | else |
frank26080115 | 0:84d7747641aa | 1267 | { |
frank26080115 | 0:84d7747641aa | 1268 | if((CANAF_gext_cnt==0)||(position >= CANAF_gext_cnt)) |
frank26080115 | 0:84d7747641aa | 1269 | { |
frank26080115 | 0:84d7747641aa | 1270 | return CAN_ENTRY_NOT_EXIT_ERROR; |
frank26080115 | 0:84d7747641aa | 1271 | } |
frank26080115 | 0:84d7747641aa | 1272 | else |
frank26080115 | 0:84d7747641aa | 1273 | { |
frank26080115 | 0:84d7747641aa | 1274 | cnt = total - (CANAF_gext_cnt<<1) + (position<<1); |
frank26080115 | 0:84d7747641aa | 1275 | bound = total + CANAF_FullCAN_cnt * 3; |
frank26080115 | 0:84d7747641aa | 1276 | while (cnt<bound) |
frank26080115 | 0:84d7747641aa | 1277 | { |
frank26080115 | 0:84d7747641aa | 1278 | //remove all remaining entry two place up |
frank26080115 | 0:84d7747641aa | 1279 | LPC_CANAF_RAM->mask[cnt] = LPC_CANAF_RAM->mask[cnt+2]; |
frank26080115 | 0:84d7747641aa | 1280 | LPC_CANAF_RAM->mask[cnt+1] = LPC_CANAF_RAM->mask[cnt+3]; |
frank26080115 | 0:84d7747641aa | 1281 | cnt+=2; |
frank26080115 | 0:84d7747641aa | 1282 | } |
frank26080115 | 0:84d7747641aa | 1283 | } |
frank26080115 | 0:84d7747641aa | 1284 | CANAF_gext_cnt--; |
frank26080115 | 0:84d7747641aa | 1285 | LPC_CANAF->ENDofTable -=0x08; |
frank26080115 | 0:84d7747641aa | 1286 | } |
frank26080115 | 0:84d7747641aa | 1287 | LPC_CANAF->AFMR = 0x04; |
frank26080115 | 0:84d7747641aa | 1288 | return CAN_OK; |
frank26080115 | 0:84d7747641aa | 1289 | } |
frank26080115 | 0:84d7747641aa | 1290 | |
frank26080115 | 0:84d7747641aa | 1291 | /********************************************************************//** |
frank26080115 | 0:84d7747641aa | 1292 | * @brief Send message data |
frank26080115 | 0:84d7747641aa | 1293 | * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: |
frank26080115 | 0:84d7747641aa | 1294 | * - LPC_CAN1: CAN1 peripheral |
frank26080115 | 0:84d7747641aa | 1295 | * - LPC_CAN2: CAN2 peripheral |
frank26080115 | 0:84d7747641aa | 1296 | * @param[in] CAN_Msg point to the CAN_MSG_Type Structure, it contains message |
frank26080115 | 0:84d7747641aa | 1297 | * information such as: ID, DLC, RTR, ID Format |
frank26080115 | 0:84d7747641aa | 1298 | * @return Status: |
frank26080115 | 0:84d7747641aa | 1299 | * - SUCCESS: send message successfully |
frank26080115 | 0:84d7747641aa | 1300 | * - ERROR: send message unsuccessfully |
frank26080115 | 0:84d7747641aa | 1301 | *********************************************************************/ |
frank26080115 | 0:84d7747641aa | 1302 | Status CAN_SendMsg (LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg) |
frank26080115 | 0:84d7747641aa | 1303 | { |
frank26080115 | 0:84d7747641aa | 1304 | uint32_t data; |
frank26080115 | 0:84d7747641aa | 1305 | CHECK_PARAM(PARAM_CANx(CANx)); |
frank26080115 | 0:84d7747641aa | 1306 | CHECK_PARAM(PARAM_ID_FORMAT(CAN_Msg->format)); |
frank26080115 | 0:84d7747641aa | 1307 | if(CAN_Msg->format==STD_ID_FORMAT) |
frank26080115 | 0:84d7747641aa | 1308 | { |
frank26080115 | 0:84d7747641aa | 1309 | CHECK_PARAM(PARAM_ID_11(CAN_Msg->id)); |
frank26080115 | 0:84d7747641aa | 1310 | } |
frank26080115 | 0:84d7747641aa | 1311 | else |
frank26080115 | 0:84d7747641aa | 1312 | { |
frank26080115 | 0:84d7747641aa | 1313 | CHECK_PARAM(PARAM_ID_29(CAN_Msg->id)); |
frank26080115 | 0:84d7747641aa | 1314 | } |
frank26080115 | 0:84d7747641aa | 1315 | CHECK_PARAM(PARAM_DLC(CAN_Msg->len)); |
frank26080115 | 0:84d7747641aa | 1316 | CHECK_PARAM(PARAM_FRAME_TYPE(CAN_Msg->type)); |
frank26080115 | 0:84d7747641aa | 1317 | |
frank26080115 | 0:84d7747641aa | 1318 | //Check status of Transmit Buffer 1 |
frank26080115 | 0:84d7747641aa | 1319 | if (CANx->SR & (1<<2)) |
frank26080115 | 0:84d7747641aa | 1320 | { |
frank26080115 | 0:84d7747641aa | 1321 | /* Transmit Channel 1 is available */ |
frank26080115 | 0:84d7747641aa | 1322 | /* Write frame informations and frame data into its CANxTFI1, |
frank26080115 | 0:84d7747641aa | 1323 | * CANxTID1, CANxTDA1, CANxTDB1 register */ |
frank26080115 | 0:84d7747641aa | 1324 | CANx->TFI1 &= ~0x000F0000; |
frank26080115 | 0:84d7747641aa | 1325 | CANx->TFI1 |= (CAN_Msg->len)<<16; |
frank26080115 | 0:84d7747641aa | 1326 | if(CAN_Msg->type == REMOTE_FRAME) |
frank26080115 | 0:84d7747641aa | 1327 | { |
frank26080115 | 0:84d7747641aa | 1328 | CANx->TFI1 |= (1<<30); //set bit RTR |
frank26080115 | 0:84d7747641aa | 1329 | } |
frank26080115 | 0:84d7747641aa | 1330 | else |
frank26080115 | 0:84d7747641aa | 1331 | { |
frank26080115 | 0:84d7747641aa | 1332 | CANx->TFI1 &= ~(1<<30); |
frank26080115 | 0:84d7747641aa | 1333 | } |
frank26080115 | 0:84d7747641aa | 1334 | if(CAN_Msg->format == EXT_ID_FORMAT) |
frank26080115 | 0:84d7747641aa | 1335 | { |
frank26080115 | 0:84d7747641aa | 1336 | CANx->TFI1 |= (1UL<<31); //set bit FF |
frank26080115 | 0:84d7747641aa | 1337 | } |
frank26080115 | 0:84d7747641aa | 1338 | else |
frank26080115 | 0:84d7747641aa | 1339 | { |
frank26080115 | 0:84d7747641aa | 1340 | CANx->TFI1 &= ~(1UL<<31); |
frank26080115 | 0:84d7747641aa | 1341 | } |
frank26080115 | 0:84d7747641aa | 1342 | |
frank26080115 | 0:84d7747641aa | 1343 | /* Write CAN ID*/ |
frank26080115 | 0:84d7747641aa | 1344 | CANx->TID1 = CAN_Msg->id; |
frank26080115 | 0:84d7747641aa | 1345 | |
frank26080115 | 0:84d7747641aa | 1346 | /*Write first 4 data bytes*/ |
frank26080115 | 0:84d7747641aa | 1347 | data = (CAN_Msg->dataA[0])|(((CAN_Msg->dataA[1]))<<8)|((CAN_Msg->dataA[2])<<16)|((CAN_Msg->dataA[3])<<24); |
frank26080115 | 0:84d7747641aa | 1348 | CANx->TDA1 = data; |
frank26080115 | 0:84d7747641aa | 1349 | |
frank26080115 | 0:84d7747641aa | 1350 | /*Write second 4 data bytes*/ |
frank26080115 | 0:84d7747641aa | 1351 | data = (CAN_Msg->dataB[0])|(((CAN_Msg->dataB[1]))<<8)|((CAN_Msg->dataB[2])<<16)|((CAN_Msg->dataB[3])<<24); |
frank26080115 | 0:84d7747641aa | 1352 | CANx->TDB1 = data; |
frank26080115 | 0:84d7747641aa | 1353 | |
frank26080115 | 0:84d7747641aa | 1354 | /*Write transmission request*/ |
frank26080115 | 0:84d7747641aa | 1355 | CANx->CMR = 0x21; |
frank26080115 | 0:84d7747641aa | 1356 | return SUCCESS; |
frank26080115 | 0:84d7747641aa | 1357 | } |
frank26080115 | 0:84d7747641aa | 1358 | //check status of Transmit Buffer 2 |
frank26080115 | 0:84d7747641aa | 1359 | else if(CANx->SR & (1<<10)) |
frank26080115 | 0:84d7747641aa | 1360 | { |
frank26080115 | 0:84d7747641aa | 1361 | /* Transmit Channel 2 is available */ |
frank26080115 | 0:84d7747641aa | 1362 | /* Write frame informations and frame data into its CANxTFI2, |
frank26080115 | 0:84d7747641aa | 1363 | * CANxTID2, CANxTDA2, CANxTDB2 register */ |
frank26080115 | 0:84d7747641aa | 1364 | CANx->TFI2 &= ~0x000F0000; |
frank26080115 | 0:84d7747641aa | 1365 | CANx->TFI2 |= (CAN_Msg->len)<<16; |
frank26080115 | 0:84d7747641aa | 1366 | if(CAN_Msg->type == REMOTE_FRAME) |
frank26080115 | 0:84d7747641aa | 1367 | { |
frank26080115 | 0:84d7747641aa | 1368 | CANx->TFI2 |= (1<<30); //set bit RTR |
frank26080115 | 0:84d7747641aa | 1369 | } |
frank26080115 | 0:84d7747641aa | 1370 | else |
frank26080115 | 0:84d7747641aa | 1371 | { |
frank26080115 | 0:84d7747641aa | 1372 | CANx->TFI2 &= ~(1<<30); |
frank26080115 | 0:84d7747641aa | 1373 | } |
frank26080115 | 0:84d7747641aa | 1374 | if(CAN_Msg->format == EXT_ID_FORMAT) |
frank26080115 | 0:84d7747641aa | 1375 | { |
frank26080115 | 0:84d7747641aa | 1376 | CANx->TFI2 |= (1UL<<31); //set bit FF |
frank26080115 | 0:84d7747641aa | 1377 | } |
frank26080115 | 0:84d7747641aa | 1378 | else |
frank26080115 | 0:84d7747641aa | 1379 | { |
frank26080115 | 0:84d7747641aa | 1380 | CANx->TFI2 &= ~(1UL<<31); |
frank26080115 | 0:84d7747641aa | 1381 | } |
frank26080115 | 0:84d7747641aa | 1382 | |
frank26080115 | 0:84d7747641aa | 1383 | /* Write CAN ID*/ |
frank26080115 | 0:84d7747641aa | 1384 | CANx->TID2 = CAN_Msg->id; |
frank26080115 | 0:84d7747641aa | 1385 | |
frank26080115 | 0:84d7747641aa | 1386 | /*Write first 4 data bytes*/ |
frank26080115 | 0:84d7747641aa | 1387 | data = (CAN_Msg->dataA[0])|(((CAN_Msg->dataA[1]))<<8)|((CAN_Msg->dataA[2])<<16)|((CAN_Msg->dataA[3])<<24); |
frank26080115 | 0:84d7747641aa | 1388 | CANx->TDA2 = data; |
frank26080115 | 0:84d7747641aa | 1389 | |
frank26080115 | 0:84d7747641aa | 1390 | /*Write second 4 data bytes*/ |
frank26080115 | 0:84d7747641aa | 1391 | data = (CAN_Msg->dataB[0])|(((CAN_Msg->dataB[1]))<<8)|((CAN_Msg->dataB[2])<<16)|((CAN_Msg->dataB[3])<<24); |
frank26080115 | 0:84d7747641aa | 1392 | CANx->TDB2 = data; |
frank26080115 | 0:84d7747641aa | 1393 | |
frank26080115 | 0:84d7747641aa | 1394 | /*Write transmission request*/ |
frank26080115 | 0:84d7747641aa | 1395 | CANx->CMR = 0x41; |
frank26080115 | 0:84d7747641aa | 1396 | return SUCCESS; |
frank26080115 | 0:84d7747641aa | 1397 | } |
frank26080115 | 0:84d7747641aa | 1398 | //check status of Transmit Buffer 3 |
frank26080115 | 0:84d7747641aa | 1399 | else if (CANx->SR & (1<<18)) |
frank26080115 | 0:84d7747641aa | 1400 | { |
frank26080115 | 0:84d7747641aa | 1401 | /* Transmit Channel 3 is available */ |
frank26080115 | 0:84d7747641aa | 1402 | /* Write frame informations and frame data into its CANxTFI3, |
frank26080115 | 0:84d7747641aa | 1403 | * CANxTID3, CANxTDA3, CANxTDB3 register */ |
frank26080115 | 0:84d7747641aa | 1404 | CANx->TFI3 &= ~0x000F0000; |
frank26080115 | 0:84d7747641aa | 1405 | CANx->TFI3 |= (CAN_Msg->len)<<16; |
frank26080115 | 0:84d7747641aa | 1406 | if(CAN_Msg->type == REMOTE_FRAME) |
frank26080115 | 0:84d7747641aa | 1407 | { |
frank26080115 | 0:84d7747641aa | 1408 | CANx->TFI3 |= (1<<30); //set bit RTR |
frank26080115 | 0:84d7747641aa | 1409 | } |
frank26080115 | 0:84d7747641aa | 1410 | else |
frank26080115 | 0:84d7747641aa | 1411 | { |
frank26080115 | 0:84d7747641aa | 1412 | CANx->TFI3 &= ~(1<<30); |
frank26080115 | 0:84d7747641aa | 1413 | } |
frank26080115 | 0:84d7747641aa | 1414 | if(CAN_Msg->format == EXT_ID_FORMAT) |
frank26080115 | 0:84d7747641aa | 1415 | { |
frank26080115 | 0:84d7747641aa | 1416 | CANx->TFI3 |= (1UL<<31); //set bit FF |
frank26080115 | 0:84d7747641aa | 1417 | } |
frank26080115 | 0:84d7747641aa | 1418 | else |
frank26080115 | 0:84d7747641aa | 1419 | { |
frank26080115 | 0:84d7747641aa | 1420 | CANx->TFI3 &= ~(1UL<<31); |
frank26080115 | 0:84d7747641aa | 1421 | } |
frank26080115 | 0:84d7747641aa | 1422 | |
frank26080115 | 0:84d7747641aa | 1423 | /* Write CAN ID*/ |
frank26080115 | 0:84d7747641aa | 1424 | CANx->TID3 = CAN_Msg->id; |
frank26080115 | 0:84d7747641aa | 1425 | |
frank26080115 | 0:84d7747641aa | 1426 | /*Write first 4 data bytes*/ |
frank26080115 | 0:84d7747641aa | 1427 | data = (CAN_Msg->dataA[0])|(((CAN_Msg->dataA[1]))<<8)|((CAN_Msg->dataA[2])<<16)|((CAN_Msg->dataA[3])<<24); |
frank26080115 | 0:84d7747641aa | 1428 | CANx->TDA3 = data; |
frank26080115 | 0:84d7747641aa | 1429 | |
frank26080115 | 0:84d7747641aa | 1430 | /*Write second 4 data bytes*/ |
frank26080115 | 0:84d7747641aa | 1431 | data = (CAN_Msg->dataB[0])|(((CAN_Msg->dataB[1]))<<8)|((CAN_Msg->dataB[2])<<16)|((CAN_Msg->dataB[3])<<24); |
frank26080115 | 0:84d7747641aa | 1432 | CANx->TDB3 = data; |
frank26080115 | 0:84d7747641aa | 1433 | |
frank26080115 | 0:84d7747641aa | 1434 | /*Write transmission request*/ |
frank26080115 | 0:84d7747641aa | 1435 | CANx->CMR = 0x81; |
frank26080115 | 0:84d7747641aa | 1436 | return SUCCESS; |
frank26080115 | 0:84d7747641aa | 1437 | } |
frank26080115 | 0:84d7747641aa | 1438 | else |
frank26080115 | 0:84d7747641aa | 1439 | { |
frank26080115 | 0:84d7747641aa | 1440 | return ERROR; |
frank26080115 | 0:84d7747641aa | 1441 | } |
frank26080115 | 0:84d7747641aa | 1442 | } |
frank26080115 | 0:84d7747641aa | 1443 | |
frank26080115 | 0:84d7747641aa | 1444 | /********************************************************************//** |
frank26080115 | 0:84d7747641aa | 1445 | * @brief Receive message data |
frank26080115 | 0:84d7747641aa | 1446 | * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: |
frank26080115 | 0:84d7747641aa | 1447 | * - LPC_CAN1: CAN1 peripheral |
frank26080115 | 0:84d7747641aa | 1448 | * - LPC_CAN2: CAN2 peripheral |
frank26080115 | 0:84d7747641aa | 1449 | * @param[in] CAN_Msg point to the CAN_MSG_Type Struct, it will contain received |
frank26080115 | 0:84d7747641aa | 1450 | * message information such as: ID, DLC, RTR, ID Format |
frank26080115 | 0:84d7747641aa | 1451 | * @return Status: |
frank26080115 | 0:84d7747641aa | 1452 | * - SUCCESS: receive message successfully |
frank26080115 | 0:84d7747641aa | 1453 | * - ERROR: receive message unsuccessfully |
frank26080115 | 0:84d7747641aa | 1454 | *********************************************************************/ |
frank26080115 | 0:84d7747641aa | 1455 | Status CAN_ReceiveMsg (LPC_CAN_TypeDef *CANx, CAN_MSG_Type *CAN_Msg) |
frank26080115 | 0:84d7747641aa | 1456 | { |
frank26080115 | 0:84d7747641aa | 1457 | uint32_t data; |
frank26080115 | 0:84d7747641aa | 1458 | |
frank26080115 | 0:84d7747641aa | 1459 | CHECK_PARAM(PARAM_CANx(CANx)); |
frank26080115 | 0:84d7747641aa | 1460 | |
frank26080115 | 0:84d7747641aa | 1461 | //check status of Receive Buffer |
frank26080115 | 0:84d7747641aa | 1462 | if((CANx->SR &0x00000001)) |
frank26080115 | 0:84d7747641aa | 1463 | { |
frank26080115 | 0:84d7747641aa | 1464 | /* Receive message is available */ |
frank26080115 | 0:84d7747641aa | 1465 | /* Read frame informations */ |
frank26080115 | 0:84d7747641aa | 1466 | CAN_Msg->format = (uint8_t)(((CANx->RFS) & 0x80000000)>>31); |
frank26080115 | 0:84d7747641aa | 1467 | CAN_Msg->type = (uint8_t)(((CANx->RFS) & 0x40000000)>>30); |
frank26080115 | 0:84d7747641aa | 1468 | CAN_Msg->len = (uint8_t)(((CANx->RFS) & 0x000F0000)>>16); |
frank26080115 | 0:84d7747641aa | 1469 | |
frank26080115 | 0:84d7747641aa | 1470 | |
frank26080115 | 0:84d7747641aa | 1471 | /* Read CAN message identifier */ |
frank26080115 | 0:84d7747641aa | 1472 | CAN_Msg->id = CANx->RID; |
frank26080115 | 0:84d7747641aa | 1473 | |
frank26080115 | 0:84d7747641aa | 1474 | /* Read the data if received message was DATA FRAME */ |
frank26080115 | 0:84d7747641aa | 1475 | if (CAN_Msg->type == DATA_FRAME) |
frank26080115 | 0:84d7747641aa | 1476 | { |
frank26080115 | 0:84d7747641aa | 1477 | /* Read first 4 data bytes */ |
frank26080115 | 0:84d7747641aa | 1478 | data = CANx->RDA; |
frank26080115 | 0:84d7747641aa | 1479 | *((uint8_t *) &CAN_Msg->dataA[0])= data & 0x000000FF; |
frank26080115 | 0:84d7747641aa | 1480 | *((uint8_t *) &CAN_Msg->dataA[1])= (data & 0x0000FF00)>>8;; |
frank26080115 | 0:84d7747641aa | 1481 | *((uint8_t *) &CAN_Msg->dataA[2])= (data & 0x00FF0000)>>16; |
frank26080115 | 0:84d7747641aa | 1482 | *((uint8_t *) &CAN_Msg->dataA[3])= (data & 0xFF000000)>>24; |
frank26080115 | 0:84d7747641aa | 1483 | |
frank26080115 | 0:84d7747641aa | 1484 | /* Read second 4 data bytes */ |
frank26080115 | 0:84d7747641aa | 1485 | data = CANx->RDB; |
frank26080115 | 0:84d7747641aa | 1486 | *((uint8_t *) &CAN_Msg->dataB[0])= data & 0x000000FF; |
frank26080115 | 0:84d7747641aa | 1487 | *((uint8_t *) &CAN_Msg->dataB[1])= (data & 0x0000FF00)>>8; |
frank26080115 | 0:84d7747641aa | 1488 | *((uint8_t *) &CAN_Msg->dataB[2])= (data & 0x00FF0000)>>16; |
frank26080115 | 0:84d7747641aa | 1489 | *((uint8_t *) &CAN_Msg->dataB[3])= (data & 0xFF000000)>>24; |
frank26080115 | 0:84d7747641aa | 1490 | |
frank26080115 | 0:84d7747641aa | 1491 | /*release receive buffer*/ |
frank26080115 | 0:84d7747641aa | 1492 | CANx->CMR = 0x04; |
frank26080115 | 0:84d7747641aa | 1493 | } |
frank26080115 | 0:84d7747641aa | 1494 | else |
frank26080115 | 0:84d7747641aa | 1495 | { |
frank26080115 | 0:84d7747641aa | 1496 | /* Received Frame is a Remote Frame, not have data, we just receive |
frank26080115 | 0:84d7747641aa | 1497 | * message information only */ |
frank26080115 | 0:84d7747641aa | 1498 | CANx->CMR = 0x04; /*release receive buffer*/ |
frank26080115 | 0:84d7747641aa | 1499 | return SUCCESS; |
frank26080115 | 0:84d7747641aa | 1500 | } |
frank26080115 | 0:84d7747641aa | 1501 | } |
frank26080115 | 0:84d7747641aa | 1502 | else |
frank26080115 | 0:84d7747641aa | 1503 | { |
frank26080115 | 0:84d7747641aa | 1504 | // no receive message available |
frank26080115 | 0:84d7747641aa | 1505 | return ERROR; |
frank26080115 | 0:84d7747641aa | 1506 | } |
frank26080115 | 0:84d7747641aa | 1507 | return SUCCESS; |
frank26080115 | 0:84d7747641aa | 1508 | } |
frank26080115 | 0:84d7747641aa | 1509 | |
frank26080115 | 0:84d7747641aa | 1510 | /********************************************************************//** |
frank26080115 | 0:84d7747641aa | 1511 | * @brief Receive FullCAN Object |
frank26080115 | 0:84d7747641aa | 1512 | * @param[in] CANAFx: CAN Acceptance Filter register, should be: LPC_CANAF |
frank26080115 | 0:84d7747641aa | 1513 | * @param[in] CAN_Msg point to the CAN_MSG_Type Struct, it will contain received |
frank26080115 | 0:84d7747641aa | 1514 | * message information such as: ID, DLC, RTR, ID Format |
frank26080115 | 0:84d7747641aa | 1515 | * @return CAN_ERROR, could be: |
frank26080115 | 0:84d7747641aa | 1516 | * - CAN_FULL_OBJ_NOT_RCV: FullCAN Object is not be received |
frank26080115 | 0:84d7747641aa | 1517 | * - CAN_OK: Received FullCAN Object successful |
frank26080115 | 0:84d7747641aa | 1518 | * |
frank26080115 | 0:84d7747641aa | 1519 | *********************************************************************/ |
frank26080115 | 0:84d7747641aa | 1520 | CAN_ERROR FCAN_ReadObj (LPC_CANAF_TypeDef* CANAFx, CAN_MSG_Type *CAN_Msg) |
frank26080115 | 0:84d7747641aa | 1521 | { |
frank26080115 | 0:84d7747641aa | 1522 | uint32_t *pSrc, data; |
frank26080115 | 0:84d7747641aa | 1523 | uint32_t interrut_word, msg_idx, test_bit, head_idx, tail_idx; |
frank26080115 | 0:84d7747641aa | 1524 | |
frank26080115 | 0:84d7747641aa | 1525 | CHECK_PARAM(PARAM_CANAFx(CANAFx)); |
frank26080115 | 0:84d7747641aa | 1526 | |
frank26080115 | 0:84d7747641aa | 1527 | interrut_word = 0; |
frank26080115 | 0:84d7747641aa | 1528 | |
frank26080115 | 0:84d7747641aa | 1529 | if (LPC_CANAF->FCANIC0 != 0) |
frank26080115 | 0:84d7747641aa | 1530 | { |
frank26080115 | 0:84d7747641aa | 1531 | interrut_word = LPC_CANAF->FCANIC0; |
frank26080115 | 0:84d7747641aa | 1532 | head_idx = 0; |
frank26080115 | 0:84d7747641aa | 1533 | tail_idx = 31; |
frank26080115 | 0:84d7747641aa | 1534 | } |
frank26080115 | 0:84d7747641aa | 1535 | else if (LPC_CANAF->FCANIC1 != 0) |
frank26080115 | 0:84d7747641aa | 1536 | { |
frank26080115 | 0:84d7747641aa | 1537 | interrut_word = LPC_CANAF->FCANIC1; |
frank26080115 | 0:84d7747641aa | 1538 | head_idx = 32; |
frank26080115 | 0:84d7747641aa | 1539 | tail_idx = 63; |
frank26080115 | 0:84d7747641aa | 1540 | } |
frank26080115 | 0:84d7747641aa | 1541 | |
frank26080115 | 0:84d7747641aa | 1542 | if (interrut_word != 0) |
frank26080115 | 0:84d7747641aa | 1543 | { |
frank26080115 | 0:84d7747641aa | 1544 | /* Detect for interrupt pending */ |
frank26080115 | 0:84d7747641aa | 1545 | msg_idx = 0; |
frank26080115 | 0:84d7747641aa | 1546 | for (msg_idx = head_idx; msg_idx <= tail_idx; msg_idx++) |
frank26080115 | 0:84d7747641aa | 1547 | { |
frank26080115 | 0:84d7747641aa | 1548 | test_bit = interrut_word & 0x1; |
frank26080115 | 0:84d7747641aa | 1549 | interrut_word = interrut_word >> 1; |
frank26080115 | 0:84d7747641aa | 1550 | |
frank26080115 | 0:84d7747641aa | 1551 | if (test_bit) |
frank26080115 | 0:84d7747641aa | 1552 | { |
frank26080115 | 0:84d7747641aa | 1553 | pSrc = (uint32_t *) (LPC_CANAF->ENDofTable + LPC_CANAF_RAM_BASE + msg_idx * 12); |
frank26080115 | 0:84d7747641aa | 1554 | |
frank26080115 | 0:84d7747641aa | 1555 | /* Has been finished updating the content */ |
frank26080115 | 0:84d7747641aa | 1556 | if ((*pSrc & 0x03000000L) == 0x03000000L) |
frank26080115 | 0:84d7747641aa | 1557 | { |
frank26080115 | 0:84d7747641aa | 1558 | /*clear semaphore*/ |
frank26080115 | 0:84d7747641aa | 1559 | *pSrc &= 0xFCFFFFFF; |
frank26080115 | 0:84d7747641aa | 1560 | |
frank26080115 | 0:84d7747641aa | 1561 | /*Set to DatA*/ |
frank26080115 | 0:84d7747641aa | 1562 | pSrc++; |
frank26080115 | 0:84d7747641aa | 1563 | /* Copy to dest buf */ |
frank26080115 | 0:84d7747641aa | 1564 | data = *pSrc; |
frank26080115 | 0:84d7747641aa | 1565 | *((uint8_t *) &CAN_Msg->dataA[0])= data & 0x000000FF; |
frank26080115 | 0:84d7747641aa | 1566 | *((uint8_t *) &CAN_Msg->dataA[1])= (data & 0x0000FF00)>>8; |
frank26080115 | 0:84d7747641aa | 1567 | *((uint8_t *) &CAN_Msg->dataA[2])= (data & 0x00FF0000)>>16; |
frank26080115 | 0:84d7747641aa | 1568 | *((uint8_t *) &CAN_Msg->dataA[3])= (data & 0xFF000000)>>24; |
frank26080115 | 0:84d7747641aa | 1569 | |
frank26080115 | 0:84d7747641aa | 1570 | /*Set to DatB*/ |
frank26080115 | 0:84d7747641aa | 1571 | pSrc++; |
frank26080115 | 0:84d7747641aa | 1572 | /* Copy to dest buf */ |
frank26080115 | 0:84d7747641aa | 1573 | data = *pSrc; |
frank26080115 | 0:84d7747641aa | 1574 | *((uint8_t *) &CAN_Msg->dataB[0])= data & 0x000000FF; |
frank26080115 | 0:84d7747641aa | 1575 | *((uint8_t *) &CAN_Msg->dataB[1])= (data & 0x0000FF00)>>8; |
frank26080115 | 0:84d7747641aa | 1576 | *((uint8_t *) &CAN_Msg->dataB[2])= (data & 0x00FF0000)>>16; |
frank26080115 | 0:84d7747641aa | 1577 | *((uint8_t *) &CAN_Msg->dataB[3])= (data & 0xFF000000)>>24; |
frank26080115 | 0:84d7747641aa | 1578 | /*Back to Dat1*/ |
frank26080115 | 0:84d7747641aa | 1579 | pSrc -= 2; |
frank26080115 | 0:84d7747641aa | 1580 | |
frank26080115 | 0:84d7747641aa | 1581 | CAN_Msg->id = *pSrc & 0x7FF; |
frank26080115 | 0:84d7747641aa | 1582 | CAN_Msg->len = (uint8_t) (*pSrc >> 16) & 0x0F; |
frank26080115 | 0:84d7747641aa | 1583 | CAN_Msg->format = 0; //FullCAN Object ID always is 11-bit value |
frank26080115 | 0:84d7747641aa | 1584 | CAN_Msg->type = (uint8_t)(*pSrc >> 30) &0x01; |
frank26080115 | 0:84d7747641aa | 1585 | /*Re-read semaphore*/ |
frank26080115 | 0:84d7747641aa | 1586 | if ((*pSrc & 0x03000000L) == 0) |
frank26080115 | 0:84d7747641aa | 1587 | { |
frank26080115 | 0:84d7747641aa | 1588 | return CAN_OK; |
frank26080115 | 0:84d7747641aa | 1589 | } |
frank26080115 | 0:84d7747641aa | 1590 | } |
frank26080115 | 0:84d7747641aa | 1591 | } |
frank26080115 | 0:84d7747641aa | 1592 | } |
frank26080115 | 0:84d7747641aa | 1593 | } |
frank26080115 | 0:84d7747641aa | 1594 | return CAN_FULL_OBJ_NOT_RCV; |
frank26080115 | 0:84d7747641aa | 1595 | } |
frank26080115 | 0:84d7747641aa | 1596 | /********************************************************************//** |
frank26080115 | 0:84d7747641aa | 1597 | * @brief Get CAN Control Status |
frank26080115 | 0:84d7747641aa | 1598 | * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: |
frank26080115 | 0:84d7747641aa | 1599 | * - LPC_CAN1: CAN1 peripheral |
frank26080115 | 0:84d7747641aa | 1600 | * - LPC_CAN2: CAN2 peripheral |
frank26080115 | 0:84d7747641aa | 1601 | * @param[in] arg: type of CAN status to get from CAN status register |
frank26080115 | 0:84d7747641aa | 1602 | * Should be: |
frank26080115 | 0:84d7747641aa | 1603 | * - CANCTRL_GLOBAL_STS: CAN Global Status |
frank26080115 | 0:84d7747641aa | 1604 | * - CANCTRL_INT_CAP: CAN Interrupt and Capture |
frank26080115 | 0:84d7747641aa | 1605 | * - CANCTRL_ERR_WRN: CAN Error Warning Limit |
frank26080115 | 0:84d7747641aa | 1606 | * - CANCTRL_STS: CAN Control Status |
frank26080115 | 0:84d7747641aa | 1607 | * @return Current Control Status that you want to get value |
frank26080115 | 0:84d7747641aa | 1608 | *********************************************************************/ |
frank26080115 | 0:84d7747641aa | 1609 | uint32_t CAN_GetCTRLStatus (LPC_CAN_TypeDef* CANx, CAN_CTRL_STS_Type arg) |
frank26080115 | 0:84d7747641aa | 1610 | { |
frank26080115 | 0:84d7747641aa | 1611 | CHECK_PARAM(PARAM_CANx(CANx)); |
frank26080115 | 0:84d7747641aa | 1612 | CHECK_PARAM(PARAM_CTRL_STS_TYPE(arg)); |
frank26080115 | 0:84d7747641aa | 1613 | |
frank26080115 | 0:84d7747641aa | 1614 | switch (arg) |
frank26080115 | 0:84d7747641aa | 1615 | { |
frank26080115 | 0:84d7747641aa | 1616 | case CANCTRL_GLOBAL_STS: |
frank26080115 | 0:84d7747641aa | 1617 | return CANx->GSR; |
frank26080115 | 0:84d7747641aa | 1618 | |
frank26080115 | 0:84d7747641aa | 1619 | case CANCTRL_INT_CAP: |
frank26080115 | 0:84d7747641aa | 1620 | return CANx->ICR; |
frank26080115 | 0:84d7747641aa | 1621 | |
frank26080115 | 0:84d7747641aa | 1622 | case CANCTRL_ERR_WRN: |
frank26080115 | 0:84d7747641aa | 1623 | return CANx->EWL; |
frank26080115 | 0:84d7747641aa | 1624 | |
frank26080115 | 0:84d7747641aa | 1625 | default: // CANCTRL_STS |
frank26080115 | 0:84d7747641aa | 1626 | return CANx->SR; |
frank26080115 | 0:84d7747641aa | 1627 | } |
frank26080115 | 0:84d7747641aa | 1628 | } |
frank26080115 | 0:84d7747641aa | 1629 | /********************************************************************//** |
frank26080115 | 0:84d7747641aa | 1630 | * @brief Get CAN Central Status |
frank26080115 | 0:84d7747641aa | 1631 | * @param[in] CANCRx point to LPC_CANCR_TypeDef, should be: LPC_CANCR |
frank26080115 | 0:84d7747641aa | 1632 | * @param[in] arg: type of CAN status to get from CAN Central status register |
frank26080115 | 0:84d7747641aa | 1633 | * Should be: |
frank26080115 | 0:84d7747641aa | 1634 | * - CANCR_TX_STS: Central CAN Tx Status |
frank26080115 | 0:84d7747641aa | 1635 | * - CANCR_RX_STS: Central CAN Rx Status |
frank26080115 | 0:84d7747641aa | 1636 | * - CANCR_MS: Central CAN Miscellaneous Status |
frank26080115 | 0:84d7747641aa | 1637 | * @return Current Central Status that you want to get value |
frank26080115 | 0:84d7747641aa | 1638 | *********************************************************************/ |
frank26080115 | 0:84d7747641aa | 1639 | uint32_t CAN_GetCRStatus (LPC_CANCR_TypeDef* CANCRx, CAN_CR_STS_Type arg) |
frank26080115 | 0:84d7747641aa | 1640 | { |
frank26080115 | 0:84d7747641aa | 1641 | CHECK_PARAM(PARAM_CANCRx(CANCRx)); |
frank26080115 | 0:84d7747641aa | 1642 | CHECK_PARAM(PARAM_CR_STS_TYPE(arg)); |
frank26080115 | 0:84d7747641aa | 1643 | |
frank26080115 | 0:84d7747641aa | 1644 | switch (arg) |
frank26080115 | 0:84d7747641aa | 1645 | { |
frank26080115 | 0:84d7747641aa | 1646 | case CANCR_TX_STS: |
frank26080115 | 0:84d7747641aa | 1647 | return CANCRx->CANTxSR; |
frank26080115 | 0:84d7747641aa | 1648 | |
frank26080115 | 0:84d7747641aa | 1649 | case CANCR_RX_STS: |
frank26080115 | 0:84d7747641aa | 1650 | return CANCRx->CANRxSR; |
frank26080115 | 0:84d7747641aa | 1651 | |
frank26080115 | 0:84d7747641aa | 1652 | default: // CANCR_MS |
frank26080115 | 0:84d7747641aa | 1653 | return CANCRx->CANMSR; |
frank26080115 | 0:84d7747641aa | 1654 | } |
frank26080115 | 0:84d7747641aa | 1655 | } |
frank26080115 | 0:84d7747641aa | 1656 | /********************************************************************//** |
frank26080115 | 0:84d7747641aa | 1657 | * @brief Enable/Disable CAN Interrupt |
frank26080115 | 0:84d7747641aa | 1658 | * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: |
frank26080115 | 0:84d7747641aa | 1659 | * - LPC_CAN1: CAN1 peripheral |
frank26080115 | 0:84d7747641aa | 1660 | * - LPC_CAN2: CAN2 peripheral |
frank26080115 | 0:84d7747641aa | 1661 | * @param[in] arg: type of CAN interrupt that you want to enable/disable |
frank26080115 | 0:84d7747641aa | 1662 | * Should be: |
frank26080115 | 0:84d7747641aa | 1663 | * - CANINT_RIE: CAN Receiver Interrupt Enable |
frank26080115 | 0:84d7747641aa | 1664 | * - CANINT_TIE1: CAN Transmit Interrupt Enable |
frank26080115 | 0:84d7747641aa | 1665 | * - CANINT_EIE: CAN Error Warning Interrupt Enable |
frank26080115 | 0:84d7747641aa | 1666 | * - CANINT_DOIE: CAN Data Overrun Interrupt Enable |
frank26080115 | 0:84d7747641aa | 1667 | * - CANINT_WUIE: CAN Wake-Up Interrupt Enable |
frank26080115 | 0:84d7747641aa | 1668 | * - CANINT_EPIE: CAN Error Passive Interrupt Enable |
frank26080115 | 0:84d7747641aa | 1669 | * - CANINT_ALIE: CAN Arbitration Lost Interrupt Enable |
frank26080115 | 0:84d7747641aa | 1670 | * - CANINT_BEIE: CAN Bus Error Interrupt Enable |
frank26080115 | 0:84d7747641aa | 1671 | * - CANINT_IDIE: CAN ID Ready Interrupt Enable |
frank26080115 | 0:84d7747641aa | 1672 | * - CANINT_TIE2: CAN Transmit Interrupt Enable for Buffer2 |
frank26080115 | 0:84d7747641aa | 1673 | * - CANINT_TIE3: CAN Transmit Interrupt Enable for Buffer3 |
frank26080115 | 0:84d7747641aa | 1674 | * - CANINT_FCE: FullCAN Interrupt Enable |
frank26080115 | 0:84d7747641aa | 1675 | * @param[in] NewState: New state of this function, should be: |
frank26080115 | 0:84d7747641aa | 1676 | * - ENABLE |
frank26080115 | 0:84d7747641aa | 1677 | * - DISABLE |
frank26080115 | 0:84d7747641aa | 1678 | * @return none |
frank26080115 | 0:84d7747641aa | 1679 | *********************************************************************/ |
frank26080115 | 0:84d7747641aa | 1680 | void CAN_IRQCmd (LPC_CAN_TypeDef* CANx, CAN_INT_EN_Type arg, FunctionalState NewState) |
frank26080115 | 0:84d7747641aa | 1681 | { |
frank26080115 | 0:84d7747641aa | 1682 | CHECK_PARAM(PARAM_CANx(CANx)); |
frank26080115 | 0:84d7747641aa | 1683 | CHECK_PARAM(PARAM_INT_EN_TYPE(arg)); |
frank26080115 | 0:84d7747641aa | 1684 | CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); |
frank26080115 | 0:84d7747641aa | 1685 | |
frank26080115 | 0:84d7747641aa | 1686 | if(NewState == ENABLE) |
frank26080115 | 0:84d7747641aa | 1687 | { |
frank26080115 | 0:84d7747641aa | 1688 | if(arg==CANINT_FCE) |
frank26080115 | 0:84d7747641aa | 1689 | { |
frank26080115 | 0:84d7747641aa | 1690 | LPC_CANAF->AFMR = 0x01; |
frank26080115 | 0:84d7747641aa | 1691 | LPC_CANAF->FCANIE = 0x01; |
frank26080115 | 0:84d7747641aa | 1692 | LPC_CANAF->AFMR = 0x04; |
frank26080115 | 0:84d7747641aa | 1693 | } |
frank26080115 | 0:84d7747641aa | 1694 | else |
frank26080115 | 0:84d7747641aa | 1695 | CANx->IER |= (1 << arg); |
frank26080115 | 0:84d7747641aa | 1696 | } |
frank26080115 | 0:84d7747641aa | 1697 | else |
frank26080115 | 0:84d7747641aa | 1698 | { |
frank26080115 | 0:84d7747641aa | 1699 | if(arg==CANINT_FCE){ |
frank26080115 | 0:84d7747641aa | 1700 | LPC_CANAF->AFMR = 0x01; |
frank26080115 | 0:84d7747641aa | 1701 | LPC_CANAF->FCANIE = 0x01; |
frank26080115 | 0:84d7747641aa | 1702 | LPC_CANAF->AFMR = 0x00; |
frank26080115 | 0:84d7747641aa | 1703 | } |
frank26080115 | 0:84d7747641aa | 1704 | else |
frank26080115 | 0:84d7747641aa | 1705 | CANx->IER &= ~(1 << arg); |
frank26080115 | 0:84d7747641aa | 1706 | } |
frank26080115 | 0:84d7747641aa | 1707 | } |
frank26080115 | 0:84d7747641aa | 1708 | |
frank26080115 | 0:84d7747641aa | 1709 | /********************************************************************//** |
frank26080115 | 0:84d7747641aa | 1710 | * @brief Setting Acceptance Filter mode |
frank26080115 | 0:84d7747641aa | 1711 | * @param[in] CANAFx point to LPC_CANAF_TypeDef object, should be: LPC_CANAF |
frank26080115 | 0:84d7747641aa | 1712 | * @param[in] AFMode: type of AF mode that you want to set, should be: |
frank26080115 | 0:84d7747641aa | 1713 | * - CAN_Normal: Normal mode |
frank26080115 | 0:84d7747641aa | 1714 | * - CAN_AccOff: Acceptance Filter Off Mode |
frank26080115 | 0:84d7747641aa | 1715 | * - CAN_AccBP: Acceptance Fileter Bypass Mode |
frank26080115 | 0:84d7747641aa | 1716 | * - CAN_eFCAN: FullCAN Mode Enhancement |
frank26080115 | 0:84d7747641aa | 1717 | * @return none |
frank26080115 | 0:84d7747641aa | 1718 | *********************************************************************/ |
frank26080115 | 0:84d7747641aa | 1719 | void CAN_SetAFMode (LPC_CANAF_TypeDef* CANAFx, CAN_AFMODE_Type AFMode) |
frank26080115 | 0:84d7747641aa | 1720 | { |
frank26080115 | 0:84d7747641aa | 1721 | CHECK_PARAM(PARAM_CANAFx(CANAFx)); |
frank26080115 | 0:84d7747641aa | 1722 | CHECK_PARAM(PARAM_AFMODE_TYPE(AFMode)); |
frank26080115 | 0:84d7747641aa | 1723 | |
frank26080115 | 0:84d7747641aa | 1724 | switch(AFMode) |
frank26080115 | 0:84d7747641aa | 1725 | { |
frank26080115 | 0:84d7747641aa | 1726 | case CAN_Normal: |
frank26080115 | 0:84d7747641aa | 1727 | CANAFx->AFMR = 0x00; |
frank26080115 | 0:84d7747641aa | 1728 | break; |
frank26080115 | 0:84d7747641aa | 1729 | case CAN_AccOff: |
frank26080115 | 0:84d7747641aa | 1730 | CANAFx->AFMR = 0x01; |
frank26080115 | 0:84d7747641aa | 1731 | break; |
frank26080115 | 0:84d7747641aa | 1732 | case CAN_AccBP: |
frank26080115 | 0:84d7747641aa | 1733 | CANAFx->AFMR = 0x02; |
frank26080115 | 0:84d7747641aa | 1734 | break; |
frank26080115 | 0:84d7747641aa | 1735 | case CAN_eFCAN: |
frank26080115 | 0:84d7747641aa | 1736 | CANAFx->AFMR = 0x04; |
frank26080115 | 0:84d7747641aa | 1737 | break; |
frank26080115 | 0:84d7747641aa | 1738 | } |
frank26080115 | 0:84d7747641aa | 1739 | } |
frank26080115 | 0:84d7747641aa | 1740 | |
frank26080115 | 0:84d7747641aa | 1741 | /********************************************************************//** |
frank26080115 | 0:84d7747641aa | 1742 | * @brief Enable/Disable CAN Mode |
frank26080115 | 0:84d7747641aa | 1743 | * @param[in] CANx pointer to LPC_CAN_TypeDef, should be: |
frank26080115 | 0:84d7747641aa | 1744 | * - LPC_CAN1: CAN1 peripheral |
frank26080115 | 0:84d7747641aa | 1745 | * - LPC_CAN2: CAN2 peripheral |
frank26080115 | 0:84d7747641aa | 1746 | * @param[in] mode: type of CAN mode that you want to enable/disable, should be: |
frank26080115 | 0:84d7747641aa | 1747 | * - CAN_OPERATING_MODE: Normal Operating Mode |
frank26080115 | 0:84d7747641aa | 1748 | * - CAN_RESET_MODE: Reset Mode |
frank26080115 | 0:84d7747641aa | 1749 | * - CAN_LISTENONLY_MODE: Listen Only Mode |
frank26080115 | 0:84d7747641aa | 1750 | * - CAN_SELFTEST_MODE: Self Test Mode |
frank26080115 | 0:84d7747641aa | 1751 | * - CAN_TXPRIORITY_MODE: Transmit Priority Mode |
frank26080115 | 0:84d7747641aa | 1752 | * - CAN_SLEEP_MODE: Sleep Mode |
frank26080115 | 0:84d7747641aa | 1753 | * - CAN_RXPOLARITY_MODE: Receive Polarity Mode |
frank26080115 | 0:84d7747641aa | 1754 | * - CAN_TEST_MODE: Test Mode |
frank26080115 | 0:84d7747641aa | 1755 | * @param[in] NewState: New State of this function, should be: |
frank26080115 | 0:84d7747641aa | 1756 | * - ENABLE |
frank26080115 | 0:84d7747641aa | 1757 | * - DISABLE |
frank26080115 | 0:84d7747641aa | 1758 | * @return none |
frank26080115 | 0:84d7747641aa | 1759 | *********************************************************************/ |
frank26080115 | 0:84d7747641aa | 1760 | void CAN_ModeConfig(LPC_CAN_TypeDef* CANx, CAN_MODE_Type mode, FunctionalState NewState) |
frank26080115 | 0:84d7747641aa | 1761 | { |
frank26080115 | 0:84d7747641aa | 1762 | CHECK_PARAM(PARAM_CANx(CANx)); |
frank26080115 | 0:84d7747641aa | 1763 | CHECK_PARAM(PARAM_MODE_TYPE(mode)); |
frank26080115 | 0:84d7747641aa | 1764 | CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState)); |
frank26080115 | 0:84d7747641aa | 1765 | |
frank26080115 | 0:84d7747641aa | 1766 | switch(mode) |
frank26080115 | 0:84d7747641aa | 1767 | { |
frank26080115 | 0:84d7747641aa | 1768 | case CAN_OPERATING_MODE: |
frank26080115 | 0:84d7747641aa | 1769 | CANx->MOD = 0x00; |
frank26080115 | 0:84d7747641aa | 1770 | break; |
frank26080115 | 0:84d7747641aa | 1771 | case CAN_RESET_MODE: |
frank26080115 | 0:84d7747641aa | 1772 | if(NewState == ENABLE) |
frank26080115 | 0:84d7747641aa | 1773 | CANx->MOD |=CAN_MOD_RM; |
frank26080115 | 0:84d7747641aa | 1774 | else |
frank26080115 | 0:84d7747641aa | 1775 | CANx->MOD &= ~CAN_MOD_RM; |
frank26080115 | 0:84d7747641aa | 1776 | break; |
frank26080115 | 0:84d7747641aa | 1777 | case CAN_LISTENONLY_MODE: |
frank26080115 | 0:84d7747641aa | 1778 | CANx->MOD |=CAN_MOD_RM;//Enter Reset mode |
frank26080115 | 0:84d7747641aa | 1779 | if(NewState == ENABLE) |
frank26080115 | 0:84d7747641aa | 1780 | CANx->MOD |=CAN_MOD_LOM; |
frank26080115 | 0:84d7747641aa | 1781 | else |
frank26080115 | 0:84d7747641aa | 1782 | CANx->MOD &=~CAN_MOD_LOM; |
frank26080115 | 0:84d7747641aa | 1783 | CANx->MOD &=~CAN_MOD_RM;//Release Reset mode |
frank26080115 | 0:84d7747641aa | 1784 | break; |
frank26080115 | 0:84d7747641aa | 1785 | case CAN_SELFTEST_MODE: |
frank26080115 | 0:84d7747641aa | 1786 | CANx->MOD |=CAN_MOD_RM;//Enter Reset mode |
frank26080115 | 0:84d7747641aa | 1787 | if(NewState == ENABLE) |
frank26080115 | 0:84d7747641aa | 1788 | CANx->MOD |=CAN_MOD_STM; |
frank26080115 | 0:84d7747641aa | 1789 | else |
frank26080115 | 0:84d7747641aa | 1790 | CANx->MOD &=~CAN_MOD_STM; |
frank26080115 | 0:84d7747641aa | 1791 | CANx->MOD &=~CAN_MOD_RM;//Release Reset mode |
frank26080115 | 0:84d7747641aa | 1792 | break; |
frank26080115 | 0:84d7747641aa | 1793 | case CAN_TXPRIORITY_MODE: |
frank26080115 | 0:84d7747641aa | 1794 | if(NewState == ENABLE) |
frank26080115 | 0:84d7747641aa | 1795 | CANx->MOD |=CAN_MOD_TPM; |
frank26080115 | 0:84d7747641aa | 1796 | else |
frank26080115 | 0:84d7747641aa | 1797 | CANx->MOD &=~CAN_MOD_TPM; |
frank26080115 | 0:84d7747641aa | 1798 | break; |
frank26080115 | 0:84d7747641aa | 1799 | case CAN_SLEEP_MODE: |
frank26080115 | 0:84d7747641aa | 1800 | if(NewState == ENABLE) |
frank26080115 | 0:84d7747641aa | 1801 | CANx->MOD |=CAN_MOD_SM; |
frank26080115 | 0:84d7747641aa | 1802 | else |
frank26080115 | 0:84d7747641aa | 1803 | CANx->MOD &=~CAN_MOD_SM; |
frank26080115 | 0:84d7747641aa | 1804 | break; |
frank26080115 | 0:84d7747641aa | 1805 | case CAN_RXPOLARITY_MODE: |
frank26080115 | 0:84d7747641aa | 1806 | if(NewState == ENABLE) |
frank26080115 | 0:84d7747641aa | 1807 | CANx->MOD |=CAN_MOD_RPM; |
frank26080115 | 0:84d7747641aa | 1808 | else |
frank26080115 | 0:84d7747641aa | 1809 | CANx->MOD &=~CAN_MOD_RPM; |
frank26080115 | 0:84d7747641aa | 1810 | break; |
frank26080115 | 0:84d7747641aa | 1811 | case CAN_TEST_MODE: |
frank26080115 | 0:84d7747641aa | 1812 | if(NewState == ENABLE) |
frank26080115 | 0:84d7747641aa | 1813 | CANx->MOD |=CAN_MOD_TM; |
frank26080115 | 0:84d7747641aa | 1814 | else |
frank26080115 | 0:84d7747641aa | 1815 | CANx->MOD &=~CAN_MOD_TM; |
frank26080115 | 0:84d7747641aa | 1816 | break; |
frank26080115 | 0:84d7747641aa | 1817 | } |
frank26080115 | 0:84d7747641aa | 1818 | } |
frank26080115 | 0:84d7747641aa | 1819 | /*********************************************************************//** |
frank26080115 | 0:84d7747641aa | 1820 | * @brief Set CAN command request |
frank26080115 | 0:84d7747641aa | 1821 | * @param[in] CANx point to CAN peripheral selected, should be: |
frank26080115 | 0:84d7747641aa | 1822 | * - LPC_CAN1: CAN1 peripheral |
frank26080115 | 0:84d7747641aa | 1823 | * - LPC_CAN2: CAN2 peripheral |
frank26080115 | 0:84d7747641aa | 1824 | * @param[in] CMRType command request type, should be: |
frank26080115 | 0:84d7747641aa | 1825 | * - CAN_CMR_TR: Transmission request |
frank26080115 | 0:84d7747641aa | 1826 | * - CAN_CMR_AT: Abort Transmission request |
frank26080115 | 0:84d7747641aa | 1827 | * - CAN_CMR_RRB: Release Receive Buffer request |
frank26080115 | 0:84d7747641aa | 1828 | * - CAN_CMR_CDO: Clear Data Overrun request |
frank26080115 | 0:84d7747641aa | 1829 | * - CAN_CMR_SRR: Self Reception request |
frank26080115 | 0:84d7747641aa | 1830 | * - CAN_CMR_STB1: Select Tx Buffer 1 request |
frank26080115 | 0:84d7747641aa | 1831 | * - CAN_CMR_STB2: Select Tx Buffer 2 request |
frank26080115 | 0:84d7747641aa | 1832 | * - CAN_CMR_STB3: Select Tx Buffer 3 request |
frank26080115 | 0:84d7747641aa | 1833 | * @return CANICR (CAN interrupt and Capture register) value |
frank26080115 | 0:84d7747641aa | 1834 | **********************************************************************/ |
frank26080115 | 0:84d7747641aa | 1835 | void CAN_SetCommand(LPC_CAN_TypeDef* CANx, uint32_t CMRType) |
frank26080115 | 0:84d7747641aa | 1836 | { |
frank26080115 | 0:84d7747641aa | 1837 | CHECK_PARAM(PARAM_CANx(CANx)); |
frank26080115 | 0:84d7747641aa | 1838 | CANx->CMR |= CMRType; |
frank26080115 | 0:84d7747641aa | 1839 | } |
frank26080115 | 0:84d7747641aa | 1840 | |
frank26080115 | 0:84d7747641aa | 1841 | /*********************************************************************//** |
frank26080115 | 0:84d7747641aa | 1842 | * @brief Get CAN interrupt status |
frank26080115 | 0:84d7747641aa | 1843 | * @param[in] CANx point to CAN peripheral selected, should be: |
frank26080115 | 0:84d7747641aa | 1844 | * - LPC_CAN1: CAN1 peripheral |
frank26080115 | 0:84d7747641aa | 1845 | * - LPC_CAN2: CAN2 peripheral |
frank26080115 | 0:84d7747641aa | 1846 | * @return CANICR (CAN interrupt and Capture register) value |
frank26080115 | 0:84d7747641aa | 1847 | **********************************************************************/ |
frank26080115 | 0:84d7747641aa | 1848 | uint32_t CAN_IntGetStatus(LPC_CAN_TypeDef* CANx) |
frank26080115 | 0:84d7747641aa | 1849 | { |
frank26080115 | 0:84d7747641aa | 1850 | CHECK_PARAM(PARAM_CANx(CANx)); |
frank26080115 | 0:84d7747641aa | 1851 | return CANx->ICR; |
frank26080115 | 0:84d7747641aa | 1852 | } |
frank26080115 | 0:84d7747641aa | 1853 | |
frank26080115 | 0:84d7747641aa | 1854 | /*********************************************************************//** |
frank26080115 | 0:84d7747641aa | 1855 | * @brief Check if FullCAN interrupt enable or not |
frank26080115 | 0:84d7747641aa | 1856 | * @param[in] CANAFx point to LPC_CANAF_TypeDef object, should be: LPC_CANAF |
frank26080115 | 0:84d7747641aa | 1857 | * @return IntStatus, could be: |
frank26080115 | 0:84d7747641aa | 1858 | * - SET: if FullCAN interrupt is enable |
frank26080115 | 0:84d7747641aa | 1859 | * - RESET: if FullCAN interrupt is disable |
frank26080115 | 0:84d7747641aa | 1860 | **********************************************************************/ |
frank26080115 | 0:84d7747641aa | 1861 | IntStatus CAN_FullCANIntGetStatus (LPC_CANAF_TypeDef* CANAFx) |
frank26080115 | 0:84d7747641aa | 1862 | { |
frank26080115 | 0:84d7747641aa | 1863 | CHECK_PARAM( PARAM_CANAFx(CANAFx)); |
frank26080115 | 0:84d7747641aa | 1864 | if (CANAFx->FCANIE) |
frank26080115 | 0:84d7747641aa | 1865 | return SET; |
frank26080115 | 0:84d7747641aa | 1866 | return RESET; |
frank26080115 | 0:84d7747641aa | 1867 | } |
frank26080115 | 0:84d7747641aa | 1868 | |
frank26080115 | 0:84d7747641aa | 1869 | /*********************************************************************//** |
frank26080115 | 0:84d7747641aa | 1870 | * @brief Get value of FullCAN interrupt and capture register |
frank26080115 | 0:84d7747641aa | 1871 | * @param[in] CANAFx point to LPC_CANAF_TypeDef object, should be: LPC_CANAF |
frank26080115 | 0:84d7747641aa | 1872 | * @param[in] type: FullCAN IC type, should be: |
frank26080115 | 0:84d7747641aa | 1873 | * - FULLCAN_IC0: FullCAN Interrupt Capture 0 |
frank26080115 | 0:84d7747641aa | 1874 | * - FULLCAN_IC1: FullCAN Interrupt Capture 1 |
frank26080115 | 0:84d7747641aa | 1875 | * @return FCANIC0 or FCANIC1 (FullCAN interrupt and Capture register) value |
frank26080115 | 0:84d7747641aa | 1876 | **********************************************************************/ |
frank26080115 | 0:84d7747641aa | 1877 | uint32_t CAN_FullCANPendGetStatus(LPC_CANAF_TypeDef* CANAFx, FullCAN_IC_Type type) |
frank26080115 | 0:84d7747641aa | 1878 | { |
frank26080115 | 0:84d7747641aa | 1879 | CHECK_PARAM(PARAM_CANAFx(CANAFx)); |
frank26080115 | 0:84d7747641aa | 1880 | CHECK_PARAM( PARAM_FULLCAN_IC(type)); |
frank26080115 | 0:84d7747641aa | 1881 | if (type == FULLCAN_IC0) |
frank26080115 | 0:84d7747641aa | 1882 | return CANAFx->FCANIC0; |
frank26080115 | 0:84d7747641aa | 1883 | return CANAFx->FCANIC1; |
frank26080115 | 0:84d7747641aa | 1884 | } |
frank26080115 | 0:84d7747641aa | 1885 | /* End of Public Variables ---------------------------------------------------------- */ |
frank26080115 | 0:84d7747641aa | 1886 | /** |
frank26080115 | 0:84d7747641aa | 1887 | * @} |
frank26080115 | 0:84d7747641aa | 1888 | */ |
frank26080115 | 0:84d7747641aa | 1889 | |
frank26080115 | 0:84d7747641aa | 1890 | #endif /* _CAN */ |
frank26080115 | 0:84d7747641aa | 1891 | |
frank26080115 | 0:84d7747641aa | 1892 | /** |
frank26080115 | 0:84d7747641aa | 1893 | * @} |
frank26080115 | 0:84d7747641aa | 1894 | */ |
frank26080115 | 0:84d7747641aa | 1895 | |
frank26080115 | 0:84d7747641aa | 1896 | /* --------------------------------- End Of File ------------------------------ */ |