CAN 通信引脚

近一直在搞CAN调试,目前为止基本的CAN通讯没问题了【查询、中断接收,发送中断】,我使用的是STM32F103RB芯片,软件库函数是V3.4.0——2010-10-15,CAN_TX使用的是PB9,CAN_RX使用的是PB8,但是还是还有几个疑问:

    关于CAN的发送中断,由于入口函数和使能只有一个【分别为USB_HP_CAN1_TX_IRQHandler和USB_HP_CAN1_TX_IRQn】,故这个好理解。但是关于接收中断函数就不一样了,使能的参数有三个【USB_LP_CAN1_RX0_IRQn、CAN1_RX0_IRQn和CAN1_RX1_IRQn】,当然相关的接收中断函数也有三个【USB_LP_CAN1_RX0_IRQHandler、CAN1_RX0_IRQHandler和CAN1_RX1_IRQHandler】。
     
    在网上查了查区别,目前只有USB_LP_CAN1_RX0_IRQn、CAN1_RX0_IRQn和CAN1_RX1_IRQn的阐述:
       一、如果你用的CAN引脚是PA11和PA12,接收中断用USB_LP_CAN1_RX0_IRQn。如果CAN引脚用的是PB8和PB9,也就是用重定义的引脚,接收中
           断用CAN1_RX1_IRQn。你可以看下手册中的引脚说明,PA11和PA12也是USB的引脚,所以IAR在起名字时用了USB_LP_CAN1_RX0_IRQn。
       二、“如果你用的CAN引脚是PA11和PA12,接收中断用CAN1_RX0_IRQn。如果CAN引脚用的是PB8和PB9,也就是用重定义的引脚,接收中断
           用CAN1_RX1_IRQn。由于PA11和PA12也是USB的引脚,所以非互联型且带CAN控制器的微控制器的库文件在起名字时用了USB_LP_CAN1_RX0_IRQn。”
       三、STM32有2个3级深度的接收缓冲区:FIFO0和FIFO1,每个FIFO都可以存放3个完整的报文,它们完全由硬件来管理。如果是来自FIFO0的接收中
           断,则用CAN1_RX0_IRQn中断来处理。如果是来自FIFO1的接收中断,则用CAN1_RX1_IRQn中断来处理。在CAN的初始化配置过程中,
           用CAN_FilterFIFOAssignment来选择要使用FIFO。

       注:CAN1_RX0_IRQn只有在STM32F10X_CL【互联型产品stm32f105/107系列】产品中使用。

  我目前的中断程序条件是:CAN使用PB口,二中断函数用的是USB_LP_CAN1_RX0_IRQn使能的中断函数USB_LP_CAN1_RX0_IRQHandler;而CAN1_RX0_IRQHandler函数在启动函数内部根本就没有这个函数,相关的使用CAN1_RX0_IRQn也没有定义;CAN1_RX1_IRQn使能的CAN1_RX1_IRQHandler中断函数是进不了中断的。
  疑惑:
  A、这样的话跟“一”矛盾,我的PB口也能使用USB_LP_CAN1_RX0_IRQn,而却使用不了CAN1_RX1_IRQn;
  B、跟“二”也矛盾;
  C、跟三也矛盾,我虽然使用的是FIFO0,但是CAN1_RX0_IRQn只在互联型产品中使用;

因此想弄明白:CAN1_RX0_IRQn、CAN1_RX1_IRQn、CAN1_SCE_IRQn和USB_LP_CAN1_RX0_IRQn的区别?
   

   望高人不啬指点!

   万分感谢!!!




“如果你用的CAN引脚是PA11和PA12,接收中断用CAN1_RX0_IRQn。如果CAN引脚用的是PB8和PB9,也就是用重定义的引脚,接收中断用CAN1_RX1_IRQn。由于PA11和PA12也是USB的引脚,所以非互联型且带CAN控制器的微控制器的库文件在起名字时用了USB_LP_CAN1_RX0_IRQn。”

   以上内容参考于网络,后经证实,以上说法是不正确的,理由如下:

    STM32有2个3级深度的接收缓冲区:FIFO0和FIFO1,每个FIFO都可以存放3个完整的报文,它们完全由硬件来管理。如果是来自FIFO0的接收中断,则用CAN1_RX0_IRQn中断来处理。如果是来自FIFO1的接收中断,则用CAN1_RX1_IRQn中断来处理。在CAN的初始化配置过程中,用CAN_FilterFIFOAssignment来选择要使用FIFO。

