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/]]

Committer:
frank26080115
Date:
Sun Mar 20 18:45:15 2011 +0000
Revision:
0:84d7747641aa

        

Who changed what in which revision?

UserRevisionLine numberNew 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 ------------------------------ */