本帖最后由 03024003 于 2010-7-23 09:14 编辑
我的CAN1 CAN2初始化除了过滤器设置不同 其它都一样。还发现如果CAN1不初始化CAN2接收无法产生中断
void CAN2_Init(u16 Baud)
{
CAN2_TimeRecordH1 = 0;
CAN2_TimeRecordH1 = 0;
CAN2_TimeRecordL1 = 0;
CAN2_TimeRecordL1 = 0;
CAN2_RecordSequence = 0;
CAN2_FirstFrame = 1;
memset(CAN2_rxData, 0, 20);
GPIO_InitTypeDef GPIO_InitStructure; //端口结构体实例
NVIC_InitTypeDef NVIC_InitStructure; //中断结构体实例
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
//配置NVIC和向量表基地址
NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn; //中断服务函数名
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
CAN2_Config(Baud);
}
void CAN2_Config(u16 Baud)
{
u16 i = 5;
CAN_InitTypeDef CAN_InitStructure; //结构体实例
CAN_FilterInitTypeDef CAN_FilterInitStructure; //结构体实例
CAN_DeInit(CAN2); //复位CAN寄存器
CAN_StructInit(&CAN_InitStructure); //写入默认值
//CAN1 参数初始化
CAN_InitStructure.CAN_TTCM = DISABLE; //禁止时间触发通信方式
CAN_InitStructure.CAN_ABOM = DISABLE; //禁止总线自动关闭
CAN_InitStructure.CAN_AWUM = DISABLE; //禁止自动唤醒
CAN_InitStructure.CAN_NART = DISABLE; //禁止自动重发(设置成使能 发不出数)
CAN_InitStructure.CAN_RFLM = DISABLE; //禁止接收FIFO锁定
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
switch(Baud)
{
case 10: i = 0; break; //10K
case 20: i = 1; break; //20k
case 50: i = 2; break; //50k
case 100: i = 3; break; //100k
case 125: i = 4; break; //125k
case 250: i = 5; break; //250k
case 500: i = 6; break; //500k
case 750: i = 7; break; //750k
case 1000: i = 8; break; //1M
default : i = 5; break; //默认为500Kbps
}
CAN_InitStructure.CAN_SJW = CanTiming[0];
CAN_InitStructure.CAN_BS1 = CanTiming[1];
CAN_InitStructure.CAN_BS2 = CanTiming[2];
CAN_InitStructure.CAN_Prescaler = CanTiming[3];
CAN_Init(CAN2, &CAN_InitStructure);
//过滤第一组ID
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0;//(((u32)CPU_CAN_0<<21)&0xFFFF0000)>>16;
CAN_FilterInitStructure.CAN_FilterIdLow = 0;//(((u32)CPU_CAN_0<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0;//0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0;//0xFFFF;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
//过滤第二组ID
//CAN_FilterInitStructure.CAN_FilterNumber = 14;
//CAN_FilterInitStructure.CAN_FilterIdHigh = (((u32)CPU_CAN_1<<21)&0xFFFF0000)>>16;
//CAN_FilterInitStructure.CAN_FilterIdLow = (((u32)CPU_CAN_1<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xFFFF;
//CAN_FilterInit(&CAN_FilterInitStructure);
CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
}
|