262 lines
9.4 KiB
C
262 lines
9.4 KiB
C
/*
|
||
* 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;
|
||
}
|
||
|
||
|