完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我用的单片机为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_FilterActivation = 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); } 一直无法进入中断函数,救助. |
|
相关推荐
8个回答
|
|
1.首先,楼主要知道在正常模式下,can总线需要有接收端才可以,也就是说只有你这一块板子是不可以调试正常模式的
2.过滤器设置之后,确认帧ID相符否 3.请问楼主如何确认自己已经发送数据了呢?是通过示波器看到了吗? |
|
|
|
跨界F16 发表于 2018-8-24 14:48 我是用板子连接USBCAN,在CANTest软件上可以看到板子发出的报文,再通过USBCAN发送报文,板子无法收到。 |
|
|
|
用示波器看板子接收端的波形了吗 |
|
|
|
|
|
|
|
看配置是没问题。总线是否加了120欧姆的电阻,没有就加一个试试。
|
|
|
|
|
|
|
|
首先确定中断是否开启,包括外设时钟,然后调试,看看中断标志位是否被置一,如果被置一了,但是没有中断响应,是否映射不对...就按这个路子走咯...
|
|
|
|
本帖最后由 toofree 于 2018-3-13 18:22 编辑
刚看了V3.1.2的固件库样例程序,验收滤波字设置是对的。 请先跑一下样例程序,我试过V3.1.2的库,V3.5的库应该也能行。 “STM32F10x_StdPeriph_Lib_V3.1.2ProjectSTM32F10x_StdPeriph_ExamplesCANNormal” 这个样例程序,我在刚学STM32的时候测试过没有问题。虽然年代有几久,但是我打包好的程序,确定是没有问题的。 ——————————————— 以下内容请忽略 —————————————————— 看一下你的接收滤波设置的对吗?感觉不太对呀,好多年没搞过CAN了。 你把这些设成0xff,试试。目的就是不滤波,只要总线上发送给所有ID的的数据,全接收。 ——————————————— 内容请忽略,第一次回贴内容 ——————————— |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1967 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1823 浏览 3 评论
4403 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1970 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2477 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 20:38 , Processed in 0.866365 second(s), Total 86, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号