Fork of Smoothie to port to mbed non-LPC targets.

Dependencies:   mbed

Fork of Smoothie by Stéphane Cachat

Committer:
Michael J. Spencer
Date:
Fri Feb 28 18:52:52 2014 -0800
Revision:
2:1df0b61d3b5a
Update to latest Smoothie.

Who changed what in which revision?

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