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.
Revision 5:d1920eb1d63e, committed 2020-09-12
- Comitter:
- garivetm
- Date:
- Sat Sep 12 12:36:45 2020 +0000
- Parent:
- 4:0ed21bbd917b
- Commit message:
- Enable Bus Off auto management ; Pass Rx and TX as constructor parameters ; Add a timeout to the write method.
Changed in this revision
--- a/ControllerCAN.cpp Sat May 05 13:46:16 2018 +0000
+++ b/ControllerCAN.cpp Sat Sep 12 12:36:45 2020 +0000
@@ -5,7 +5,7 @@
INSTITUTION : IUT de CACHAN - 9 av. de la div. Leclerc - 94230 CACHAN
VERSIONS : v1 (03/07/2012) : FIFO organisation
- v2 (18/02/2016) : Controller aand Peripheral organisation
+ v2 (18/02/2016) : Controller and Peripheral organisation
****************************************************************************
Copyright 2016 LARNAUDIE GARIVET
@@ -25,11 +25,13 @@
#include "mbed.h"
#include "ControllerCAN.h"
-CAN ControllerCAN::can(PA_8, PA_9);
-
-ControllerCAN::ControllerCAN(){
- can.frequency(250000); // Baud rate : kbits/s
+ControllerCAN::ControllerCAN(PinName rd, PinName td) : can(rd, td, 250000) {
+ // Enable bus off auto mangement
+ unsigned long* CAN_MCR = (unsigned long*) 0x40006400;
+ *CAN_MCR |= CAN_MCR_ABOM;
+
can.attach(callback(this, &ControllerCAN::can_ISR_Reader)); // CAN ISR
+
FIFO_ecriture = 0;
FIFO_lecture = 0;
FIFO_occupation = 0;
@@ -64,9 +66,9 @@
if(FIFO_occupation!=0)
{
char res = 0;
- for (int i = 0; i < peripherals.size(); i++){
+ for (uint32_t i = 0; i < peripherals.size(); i++){
vector<unsigned short*> IdsRead = peripherals[i]->getIdsRead();
- for (int j = 0; j < IdsRead.size() ; j++){
+ for (uint32_t j = 0; j < IdsRead.size() ; j++){
if (can_MsgRx[FIFO_lecture].id == *(IdsRead[j])){
peripherals[i]->update(*(IdsRead[j]), can_MsgRx[FIFO_lecture]);
res = 1;
--- a/ControllerCAN.h Sat May 05 13:46:16 2018 +0000
+++ b/ControllerCAN.h Sat Sep 12 12:36:45 2020 +0000
@@ -69,8 +69,11 @@
class ControllerCAN {
public :
/** Create ControllerCAN instance
+ *
+ * @param rx Rd pin
+ * @param tx td pin
*/
- ControllerCAN();
+ ControllerCAN(PinName rd, PinName td);
/** Destroy ControllerCAN instance
*/
@@ -114,7 +117,7 @@
private :
- static CAN can;
+ CAN can;
vector<PeripheralCAN*> peripherals;
unsigned char FIFO_ecriture;
signed char FIFO_lecture;
--- a/PeripheralCAN.cpp Sat May 05 13:46:16 2018 +0000
+++ b/PeripheralCAN.cpp Sat Sep 12 12:36:45 2020 +0000
@@ -5,7 +5,7 @@
INSTITUTION : IUT de CACHAN - 9 av. de la div. Leclerc - 94230 CACHAN
VERSIONS : v1 (03/07/2012) : FIFO organisation
- v2 (18/02/2016) : Controller aand Peripheral organisation
+ v2 (18/02/2016) : Controller aand Peripheral organisation
****************************************************************************
Copyright 2016 LARNAUDIE GARIVET
@@ -36,13 +36,22 @@
IdsRead.push_back(Id);
}
-void PeripheralCAN::writeOnCAN(unsigned short Id, const char *data, char len){
- if (len != 0){
- while(!controllerCAN->writeData(Id, data, len));
- }
- else{
- while(!controllerCAN->writeRemote(Id));
- }
+bool PeripheralCAN::writeOnCAN(unsigned short Id, const char *data, char len, unsigned int timeout){
+ uint32_t tickstart = 0;
+
+ /* Get start tick value */
+ tickstart = HAL_GetTick();
+
+ do{
+ if (len != 0){
+ if(controllerCAN->writeData(Id, data, len)) return true;
+ }
+ else{
+ if(controllerCAN->writeRemote(Id)) return true;
+ }
+ } while((HAL_GetTick() - tickstart) < timeout);
+
+ return false;
}
void PeripheralCAN::init(void){
--- a/PeripheralCAN.h Sat May 05 13:46:16 2018 +0000
+++ b/PeripheralCAN.h Sat Sep 12 12:36:45 2020 +0000
@@ -63,8 +63,11 @@
* @param Id Id message
* @param data char array containing data to be send
* @param len size of the data array
+ * @param timeout timeout value in ms (if 0 only one write attempt)
+ *
+ * @returns Write status : true if message was successfully sent, false else.
*/
- void writeOnCAN(unsigned short Id, const char *data, char len);
+ bool writeOnCAN(unsigned short Id, const char *data, char len, unsigned int timeout = 0);
//short readOnCAN(unsigned short Id, CANMessage& msg);
/** Get the IdsRead vector
@@ -75,6 +78,8 @@
private :
vector<unsigned short*> IdsRead;
+
+ protected:
ControllerCAN* controllerCAN;
};