我用的
单片机为
STM32F103VC,CAN 在回环模式下,可以正常收发。在常规模式下,可以发送数据,但无法收到数据,中断接收无法进入。以下为部分代码:
初始化:
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//使能PORTA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);//使能CAN时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO
CAN_InitStructure.CAN_Prescaler = 24;//12;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;//CAN_Mode_LoopBack;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_7tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_4tq; //250Kbps
CAN_InitStructure.CAN_TTCM = DISABLE; //非时间触发
通信模式
CAN_InitStructure.CAN_ABOM = DISABLE; //软件自动离线管理
CAN_InitStructure.CAN_AWUM = DISABLE; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
CAN_InitStructure.CAN_NART = ENABLE; //禁止报文自动传送
CAN_InitStructure.CAN_RFLM = DISABLE; //报文不锁定,新的覆盖旧的
CAN_InitStructure.CAN_TXFP = DISABLE; //优先级由报文标识符决定
CAN_Init(CAN1,&CAN_InitStructure); // 初始化CAN1
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;//32 位 ID
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;//32 位 MASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterNumber = 0; //过滤器0
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FilterFIFO0; //过滤器0关联到FIFO0
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterAc
tivation = ENABLE; //激活过滤器0
CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化
CAN_ClearITPendingBit(CAN1,CAN_IT_FF0);
CAN_ClearITPendingBit(CAN1,CAN_IT_FOV0);
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE); //FIFO0消息挂号中断允许
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
中断函数
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);
}
一直无法进入中断函数,救助.
刚看了V3.1.2的固件库样例程序,验收滤波字设置是对的。
请先跑一下样例程序,我试过V3.1.2的库,V3.5的库应该也能行。
“STM32F10x_StdPeriph_Lib_V3.1.2ProjectSTM32F10x_StdPeriph_ExamplesCANNormal”
这个样例程序,我在刚学STM32的时候测试过没有问题。虽然年代有几久,但是我打包好的程序,确定是没有问题的。
——————————————— 以下内容请忽略 ——————————————————
看一下你的接收滤波设置的对吗?感觉不太对呀,好多年没搞过CAN了。
你把这些设成0xff,试试。目的就是不滤波,只要总线上发送给所有ID的的数据,全接收。
——————————————— 内容请忽略,第一次回贴内容 ———————————
一周热门 更多>