第一次提交

This commit is contained in:
2025-09-05 21:09:02 +08:00
commit f0106c0f17
107 changed files with 38950 additions and 0 deletions

View File

@@ -0,0 +1,261 @@
/*
* can_drive.c
*
* Created on: 2023<32><33>1<EFBFBD><31>5<EFBFBD><35>
* 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_CanIDbattery|DF_CanIDRCH_3)<<DF_ExtIDShift)|0x04)>>16);//(uint16_t)(((0x10000001<<3)|0x04)>>16);//Ӧ<><D3A6><EFBFBD><EFBFBD>
CAN_FilterInitSturcture.CAN_FilterIdLow = (uint16_t)(((DF_CanIDbattery|DF_CanIDRCH_3)<<DF_ExtIDShift)|0x04);//(uint16_t)(((0x10000001<<3)|0x04));//
CAN_FilterInitSturcture.CAN_FilterMaskIdHigh = (uint16_t)((((~(DF_CanIDbattery^DF_CanIDRCH_3))<<DF_ExtIDShift)|0x0E) >> 16);
CAN_FilterInitSturcture.CAN_FilterMaskIdLow = (uint16_t)(((~(DF_CanIDbattery^DF_CanIDRCH_3))<<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);//Ӧ<><D3A6><EFBFBD><EFBFBD>
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<4F><30>Ϣ<EFBFBD>Һ<EFBFBD><D2BA>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>.
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<4E>Ŀ<EFBFBD>ʼ<EFBFBD>˲<EFBFBD><CBB2><EFBFBD>
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_StaIDShift))>>16);//(uint16_t)(((0x10000001<<3)|0x04)>>16);//Ӧ<><D3A6><EFBFBD><EFBFBD>
CAN_FilterInitSturcture.CAN_FilterIdLow = (uint16_t)(((DF_CanIDMotor1|DF_CanIDMotor2)<<DF_StaIDShift));//(uint16_t)(((0x10000001<<3)|0x04));//
CAN_FilterInitSturcture.CAN_FilterMaskIdHigh = (uint16_t)((((~(DF_CanIDMotor1^DF_CanIDMotor2))<<DF_StaIDShift)|0x0E) >> 16);
CAN_FilterInitSturcture.CAN_FilterMaskIdLow = (uint16_t)(((~(DF_CanIDMotor1^DF_CanIDMotor2))<<DF_StaIDShift)|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<4F><31>Ϣ<EFBFBD>Һ<EFBFBD><D2BA>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>.
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)//<2F><><EFBFBD><EFBFBD>ID<49><44><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ֵ
{
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;
}