示例如下:

1. 配置过滤器
 CAN_FilterInitStructure.CAN_FilterNumber = 0;

 CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;

   CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;

 CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;

 CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;

 CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
 
 CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;

 CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;   //关联FIFO0

 CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;

 CAN_FilterInit(&CAN_FilterInitStructure);

 
 CAN_FilterInitStructure.CAN_FilterNumber = 14;

 CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 1;   //关联FIFO1

 CAN_FilterInit(&CAN_FilterInitStructure);

 

2. 开启CAN中断

     

   CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);

   CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE);
 

     

   CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);

   CAN_ITConfig(CAN2, CAN_IT_FMP1, ENABLE);

 

3. 中断处理函数


void CAN1_RX0_IRQHandler(void)

{
        CAN_Receive(CAN1, CAN_FIFO0, &CAN1_RxMsg);

 //
}


void CAN1_RX1_IRQHandler(void)

{
        CAN_Receive(CAN1, CAN_FIFO1, &CAN1_RxMsg);

        //
}

void CAN2_RX0_IRQHandler(void)

{

        CAN_Receive(CAN2, CAN_FIFO0, &CAN2_RxMsg);
       //
}


void CAN2_RX1_IRQHandler(void)

{
        CAN_Receive(CAN2, CAN_FIFO1, &CAN2_RxMsg);
        //
}

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CAN 是什么? CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO *1 国际标准化的串行通信协议。 在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统 被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很 多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个 LAN,进行大量数据的高速通信”的需 要,1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。此后,CAN 通过 ISO11898 及 ISO11519 进 行了标准化,现在在欧洲已是汽车网络的标准协议。 现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。 图 1 是车载网络的构想示意图。CAN 等通信协议的开发,使多种 LAN 通过网关进行数据交换得以实现。 CAN ~ 125 kbps CAN 125kbps CAN 500kbps 马达 马达 空调 子网 ● LIN 2.4~19.2kbps 仪表板 遥控门 锁 遥控门 锁 车身部 信息部 ●MOST ●1394 引爆管 传感器 安全部 子网 ● Safe- by -Wire (150kbps) 车门 制动 子网 ● ●FlexRay * 2 (5Mbps) 胎压 故障诊断部 ● CAN(规格) 诊断工具 网关 开关 开关 转向 发动机・ 传动部 自动变 速箱 CAN 500kbps 前大灯 窗电动 组合灯 自适应 前灯 自适应 前灯 音视频 MD/CD 碟盒 底盘部 白线检测 雷达 ITS部 发动机 交通信 息导航 马达 电子防 盗系统 气囊控制 乘客检测 自适应 巡航 图 1. 车载网络构想 【注】 *1 ISO: International Organization for Standardization (国际标准化组织) *2 FlexRay TM 为戴姆勒克莱斯勒公司注册商标。 应用手册 Page 3 of 48 3.1 CAN 的应用示例 图 2 为 CAN 的应用示例 Climate Control Cluster Engine Seat Door Roof ? Motor control ? Center unit ? Cluster control ? Wiper control ? Winker control ? Car audio ? Light control ? Column switch ? Automobile phone ? Sensor ? Motor control ? Passenger detection ? Switch control ? Side mirror ? Door lock ? Power window ? Door switch ? Rain sensor ? Sunroof : CAN bus: 500kbps : CAN bus: 125kbps : LIN bus: 19.2kbps/9.6kbps : CAN unit / LIN master units : CAN unit / LIN master units : LIN slave unit 图 2. CAN 的应用示例 应用手册 Page 4 of 48 3.2 总线拓扑图 CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发 送方通过使总线电平发生变化,将消息发送给接收方。 图 3 是 CAN 的连接示意图 … 收发器 收发器 CAN H CAN L RxD TxD RxD TxD CAN H CAN L ABS SAS CAN Controller CPU ETM ECM DDM PDM …
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值