/* * can_drive.c * * Created on: 2023年1月5日 * Author: Administrator */ #include /********************************************************************* * @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)<>16);//(uint16_t)(((0x10000001<<3)|0x04)>>16);//应该是 CAN_FilterInitSturcture.CAN_FilterIdLow = (uint16_t)(((DF_CanIDMotor1|DF_CanIDMotor2)<> 16); CAN_FilterInitSturcture.CAN_FilterMaskIdLow = (uint16_t)(((~(DF_CanIDMotor1^DF_CanIDMotor2))<>16);//(uint16_t)(((0x10000001<<3)|0x04)>>16);//应该是 CAN_FilterInitSturcture.CAN_FilterIdLow = (uint16_t)(((DF_CanIDbattery1|DF_CanIDbattery2)<> 16); CAN_FilterInitSturcture.CAN_FilterMaskIdLow = (uint16_t)(((~(DF_CanIDbattery1^DF_CanIDbattery2))<>16);//(uint16_t)(((0x10000001<<3)|0x04)>>16);//应该是 CAN_FilterInitSturcture.CAN_FilterIdLow = (uint16_t)(((DF_CanIDMotor1|DF_CanIDMotor2)<> 16); CAN_FilterInitSturcture.CAN_FilterMaskIdLow = (uint16_t)(((~(DF_CanIDMotor1^DF_CanIDMotor2))<