Files
GPS-Navigator-/ETH/UdpServer/User/interface_can.c
2025-11-07 10:31:57 +08:00

262 lines
9.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* can_drive.c
*
* Created on: 2023Äê1ÔÂ5ÈÕ
* Author: Administrator
*/
#include <interface_can.h>
/*********************************************************************
* @fn CAN1_Mode_Init
*
* @brief Initializes CAN communication test mode.
* Bps =Fpclk1/((tpb1+1+tbs2+1+1)*brp)
*
* @param tsjw - CAN synchronisation jump width.
* tbs2 - CAN time quantum in bit segment 1.
* tbs1 - CAN time quantum in bit segment 2.
* brp - Specifies the length of a time quantum.
* mode - Test mode.
* CAN_Mode_Normal.
* CAN_Mode_LoopBack.
* CAN_Mode_Silent.
* CAN_Mode_Silent_LoopBack.
*
* @return none
*/
void CAN1_Mode_Init( u8 tsjw, u8 tbs2, u8 tbs1, u16 brp, u8 mode )
{
GPIO_InitTypeDef GPIO_InitSturcture={0};
CAN_InitTypeDef CAN_InitSturcture={0};
CAN_FilterInitTypeDef CAN_FilterInitSturcture={0};
NVIC_InitTypeDef NVIC_InitStructure={0};
//CAN1
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOD, ENABLE );
RCC_APB1PeriphClockCmd( RCC_APB1Periph_CAN1, ENABLE );
GPIO_PinRemapConfig( GPIO_Remap2_CAN1, ENABLE);
GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_1;
GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOD, &GPIO_InitSturcture);
GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_0;
GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init( GPIOD, &GPIO_InitSturcture);
CAN_InitSturcture.CAN_TTCM = DISABLE;
CAN_InitSturcture.CAN_ABOM = ENABLE;
CAN_InitSturcture.CAN_AWUM = DISABLE;
CAN_InitSturcture.CAN_NART = ENABLE;
CAN_InitSturcture.CAN_RFLM = DISABLE;
CAN_InitSturcture.CAN_TXFP = DISABLE;
CAN_InitSturcture.CAN_Mode = mode;
CAN_InitSturcture.CAN_SJW = tsjw;
CAN_InitSturcture.CAN_BS1 = tbs1;
CAN_InitSturcture.CAN_BS2 = tbs2;
CAN_InitSturcture.CAN_Prescaler = brp;
CAN_Init( CAN1, &CAN_InitSturcture );
CAN_FilterInitSturcture.CAN_FilterNumber = 0;
CAN_FilterInitSturcture.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitSturcture.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitSturcture.CAN_FilterIdHigh = (uint16_t)((((DF_CanIDMotor1|DF_CanIDMotor2)<<DF_ExtIDShift)|0x04)>>16);//(uint16_t)(((0x10000001<<3)|0x04)>>16);//Ó¦¸ÃÊÇ
CAN_FilterInitSturcture.CAN_FilterIdLow = (uint16_t)(((DF_CanIDMotor1|DF_CanIDMotor2)<<DF_ExtIDShift)|0x04);//(uint16_t)(((0x10000001<<3)|0x04));//
CAN_FilterInitSturcture.CAN_FilterMaskIdHigh = (uint16_t)((((~(DF_CanIDMotor1^DF_CanIDMotor2))<<DF_ExtIDShift)|0x0E) >> 16);
CAN_FilterInitSturcture.CAN_FilterMaskIdLow = (uint16_t)(((~(DF_CanIDMotor1^DF_CanIDMotor2))<<DF_ExtIDShift)|0x0E);
CAN_FilterInitSturcture.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
CAN_FilterInitSturcture.CAN_FilterActivation = ENABLE;
CAN_FilterInit( &CAN_FilterInitSturcture );
CAN_FilterInitSturcture.CAN_FilterNumber = 1;
CAN_FilterInitSturcture.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitSturcture.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitSturcture.CAN_FilterIdHigh = (uint16_t)((((DF_CanIDbattery1|DF_CanIDbattery2)<<DF_StaIDShift))>>16);//(uint16_t)(((0x10000001<<3)|0x04)>>16);//Ó¦¸ÃÊÇ
CAN_FilterInitSturcture.CAN_FilterIdLow = (uint16_t)(((DF_CanIDbattery1|DF_CanIDbattery2)<<DF_StaIDShift));//(uint16_t)(((0x10000001<<3)|0x04));//
CAN_FilterInitSturcture.CAN_FilterMaskIdHigh = (uint16_t)((((~(DF_CanIDbattery1^DF_CanIDbattery2))<<DF_StaIDShift)|0x0E) >> 16);
CAN_FilterInitSturcture.CAN_FilterMaskIdLow = (uint16_t)(((~(DF_CanIDbattery1^DF_CanIDbattery2))<<DF_StaIDShift)|0x0E);
CAN_FilterInitSturcture.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
CAN_FilterInitSturcture.CAN_FilterActivation = ENABLE;
CAN_FilterInit( &CAN_FilterInitSturcture );
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE); //FIFO0ÏûÏ¢¹ÒºÅÖжÏÔÊÐí.
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*********************************************************************
* @fn CAN2_Mode_Init
*
* @brief Initializes CAN communication test mode.
* Bps =Fpclk1/((tpb1+1+tbs2+1+1)*brp)
*
* @param tsjw - CAN synchronisation jump width.
* tbs2 - CAN time quantum in bit segment 1.
* tbs1 - CAN time quantum in bit segment 2.
* brp - Specifies the length of a time quantum.
* mode - Test mode.
* CAN_Mode_Normal.
* CAN_Mode_LoopBack.
* CAN_Mode_Silent.
* CAN_Mode_Silent_LoopBack.
*
* @return none
*/
void CAN2_Mode_Init( u8 tsjw, u8 tbs2, u8 tbs1, u16 brp, u8 mode )
{
GPIO_InitTypeDef GPIO_InitSturcture={0};
CAN_InitTypeDef CAN_InitSturcture={0};
CAN_FilterInitTypeDef CAN_FilterInitSturcture={0};
NVIC_InitTypeDef NVIC_InitStructure={0};
//CAN2
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE );
RCC_APB1PeriphClockCmd( RCC_APB1Periph_CAN2, ENABLE );
GPIO_PinRemapConfig( GPIO_Remap_CAN2, ENABLE);
GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_6;
GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOB, &GPIO_InitSturcture);
GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_5;
GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init( GPIOB, &GPIO_InitSturcture);
CAN_InitSturcture.CAN_TTCM = DISABLE;
CAN_InitSturcture.CAN_ABOM = ENABLE;
CAN_InitSturcture.CAN_AWUM = DISABLE;
CAN_InitSturcture.CAN_NART = ENABLE;
CAN_InitSturcture.CAN_RFLM = DISABLE;
CAN_InitSturcture.CAN_TXFP = DISABLE;
CAN_InitSturcture.CAN_Mode = mode;
CAN_InitSturcture.CAN_SJW = tsjw;
CAN_InitSturcture.CAN_BS1 = tbs1;
CAN_InitSturcture.CAN_BS2 = tbs2;
CAN_InitSturcture.CAN_Prescaler = brp;
CAN_Init( CAN2, &CAN_InitSturcture );
CAN_SlaveStartBank(7);//CAN2µÄ¿ªÊ¼Â˲¨×é
CAN_FilterInitSturcture.CAN_FilterNumber = 7;
CAN_FilterInitSturcture.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitSturcture.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitSturcture.CAN_FilterIdHigh = (uint16_t)((((DF_CanIDMotor1|DF_CanIDMotor2)<<DF_ExtIDShift)|0x04)>>16);//(uint16_t)(((0x10000001<<3)|0x04)>>16);//Ó¦¸ÃÊÇ
CAN_FilterInitSturcture.CAN_FilterIdLow = (uint16_t)(((DF_CanIDMotor1|DF_CanIDMotor2)<<DF_ExtIDShift)|0x04);//(uint16_t)(((0x10000001<<3)|0x04));//
CAN_FilterInitSturcture.CAN_FilterMaskIdHigh = (uint16_t)((((~(DF_CanIDMotor1^DF_CanIDMotor2))<<DF_ExtIDShift)|0x0E) >> 16);
CAN_FilterInitSturcture.CAN_FilterMaskIdLow = (uint16_t)(((~(DF_CanIDMotor1^DF_CanIDMotor2))<<DF_ExtIDShift)|0x0E);
CAN_FilterInitSturcture.CAN_FilterFIFOAssignment = CAN_Filter_FIFO1;
CAN_FilterInitSturcture.CAN_FilterActivation = ENABLE;
CAN_FilterInit( &CAN_FilterInitSturcture );
CAN_ITConfig(CAN2,CAN_IT_FMP1,ENABLE); //FIFO1ÏûÏ¢¹ÒºÅÖжÏÔÊÐí.
NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*********************************************************************
* @fn CAN_Send_Msg
*
* @brief CAN Transmit function.
*
* @param CANx- CAN1 or CAN2
* ID - Message ID
* IDE - CAN_Id_Standard or CAN_Id_Extended
* RTR - CAN_RTR_Data or CAN_RTR_Remote
* msg - Transmit data buffer.
* len - Data length.
*
* @return 0 - Send successful.
* 1 - Send failed.
*/
u8 CAN_Send_Msg( CAN_TypeDef *CANx, u32 ID, u8 ide, u8 rtr, u8 *msg, u8 len)
{
u8 mbox;
u16 i = 0;
CanTxMsg CanTxStructure;
if(CAN_Id_Standard == ide)//¸ù¾ÝIDÀàÐÍÑ¡Ôñ¸³Öµ
{
CanTxStructure.StdId = ID;
}
else if (CAN_Id_Extended == ide)
{
CanTxStructure.ExtId = ID;
}
else {}
CanTxStructure.IDE = ide;
CanTxStructure.RTR = rtr;
CanTxStructure.DLC = len;
for( i=0; i<len; i++ )
{
CanTxStructure.Data[i] = msg[i];
}
mbox = CAN_Transmit( CANx, &CanTxStructure);
i = 0;
while( ( CAN_TransmitStatus( CANx, mbox ) != CAN_TxStatus_Ok ) && (i < 0xFFF) )
{
i++;
}
if( i == 0xFFF )
{
return 1;
}
else
{
return 0;
}
}
/*********************************************************************
* @fn CAN_Receive_Msg
*
* @brief CAN Receive function.
*
* @param buf - Receive data buffer.
* len - Data length.
*
* @return CanRxStructure.DLC - Receive data length.
*/
u8 CAN_Receive_Msg(CAN_TypeDef *CANx, uint8_t FIFONumber, u8 *buf )
{
u8 i;
CanRxMsg CanRxStructure;
if( CAN_MessagePending( CANx, FIFONumber ) == 0)
{
return 0;
}
CAN_Receive( CANx, FIFONumber, &CanRxStructure );
for( i=0; i<8; i++ )
{
buf[i] = CanRxStructure.Data[i];
}
return CanRxStructure.DLC;
}