CAN通讯模板(标准/数据帧)

#define MyCAN_SJW CAN_SJW_3tq
#define MyCAN_BS1 CAN_BS1_5tq
#define MyCAN_BS2 CAN_BS2_3tq
#define MyCAN_PRE 0x04 //1MHz

#define MyCAN_DebugMode 0x01
#define MyCAN_NormalMode 0x00

#define ID_MASK CAN_ID << 5

#define ID_FlashAddress 0x0801FBFF

CanRxMsg CAN_RecData;
CanTxMsg CAN_Message;

uchar CAN_RecFlag;
uchar CAN_ID;
uchar MailBox;

void MyCAN_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    CAN_InitTypeDef CAN_InitStructure;
    CAN_FilterInitTypeDef CAN_FilterInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    //----------DATA Init----------
    CAN_ID = (uchar)(FLASH_Read(ID_FlashAddress)&0x00FF);
    MailBox = 0x00;

    CAN_Message.StdId = CAN_ID;
    CAN_Message.IDE = 0x00;
    CAN_Message.RTR = 0x00;

    //----------GPIO Init----------
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //----------CAN Init----------
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

    CAN_InitStructure.CAN_TTCM = DISABLE;
    CAN_InitStructure.CAN_ABOM = ENABLE;
    CAN_InitStructure.CAN_AWUM = DISABLE;
    CAN_InitStructure.CAN_NART = DISABLE;
    CAN_InitStructure.CAN_RFLM = DISABLE;
    CAN_InitStructure.CAN_TXFP = DISABLE;
    CAN_InitStructure.CAN_Mode = MyCAN_NormalMode;
    CAN_InitStructure.CAN_SJW  = MyCAN_SJW;
    CAN_InitStructure.CAN_BS1  = MyCAN_BS1;
    CAN_InitStructure.CAN_BS2  = MyCAN_BS2;
    CAN_InitStructure.CAN_Prescaler = MyCAN_PRE;

    CAN_Init(CAN1, &CAN_InitStructure);

    //----------FILTER Init----------
    CAN_FilterInitStructure.CAN_FilterNumber = 6;
    CAN_FilterInitStructure.CAN_FilterMode           = CAN_FilterMode_IdMask;
    CAN_FilterInitStructure.CAN_FilterScale          = CAN_FilterScale_16bit;
    CAN_FilterInitStructure.CAN_FilterIdHigh         = ID_MASK;
    CAN_FilterInitStructure.CAN_FilterIdLow          = ID_MASK;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh     = 0xFFF8;
    CAN_FilterInitStructure.CAN_FilterMaskIdLow      = 0xFFF8;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
    CAN_FilterInitStructure.CAN_FilterActivation     = ENABLE;

    CAN_FilterInit(&CAN_FilterInitStructure);

    //----------NVIC Init----------
    NVIC_InitStructure.NVIC_IRQChannel                   = USB_LP_CAN1_RX0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0x02;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

    //----------ENABLE----------
    CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}

void CAN_SendData(uchar* Str, uchar Len)
{
    CAN_Message.DLC = Len;
    for(char i = 0; i < Len; i ++)
    {
        CAN_Message.Data[i] = Str[i];
    }
    MailBox = CAN_Transmit(CAN1, &CAN_Message);
    while(CAN_TransmitStatus(CAN1, MailBox) == CAN_TxStatus_Failed);
}

void CAN_ChangeID(uchar ID)
{
    ushort Temp[1] = {ID};
    CAN_FilterInitTypeDef CAN_FilterInitStructure;

    FLASH_WriteCheck(ID_FlashAddress, Temp, 1);
    CAN_Message.StdId = CAN_ID = ID;

    CAN_FilterInitStructure.CAN_FilterNumber         = 6;
    CAN_FilterInitStructure.CAN_FilterMode           = CAN_FilterMode_IdMask;
    CAN_FilterInitStructure.CAN_FilterScale          = CAN_FilterScale_16bit;
    CAN_FilterInitStructure.CAN_FilterIdHigh         = ID_MASK;
    CAN_FilterInitStructure.CAN_FilterIdLow          = ID_MASK;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh     = 0xFFF8;
    CAN_FilterInitStructure.CAN_FilterMaskIdLow      = 0xFFF8;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
    CAN_FilterInitStructure.CAN_FilterActivation     = ENABLE;

    CAN_FilterInit(&CAN_FilterInitStructure);
}

void USB_LP_CAN1_RX0_IRQHandler(void)
{
    if(CAN_RecFlag) return;
    CAN_Receive(CAN1, 0, &CAN_RecData);
    CAN_RecFlag = 1;
}

 

posted on 2021-03-23 10:13  棕色的北极熊  阅读(121)  评论(0)    收藏  举报