爱板网论坛

查看: 149|回复: 0

[资料] MicroPython教程之TPYBoard v102 CAN总线通信

[复制链接]

51

主题

0

好友

698

积分

举人

Rank: 4

  • TA的每日心情
    开心
    2016-9-7 16:50
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2017-10-25 13:50:59 |显示全部楼层
      0x00前言

      CAN是控制器局域网络(ControllerAreaNetwork,CAN)的简称,是ISO国际标准化的串行通信协议。CAN总线结构简单,只需2根线与外部相连,并且内部集成了错误探测和管理模块。

      本篇文章以TPYBoardv102开发板为例,为大家介绍一下如何使用STM32自带的CAN控制器,来实现两个开发板之间的CAN通讯。

      0x01实验器材

      TPYBoardv102开发板2块

      杜邦线若干

      CAN总线收发器模块VP230(SN65HVD230)2个

      0x02前期准备

      1.        TPYBoardv102的CAN控制器。

      v102上有两个CAN控制器,分别为CAN1和CAN2,对应引脚如下:

      
    CAN1(RX)
      
    Y3
    CAN1(TX)
    Y4
    CAN2(RX)
    Y5
    CAN2(TX)
    Y6

      v102上虽然已经有两个CAN控制器,但是想要完成两个板子之间的CAN通讯,还需要搭配CAN收发器模块。CAN收发器就是CAN控制器和物理总线之间的接口,主要作用就是将CAN控制器的逻辑电平转换为CAN总线的差分电平,在两条有差分电压的总线电缆上传输数据。

      2.        去tpyboard的官网看看CAN类库的介绍。

      http://docs.tpyboard.com/zh/latest/library/pyb.CAN/?highlight=pyb.CAN

      看一下官方的实例代码,这些基本上够用了。
    1. from pyb import CAN
    2. can = CAN(1, CAN.LOOPBACK)
    3. can.setfilter(0, CAN.LIST16, 0, (123, 124, 125, 126))  # set a filter to receive messages with id=123, 124, 125 and 126
    4. can.send('message!', 123)   # send a message with id 123
    5. can.recv(0)                 # receive message on FIFO 0
    复制代码
    0x03硬件连接

      两个v102我用的都是CAN1。具体连接示意图如下:

      
    TPYBoard v102 (CAN1)
      
    CAN收发器模块
    3.3V
    VCC
    GND
    GND
    Y3(RX)
    RX
    Y4(TX)
    TX

      两个收发器之间H接H、L接L即可。

      0x04源代码

      第一个板子等待接收,当接收到数据再发送。
    1. import pyb
    2. from pyb import CAN

    3. can = CAN(1, CAN.NORMAL)
    4. can.setfilter(0, CAN.LIST16, 0, (123, 124, 125, 126))  # set a filter to receive messages with id=123, 124, 125 and 126
    5. while True:
    6.     if can.any(0):
    7.         data=can.recv(0)            # receive message on FIFO 0
    8.         print('DATA:',data)
    9.         can.send(b'message1',222)
    复制代码
    第二板子是先发送,然后等待接收。
    1. # main.py -- put your code here!
    2. from pyb import CAN
    3. can = CAN(2, CAN.NORMAL)
    4. can.setfilter(0, CAN.LIST16, 0, (222,221,231,241))  # set a filter to receive messages with id=123, 124, 125 and 126
    5. can.send('message!', 123)   # send a message with id 123
    6. while True:
    7.     if can.any(0):
    8.         data=can.recv(0)            # receive message on FIFO 0
    9.         print('DATA:',data)
    复制代码
    0x05效果图
    1.png





    回复

    使用道具 举报

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

    关闭

    站长推荐上一条 /2 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-11-21 08:38 , Processed in 0.156549 second(s), 11 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部