|
void PhyCanGpioClockInit(void) //CAN端口设置
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE); //设置APB1时钟用于CAN1端口使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA, ENABLE); //设置APB2时钟由于GPIOA端口使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PA11 CAN1接收端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PA11功能设置
GPIO_Init(GPIOA, &GPIO_InitStructure); //设置GPIOA端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PA12 CAN1发送端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PA12 CAN1发送端口
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //端口速度
GPIO_Init(GPIOA, &GPIO_InitStructure); //设置端口
void CanIRQInit(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; //中断源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //从占优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中断是否开通
NVIC_Init(&NVIC_InitStructure);
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //CAN中断开通设置中断源的动作条件
}
void PhyCanPeripheralInit(unsigned short canBaud) //CAN基本参数
{
CAN_DeInit(CAN1); //CAN恢复默认值
CAN_StructInit(&CAN_InitStructure); //恢复结构体默认值
CAN_InitStructure.CAN_TTCM = DISABLE; //TTCM 时间触发通讯模式 enable/disable
CAN_InitStructure.CAN_ABOM = ENABLE; //ABOM 自动离线管理 enable/disable
CAN_InitStructure.CAN_AWUM = DISABLE; //AWUM 自动唤醒
CAN_InitStructure.CAN_NART = DISABLE; //NART 禁止报文失败自动重传
CAN_InitStructure.CAN_RFLM = DISABLE; //RFLM FIFO锁定 enable:当前数据未提取,丢弃下一报文
// disable当前数据未提取,下一报文覆盖当前报文
CAN_InitStructure.CAN_TXFP = DISABLE; //发送FIFO优先级 enable优先级由发送请求顺序决定
// disable优先级由报文标识符决定
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //CAN工作模式
CanBaudAutoCal(canBaud); //CAN波特率 50/125/250/500/1000
CAN_Init(CAN1,&CAN_InitStructure); //设置CAN1参数
CanIRQInit(); //CAN中断设置
}
void PhyCanRecId(unsigned long canAcr,unsigned long canAmr)
{
CAN_FilterInitTypeDef CAN_FilterInitStructure; CAN_FilterInitStructure.CAN_FilterNumber=0;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=((canAcr&0xffff0000)>>16);
CAN_FilterInitStructure.CAN_FilterIdLow=canAcr&0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=(((~canAmr)&0xffff0000)>>16);
CAN_FilterInitStructure.CAN_FilterMaskIdLow=(~canAmr)&0xffff;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; //选择接收FIFO
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
}
void USB_LP_CAN1_RX0_IRQHandler(void)
{
unsigned char i;
RxMessage.StdId=0x00;
RxMessage.ExtId=0x00;
RxMessage.IDE=0;
RxMessage.DLC=0;
RxMessage.FMI=0;
LED_CAN_SET; //CAN灯灭
Runflag++; //程序运行周期
for(i=0;i<8;i++)
{
RxMessage.Data=0x00;
}
//CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0); //清除FIFO0消息挂号中断标志位
CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);
phy_st_CanMsg.us_RxId = RxMessage.StdId;
phy_st_CanMsg.us_RxLenth = RxMessage.DLC;
for(i=0;i<8;i++)
{
phy_st_CanMsg.uc_Rxmessage=RxMessage.Data;
}
phy_st_CanMsg.us_RxOver = 0x01;
for(;;);
} |
|