打印

STM32 双CAN配置怎么不通

[复制链接]
9411|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mochou|  楼主 | 2012-4-10 17:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 mochou 于 2012-4-10 17:27 编辑

各位大侠,你们好,我现在STM32F105的板子上用到了两路CAN,PD0,PD1 配置为CAN1,PB5,PB6配置为CAN2(REMAP了),但现在CAN1正常工作,CAN2就不工作,请问是什么问题,谢谢大家了,CAN2初始化函数如下
void SGL_CAN2_Init(void)
{
    NVIC_InitTypeDef       NVIC_InitStructure;
    CAN_InitTypeDef        CAN_InitStructure;
    CAN_FilterInitTypeDef  CAN_FilterInitStructure;
    GPIO_InitTypeDef       GPIO_InitStructure;
    /* CAN register init */
    CAN_DeInit(CAN2);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
    CAN_StructInit(&CAN_InitStructure);
    /* CAN cell init */
    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;
    CAN_InitStructure.CAN_TXFP = ENABLE;
    CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
    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 = 8;
    CAN_Init(CAN2, &CAN_InitStructure);
    /* CAN filter init */
    CAN_FilterInitStructure.CAN_FilterNumber = 14;
    CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
    CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
    CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; //(((SGL_CAN1_MaskRcvID<<3)&0xFFFF0000)>>16);
    CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; //(((SGL_CAN1_MaskRcvID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF);
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; //0xFFFF;
    CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; //0xFFFF;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
    CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
    CAN_FilterInit(&CAN_FilterInitStructure);
    /* Configure CAN pin: RX */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    /* Configure CAN pin: TX */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_PinRemapConfig(GPIO_Remap_CAN2, ENABLE);
    CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
    NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
沙发
mochou|  楼主 | 2012-4-10 17:02 | 只看该作者
晕倒,多粘贴了,

使用特权

评论回复
板凳
yinyangdianzi| | 2012-4-11 15:13 | 只看该作者
107  双can2.0  给力

使用特权

评论回复
地板
helongdm| | 2012-4-11 16:29 | 只看该作者
我也在用107两个CAN  现在是都用FIFO0没有问题,我想用FIFO0和FIFO1各关联一个,可是怎么设置都不能成功,不知道原因

使用特权

评论回复
5
月下飞雪| | 2013-3-16 19:45 | 只看该作者
我的107开发板PB5控制不了,控制PB6时PB5同时动作,仿真器都关了,也没有端口复用?求解

使用特权

评论回复
6
hawksabre| | 2013-3-17 10:42 | 只看该作者
不是很了解   兄弟   对不住啊   呵呵   兄弟我水平真的需要提高啊  呵呵

使用特权

评论回复
7
tianli1980| | 2013-3-18 10:44 | 只看该作者
现在很多朋友都用到了STM32的can通信,可是对于要本人来讲很陌生啊,进来学习来了,帮楼主顶一上,希望楼主早日解决问题。

使用特权

评论回复
8
airwill| | 2013-3-18 12:05 | 只看该作者
应该是没有问题的, 不要用同一个 FIFO 吧

使用特权

评论回复
9
ruiqin007| | 2013-6-14 18:40 | 只看该作者
你的用的是映射的CAN,好像看起来有点乱,你试着先开映射 GPIO_PinRemapConfig(GPIO_Remap_CAN2, ENABLE);
调试下!建议你配置的时候每个配置独立出来,时钟归时钟,引脚归引脚,CAN等!

使用特权

评论回复
10
978462113| | 2013-10-30 15:27 | 只看该作者
这CAN双机我也没有调通,哎真不知道这是什么情况。

使用特权

评论回复
11
jstele| | 2014-1-5 10:30 | 只看该作者
看了一下覺得你的代碼  現在can2你把他GPIO_Remap到gpiob的pin5和pin6   可是我怎麼沒有看到你大開RCC_APB2Periph_gpiob的時鍾呢?  這樣似乎你的gpiob是無法使用的吧!!

使用特权

评论回复
12
yc_xpg| | 2014-12-16 15:19 | 只看该作者
本帖最后由 yc_xpg 于 2014-12-16 15:21 编辑

搂主想问,你是用107的吗?如果107有主can1和从can2,如果在一个开发板上把can1和can2通过残收发器连接器,像你程序中这样把can滤波器关掉can1和can2都可以进中断发送接受,但是如果把滤波器打开就不工作了.
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; //(((SGL_CAN1_MaskRcvID<<3)&0xFFFF0000)>>16);
    CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; //(((SGL_CAN1_MaskRcvID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF);
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; //0xFFFF;
    CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; //0xFFFF;
使能滤波器,把程序注视部分打开,can1和2中断就不工作
发送配置大概是这样的
  TxMessage.stdid=SGL_CAN1_MaskRcvID=0x12;  标准标识符 11位
  TxMessage.RTR=CAN_RTR_DATA;
  TxMessage.IDE=CAN_ID_STD;
  TxMessage.DLC=2;  数据长度 2
  TxMessage.Data[0]=0xCA; 发送的数据
  TxMessage.Data[1]=0xFE;
就是SGL_CAN1_MaskRcvID和SGL_CAN2_MaskRcvID 相差一位的标识符

使用特权

评论回复
13
yc_xpg| | 2014-12-16 15:42 | 只看该作者
哪个大神的107的双can通信成功了,麻烦又叩叩号吗?请教哈,我双can不加滤波器都工作,家滤波器都不工作QQ:136265313,看到加个
或者发个带滤波器标识符额的双can通信例程也行,我的107双can,不加滤波器可以进中断收发数据,加滤波器都不工作,滤波器这样配置
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; //(((SGL_CAN1_MaskRcvID<<3)&0xFFFF0000)>>16);
    CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; //(((SGL_CAN1_MaskRcvID<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF);
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; //0xFFFF;
    CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; //0xFFFF;
使能滤波器,把程序注视部分打开,can1和2中断就不工作
发送配置大概是这样的
  TxMessage.stdid=SGL_CAN1_MaskRcvID=0x12;  标准标识符 11位
  TxMessage.RTR=CAN_RTR_DATA;
  TxMessage.IDE=CAN_ID_STD;
  TxMessage.DLC=2;  数据长度 2
  TxMessage.Data[0]=0xCA; 发送的数据
  TxMessage.Data[1]=0xFE;
就是SGL_CAN1_MaskRcvID和SGL_CAN2_MaskRcvID 相差一位的标识符

使用特权

评论回复
14
yc_xpg| | 2014-12-17 15:34 | 只看该作者
问题u以解决,滤波器没有设置好,所以没有接受对,貌似感觉以上注释的滤波器配置都不对尼......

使用特权

评论回复
15
banxiafeixia| | 2017-4-3 08:59 | 只看该作者
mochou 发表于 2012-4-10 17:02
晕倒,多粘贴了,

最近也在研究105的can,求个例程可好

使用特权

评论回复
16
515192147| | 2017-8-29 15:24 | 只看该作者
banxiafeixia 发表于 2017-4-3 08:59
最近也在研究105的can,求个例程可好

冗余双CANWeb现场总线开发板Keil工程C++源程序下载链接见:
https://bbs.21ic.com/icview-1945634-1-1.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

58

主题

1426

帖子

8

粉丝