Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-src by
CAN.cpp
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2006-2013 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 #include "CAN.h" 00017 00018 #if DEVICE_CAN 00019 00020 #include "cmsis.h" 00021 00022 namespace mbed { 00023 00024 CAN::CAN(PinName rd, PinName td) { 00025 can_init(&_can, rd, td); 00026 } 00027 00028 CAN::~CAN() { 00029 can_free(&_can); 00030 } 00031 00032 int CAN::frequency(int f) { 00033 return can_frequency(&_can, f); 00034 } 00035 00036 int CAN::write(CANMessage msg) { 00037 return can_write(&_can, msg, 0); 00038 } 00039 00040 int CAN::read(CANMessage &msg) { 00041 return can_read(&_can, &msg); 00042 } 00043 00044 void CAN::reset() { 00045 can_reset(&_can); 00046 } 00047 00048 unsigned char CAN::rderror() { 00049 return can_rderror(&_can); 00050 } 00051 00052 unsigned char CAN::tderror() { 00053 return can_tderror(&_can); 00054 } 00055 00056 void CAN::monitor(bool silent) { 00057 can_monitor(&_can, (silent) ? 1 : 0); 00058 } 00059 00060 static FunctionPointer* can_obj[2] = { NULL }; 00061 00062 // Have to check that the CAN block is active before reading the Interrupt 00063 // Control Register, or the mbed hangs 00064 void can_irq(void) { 00065 uint32_t icr; 00066 00067 if(LPC_SC->PCONP & (1 << 13)) { 00068 icr = LPC_CAN1->ICR; 00069 00070 if(icr && (can_obj[0] != NULL)) { 00071 can_obj[0]->call(); 00072 } 00073 } 00074 00075 if(LPC_SC->PCONP & (1 << 14)) { 00076 icr = LPC_CAN2->ICR; 00077 if(icr && (can_obj[1] != NULL)) { 00078 can_obj[1]->call(); 00079 } 00080 } 00081 00082 } 00083 00084 void CAN::setup_interrupt(void) { 00085 switch ((int)_can.dev) { 00086 case CAN_1: can_obj[0] = &_rxirq; break; 00087 case CAN_2: can_obj[1] = &_rxirq; break; 00088 } 00089 _can.dev->MOD |= 1; 00090 _can.dev->IER |= 1; 00091 _can.dev->MOD &= ~1; 00092 NVIC_SetVector(CAN_IRQn , (uint32_t) &can_irq); 00093 NVIC_EnableIRQ(CAN_IRQn ); 00094 } 00095 00096 void CAN::remove_interrupt(void) { 00097 switch ((int)_can.dev) { 00098 case CAN_1: can_obj[0] = NULL; break; 00099 case CAN_2: can_obj[1] = NULL; break; 00100 } 00101 00102 _can.dev->IER &= ~(1); 00103 if ((can_obj[0] == NULL) && (can_obj[1] == NULL)) { 00104 NVIC_DisableIRQ(CAN_IRQn ); 00105 } 00106 } 00107 00108 void CAN::attach(void (*fptr)(void)) { 00109 if (fptr != NULL) { 00110 _rxirq.attach(fptr); 00111 setup_interrupt(); 00112 } else { 00113 remove_interrupt(); 00114 } 00115 } 00116 00117 } // namespace mbed 00118 00119 #endif
Generated on Tue Jul 12 2022 13:47:00 by
1.7.2
