OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5904|回复: 9

STM32F105 CAN重映射问题

[复制链接]

2

主题

12

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-9-12
在线时间
2 小时
发表于 2017-2-22 18:08:39 | 显示全部楼层 |阅读模式
5金钱
大家好!
想要向大家请教一下CAN端口重映射这个功能。
目前使用的芯片是STM32F105,两路CAN均使用了端口重映射。

目前使用环回模式调试,CAN1,CAN2均可以收到CAN信号。
但是使用普通模式下,使用CAN卡向其发送信号,接收不到。
向CAN卡发送信号也同样接收不到。
想请问一下,重映射部分是否有配置出错。

主要是CAN2部分,CAN1部分由于板子的收发器有些问题所以还没法进行普通模式的调试。
CAN2部分的话,收发器用的TJA1050,测得芯片RX引脚是3.1V,TX引脚是0V。

希望大家能一起看一下!感激不尽!

配置如下
void CAN1_Mode_Init(void)
{
        GPIO_InitTypeDef                   GPIO_InitStructure;
        CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
       
        GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE);
       
        /* Configure CAN1 RX pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        /* Configure CAN1 TX pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
       
       
       
        CAN_DeInit(CAN1);
        CAN_StructInit(&CAN_InitStructure);
       
        CAN_InitStructure.CAN_TTCM=DISABLE;        //ʱ¼ä´¥·¢Í¨Ñ¶Ä£Ê½
  CAN_InitStructure.CAN_ABOM=DISABLE;        //×Ô¶¯ÀëÏß¹ÜÀíģʽ
  CAN_InitStructure.CAN_AWUM=DISABLE;        //×Ô¶¯»½ÐÑģʽ
  CAN_InitStructure.CAN_NART=ENABLE;        //·Ç×Ô¶¯ÖØ´«Êäģʽ
  CAN_InitStructure.CAN_RFLM=DISABLE;        //½ÓÊÕFIFOËø¶¨Ä£Ê½
  CAN_InitStructure.CAN_TXFP=DISABLE;        //·¢ËÍFIFOÓÅÏȼ¶
       
        CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;           //Õý³£Ä£Ê½
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;         //ͬ²½ÌøÔ¾1¸öʱ¼äµ¥Ôª
  CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;         //ʱ¼ä¶Î1Ϊ8¸öʱ¼äµ¥Ôª
  CAN_InitStructure.CAN_BS2=CAN_BS2_8tq;         //ʱ¼ä¶Î2Ϊ7¸öʱ¼äµ¥Ôª
  CAN_InitStructure.CAN_Prescaler=4;                 //500Kbps
        CAN_Init(CAN1, &CAN_InitStructure);
       
        CAN_FilterInitStructure.CAN_FilterNumber=0;         //Ö¸¶¨³õʼ»¯µÄ¹ýÂËÆ÷±àºÅΪ0     £¨0~13£©
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;         //±êʶ·ûÆÁ±Îλģʽ
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //1¸ö32λµÄ¹ýÂËÆ÷
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;         //É趨¹ýÂËÆ÷µÄ±êʶ·û£¨32λΪÆä¸ß¶Î£¬16λΪµÚÒ»¸ö£©·¶Î§ÊÇ0x0000~0xffff
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;         //É趨¹ýÂËÆ÷µÄ±êʶ·û£¨32λΪÆäµÍ¶Î£¬16λΪµÚ¶þ¸ö£©·¶Î§ÊÇ0x0000~0xffff
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;        //É趨¹ýÂËÆ÷ÆÁ±Î±êʶ·û»òÕß¹ýÂ˱êʶ·û
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;   //É趨¹ýÂËÆ÷ÆÁ±Î±êʶ·û»òÕß¹ýÂ˱êʶ·û        ¹ýÂ˵ıêʶ·û¶¼Îª0˵Ã÷ËùÓеİü¶¼½ÓÊÕ
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;        //¹ýÂËÆ÷FIFOÖ¸Ïò¹ýÂËÆ÷0          FIFOÓÐÁ½×éÒ»ÖÖÊǵÚ0×飬һÖÖÊǵÚ1×é¡£
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;        //ʹÄܹýÂËÆ÷
  CAN_FilterInit(&CAN_FilterInitStructure);
}

void CAN2_Mode_Init(void)
{
        GPIO_InitTypeDef                   GPIO_InitStructure;
        CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
       
        GPIO_PinRemapConfig(GPIO_Remap_CAN2 , ENABLE);
       
        /* Configure CAN2 RX pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        /* Configure CAN2 TX pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
       
       
       
        CAN_DeInit(CAN2);
        CAN_StructInit(&CAN_InitStructure);
       
        CAN_InitStructure.CAN_TTCM=DISABLE;        //ʱ¼ä´¥·¢Í¨Ñ¶Ä£Ê½
  CAN_InitStructure.CAN_ABOM=DISABLE;        //×Ô¶¯ÀëÏß¹ÜÀíģʽ
  CAN_InitStructure.CAN_AWUM=DISABLE;        //×Ô¶¯»½ÐÑģʽ
  CAN_InitStructure.CAN_NART=ENABLE;        //·Ç×Ô¶¯ÖØ´«Êäģʽ
  CAN_InitStructure.CAN_RFLM=DISABLE;        //½ÓÊÕFIFOËø¶¨Ä£Ê½
  CAN_InitStructure.CAN_TXFP=DISABLE;        //·¢ËÍFIFOÓÅÏȼ¶
       
        CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;           //Õý³£Ä£Ê½
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;         //ͬ²½ÌøÔ¾1¸öʱ¼äµ¥Ôª
  CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;         //ʱ¼ä¶Î1Ϊ8¸öʱ¼äµ¥Ôª
  CAN_InitStructure.CAN_BS2=CAN_BS2_8tq;         //ʱ¼ä¶Î2Ϊ7¸öʱ¼äµ¥Ôª
  CAN_InitStructure.CAN_Prescaler=4;                 //500Kbps
        CAN_Init(CAN2, &CAN_InitStructure);
       
        CAN_FilterInitStructure.CAN_FilterNumber=14;         //Ö¸¶¨³õʼ»¯µÄ¹ýÂËÆ÷±àºÅΪ0     £¨0~13£©
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;         //±êʶ·ûÆÁ±Îλģʽ
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //1¸ö32λµÄ¹ýÂËÆ÷
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;         //É趨¹ýÂËÆ÷µÄ±êʶ·û£¨32λΪÆä¸ß¶Î£¬16λΪµÚÒ»¸ö£©·¶Î§ÊÇ0x0000~0xffff
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;         //É趨¹ýÂËÆ÷µÄ±êʶ·û£¨32λΪÆäµÍ¶Î£¬16λΪµÚ¶þ¸ö£©·¶Î§ÊÇ0x0000~0xffff
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;        //É趨¹ýÂËÆ÷ÆÁ±Î±êʶ·û»òÕß¹ýÂ˱êʶ·û
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;   //É趨¹ýÂËÆ÷ÆÁ±Î±êʶ·û»òÕß¹ýÂ˱êʶ·û        ¹ýÂ˵ıêʶ·û¶¼Îª0˵Ã÷ËùÓеİü¶¼½ÓÊÕ
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;        //¹ýÂËÆ÷FIFOÖ¸Ïò¹ýÂËÆ÷0          FIFOÓÐÁ½×éÒ»ÖÖÊǵÚ0×飬һÖÖÊǵÚ1×é¡£
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;        //ʹÄܹýÂËÆ÷
  CAN_FilterInit(&CAN_FilterInitStructure);
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-9-12
在线时间
2 小时
 楼主| 发表于 2017-2-22 18:09:46 | 显示全部楼层
发送函数
u8 Can_Send_Msg11(u8* TxM,u8 len)
{       
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  TxMessage.StdId=0x11;                                                         // ±ê×¼±êʶ·ûΪ0
  TxMessage.ExtId=0x12;                                                                 // ÉèÖÃÀ©Õ¹±êʾ·û£¨29룩
  TxMessage.IDE=0;                                                                                 // ʹÓÃÀ©Õ¹±êʶ·û
  TxMessage.RTR=0;                                                                                 // ÏûÏ¢ÀàÐÍΪÊý¾ÝÖ¡£¬Ò»Ö¡8λ
  TxMessage.DLC=len;                                                                         // ·¢ËÍÁ½Ö¡ÐÅÏ¢
  for(i=0;i<len;i++)
  TxMessage.Data[i]=TxM[i];                                                 // &#181;&#218;&#210;&#187;&#214;&#161;&#208;&#197;&#207;&#162;         
  mbox= CAN_Transmit(CAN2, &TxMessage);   
  i=0;
  while((CAN_TransmitStatus(CAN2, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;        //&#181;&#200;&#180;&#253;·&#162;&#203;&#205;&#189;á&#202;&#248;
  if(i>=0XFFF)return 1;
  return 0;               
}

接收函数
u8 Can1_Receive_Msg(u8 *RxM)
{
        CanRxMsg RxMessage;
        static int i=0;
        if( CAN_MessagePending(CAN2,CAN_FIFO0)==0)return 0;                //&#195;&#187;&#211;&#208;&#189;&#211;&#202;&#213;&#181;&#189;&#202;&#253;&#190;&#221;,&#214;±&#189;&#211;&#205;&#203;&#179;&#246;
        CAN_Receive(CAN2, CAN_FIFO0, &RxMessage);                                                                //&#182;&#193;&#200;&#161;&#202;&#253;&#190;&#221;       
        LED4_On();
        return 1;
}
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-9-12
在线时间
2 小时
 楼主| 发表于 2017-2-22 18:10:06 | 显示全部楼层
KEIL复制过来的...好像中文有些问题...
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-9-12
在线时间
2 小时
 楼主| 发表于 2017-2-22 18:56:04 | 显示全部楼层
测了一下,把PB5 PB6用成简单的推挽输出,无法控制输出高低。
用寄存器和库函数都试过了。
但是配置成CAN模式的时候,两个引脚均为高。
是否是IO损坏了?先前的确将一个原先供电应该为3.3V的CAN收发芯片的收发端接在上面,也是一直无法通信。下午刚换成TJA1050的。这个芯片的位置原本是5V供电的。是否是因为这个原因打坏了IO口?
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-9-12
在线时间
2 小时
 楼主| 发表于 2017-2-22 19:41:06 | 显示全部楼层
换了个芯片,目前两个IO可控,但是仍然无法收发CAN信号。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-2-22 22:32:34 | 显示全部楼层
先测试下不重映射是否可以用?如果不重映射都不能用,那就是CAN基本配置都还有问题
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-9-12
在线时间
2 小时
 楼主| 发表于 2017-2-23 00:03:35 | 显示全部楼层
正点原子 发表于 2017-2-22 22:32
先测试下不重映射是否可以用?如果不重映射都不能用,那就是CAN基本配置都还有问题

主要是现在板子是设计好的,所以可能没法在同一块板子上测试。
不过这段代码原本是在不重映射的情况下使用没问题的,然后加入了AFIO的使能和remap的config函数,改了IO的引脚而已。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-4-11
在线时间
8 小时
发表于 2017-2-23 11:27:24 | 显示全部楼层
没有漏掉匹配电阻吧,我看下我的107双路配置(我在用stm32f107的 双can 目前没有遇见收发问题)
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-4-11
在线时间
8 小时
发表于 2017-2-23 11:39:14 | 显示全部楼层
QQ图片20170223113652.png

你的函数配置的有问题 两路can似乎没有配置 fifo 或者配置的是一路fifo

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-2-23 20:11:47 | 显示全部楼层
Monoposto 发表于 2017-2-23 00:03
主要是现在板子是设计好的,所以可能没法在同一块板子上测试。
不过这段代码原本是在不重映射的情况下使 ...

飞线。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-2-23 20:12:04 | 显示全部楼层
Monoposto 发表于 2017-2-23 00:03
主要是现在板子是设计好的,所以可能没法在同一块板子上测试。
不过这段代码原本是在不重映射的情况下使 ...

如果不重映射可以,说明就是重映射没配置好了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 16:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表