Files @ eaddb578c329
Branch filter:

Location: HydroBot/hydrobot-sharedlibs/src/can.c - annotation

matthewreed
Fixed bugs in protocol receive and changed can receive led
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
a10142102188
a10142102188
f4e15fde3799
a10142102188
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
a10142102188
a10142102188
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
a10142102188
a10142102188
a10142102188
a10142102188
a10142102188
eaddb578c329
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
f4e15fde3799
#include "can.h"

CAN_HandleTypeDef can_handle;
CAN_FilterConfTypeDef can_filter;

CanRxMsgTypeDef can_rx_msg;
CanTxMsgTypeDef can_tx_msg;

bool can_silenced;
uint32_t can_broadcast_id;
uint32_t can_rx_id;

void can_init(uint32_t rx_id, uint32_t broadcast_id)
{
    can_handle.Instance = CAN;
    can_handle.pRxMsg = &can_rx_msg;
    can_handle.pTxMsg = &can_tx_msg;

    can_handle.Init.Mode = CAN_MODE_NORMAL;
    can_handle.Init.Prescaler = 6;
    can_handle.Init.SJW = CAN_SJW_1TQ;
    can_handle.Init.BS1 = CAN_BS1_11TQ;
    can_handle.Init.BS2 = CAN_BS2_4TQ;
    can_handle.Init.TTCM = DISABLE;
    can_handle.Init.ABOM = ENABLE;
    can_handle.Init.AWUM = DISABLE;
    can_handle.Init.NART = DISABLE;
    can_handle.Init.RFLM = DISABLE;
    can_handle.Init.TXFP = DISABLE;
    HAL_CAN_Init(&can_handle);

    can_filter.FilterNumber = 0;
    can_filter.BankNumber = 0;
    can_filter.FilterMode = CAN_FILTERMODE_IDMASK;
    can_filter.FilterScale = CAN_FILTERSCALE_16BIT;
    uint32_t mask = 0x00000000;
    uint32_t id = 0x00000000;
    can_filter.FilterIdHigh = (id >> 11) & 0xFFFF;
    can_filter.FilterIdLow = (id << 5) & 0xFFFF;
    can_filter.FilterMaskIdHigh = (mask >> 11) & 0xFFFF;
    can_filter.FilterMaskIdLow = (mask << 5) & 0xFFFF;
    can_filter.FilterFIFOAssignment = CAN_FILTER_FIFO0;
    can_filter.FilterActivation = ENABLE;
    HAL_CAN_ConfigFilter(&can_handle, &can_filter);

    HAL_NVIC_SetPriority(CEC_CAN_IRQn, 1, 0);
    HAL_NVIC_EnableIRQ(CEC_CAN_IRQn);
    HAL_CAN_Receive_IT(&can_handle, CAN_FIFO0);

    can_silenced = false;
    can_rx_id = rx_id;
    can_broadcast_id = broadcast_id;
}

void can_send_test(uint16_t id)
{
    can_handle.pTxMsg->StdId = id;
    can_handle.pTxMsg->IDE = CAN_ID_STD;
    can_handle.pTxMsg->RTR = CAN_RTR_DATA;
    can_handle.pTxMsg->DLC = 4;
    can_handle.pTxMsg->Data[0] = 'T'; //0x54
    can_handle.pTxMsg->Data[1] = 'E'; //0x45
    can_handle.pTxMsg->Data[2] = 'S'; //0x53
    can_handle.pTxMsg->Data[3] = 'T'; //0x54
    HAL_CAN_Transmit_IT(&can_handle);
}

bool can_send(uint32_t id, uint32_t ide, uint8_t dlc, uint8_t data[8])
{
    bool result = true;

    if (!can_silenced)
    {
        can_handle.pTxMsg->StdId = id;
        can_handle.pTxMsg->ExtId = id;
        can_handle.pTxMsg->IDE = ide;
        can_handle.pTxMsg->RTR = CAN_RTR_DATA;
        can_handle.pTxMsg->DLC = dlc;
        memcpy(can_handle.pTxMsg->Data, data, 8);

        HAL_CAN_Transmit_IT(&can_handle);
    }
    else
    {
        result = false;
    }

    return result;
}

void can_set_receive_mask(uint32_t mask)
{
    can_filter.FilterMode = CAN_FILTERMODE_IDMASK;
    can_filter.FilterScale = CAN_FILTERSCALE_32BIT;
    can_filter.FilterMaskIdHigh = (mask >> 16) & 0xFFFF;
    can_filter.FilterMaskIdLow = mask & 0xFFFF;
    can_filter.FilterActivation = ENABLE;

    HAL_CAN_ConfigFilter(&can_handle, &can_filter);
}

void can_set_receive_id(uint32_t id)
{
    can_filter.FilterMode = CAN_FILTERMODE_IDMASK;
    can_filter.FilterScale = CAN_FILTERSCALE_32BIT;
    can_filter.FilterIdHigh = (id >> 16) & 0xFFFF;
    can_filter.FilterIdLow = id & 0xFFFF;
    can_filter.FilterActivation = ENABLE;

    HAL_CAN_ConfigFilter(&can_handle, &can_filter);

}

bool can_silence_bus(bool value)
{
    bool result = true;

    can_silenced = value;

    return result;
}

void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
{
    if ((hcan->pRxMsg->StdId == can_rx_id) | (hcan->pRxMsg->StdId == can_broadcast_id))
    {
        protocol_receive_message(hcan->pRxMsg);
        HAL_CAN_Receive_IT(&can_handle, CAN_FIFO0);
    }
    led_start_time(LED_CAN, 500);
}

void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef* hcan) {}

void HAL_CAN_ErrorCallback(CAN_HandleTypeDef* hcan)
{
    led_set(LED_ERROR, 1);
}