27,375
社区成员
发帖
与我相关
我的任务
分享
#include "CanTran.h"
CanTxMsg TxMessage;
CanRxMsg RxMessage;
u8 CAN_Recieve_Flag;
u8 count1 = 0;
/**
* @brief Configures the CAN, transmit and receive using interrupt.
* @param None
* @retval : PASSED if the reception is well done, FAILED in other case
*/
void MyCAN_Init(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_CAN1 , ENABLE);
/* Configure CAN pin: RX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure CAN pin: TX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* CAN register init */
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
/* CAN cell init */
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=CAN_Mode_Normal;
//CAN Speed = 200KHz
// CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
// CAN_InitStructure.CAN_BS1=CAN_BS1_14tq;
// CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;
// CAN_InitStructure.CAN_Prescaler=10;
// CAN_Init(CAN1, &CAN_InitStructure);
//500k
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_4tq;
CAN_InitStructure.CAN_Prescaler=4; //10;
CAN_Init(CAN1, &CAN_InitStructure);
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber=1;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
/* CAN FIFO0 message pending interrupt enable */
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void CAN_TransmitData(u32 StdId, uint8_t DLC_Num,uint8_t *Data)
{
/* transmit 1 message */
uint8_t i;
TxMessage.StdId=StdId;
TxMessage.ExtId = 0x0000;
TxMessage.IDE=CAN_ID_STD;
TxMessage.RTR=CAN_RTR_DATA;
TxMessage.DLC=DLC_Num;
for(i=0;i<DLC_Num;i++)
TxMessage.Data[i]=Data[i];
CAN_Transmit(CAN1, &TxMessage);
}
/**
* @brief This function handles USB Low Priority or CAN RX0 interrupts
* requests.
* @param None
* @retval : None
*/
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
CAN_Recieve_Flag = 1;
}
void CanTran_task(void)
{
if(CAN_Recieve_Flag==1)
{
CAN_Recieve_Flag = 0;
switch(RxMessage.StdId)
{
// case 0x101:
// PowerSwitchState = RxMessage.Data[3];
// PowerSwitchState <<=8;
// PowerSwitchState |=RxMessage.Data[2];
// PowerSwitchState <<=8;
// PowerSwitchState |=RxMessage.Data[1];
// PowerSwitchState <<=8;
// PowerSwitchState |=RxMessage.Data[0];
// UpKeyLed();
case 0x101:
// SetLedStatue(RxMessage.Data[0],RxMessage.Data[1]);
count1++;
CAN_TransmitData(0x101,8,"master1");
break;
case 2:
if(RxMessage.Data[0]==1)
{
// SetJDQ_AC(RxMessage.Data[1]);
}
else if(RxMessage.Data[0]==2)
{
// SetJDQ_Bat(RxMessage.Data[1]);
}
break;
case 3: // Èí¿ª¹Ø
// SoftOff = RxMessage.Data[0];
break;
}
}
}