Add can_init_freq for STM devices

pull/4165/head
adustm 2017-04-24 18:47:39 +02:00
parent 3d44a3fcc3
commit 9115dd9b98
1 changed files with 12 additions and 7 deletions

View File

@ -30,6 +30,11 @@ static uint32_t can_irq_ids[CAN_NUM] = {0};
static can_irq_handler irq_handler;
void can_init(can_t *obj, PinName rd, PinName td)
{
can_init_freq(obj, rd, td, 100000);
}
void can_init_freq (can_t *obj, PinName rd, PinName td, int hz)
{
CANName can_rd = (CANName)pinmap_peripheral(rd, PinMap_CAN_RD);
CANName can_td = (CANName)pinmap_peripheral(td, PinMap_CAN_TD);
@ -80,8 +85,8 @@ void can_init(can_t *obj, PinName rd, PinName td)
error("Cannot initialize CAN");
}
// Set initial CAN frequency to 100 kb/s
can_frequency(obj, 100000);
// Set initial CAN frequency to requested kb/s
can_frequency(obj, hz);
uint32_t filter_number = (obj->can == CAN_1) ? 0 : 14;
can_filter(obj, 0, 0, CANStandard, filter_number);
@ -227,16 +232,16 @@ int can_write(can_t *obj, CAN_Message msg, int cc)
} else {
can->sTxMailBox[transmitmailbox].TIR |= ((msg.id << 3) | CAN_ID_EXT | msg.type);
}
/* Set up the DLC */
can->sTxMailBox[transmitmailbox].TDTR &= (uint32_t)0xFFFFFFF0;
can->sTxMailBox[transmitmailbox].TDTR |= (msg.len & (uint8_t)0x0000000F);
/* Set up the data field */
can->sTxMailBox[transmitmailbox].TDLR = (((uint32_t)msg.data[3] << 24) |
((uint32_t)msg.data[2] << 16) |
((uint32_t)msg.data[1] << 8) |
((uint32_t)msg.data[0]));
((uint32_t)msg.data[2] << 16) |
((uint32_t)msg.data[1] << 8) |
((uint32_t)msg.data[0]));
can->sTxMailBox[transmitmailbox].TDHR = (((uint32_t)msg.data[7] << 24) |
((uint32_t)msg.data[6] << 16) |
((uint32_t)msg.data[5] << 8) |