• [MicroPython]TPYBoard v102 CAN总线通信


    0x00前言

      CAN是控制器局域网络(Controller Area Network, CAN)的简称,是ISO国际标准化的串行通信协议。CAN总线结构简单,只需2根线与外部相连,并且内部集成了错误探测和管理模块。
      本篇文章以TPYBoard v102开发板为例,为大家介绍一下如何使用STM32自带的CAN控制器,来实现两个开发板之间的CAN通讯。

    0x01实验器材

    TPYBoard v102 开发板 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
    看一下官方的实例代码,这些基本上够用了。

      from  pyb import CAN
      can  = CAN(1, CAN.LOOPBACK)
      can.setfilter(0,  CAN.LIST16, 0, (123, 124, 125, 126))  #  set a filter to receive messages with id=123, 124, 125 and 126
      can.send('message!',  123)   # send a message with id 123
      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源代码

    第一个板子等待接收,当接收到数据再发送。

      import  pyb
      from  pyb import CAN
       
      can  = CAN(1, CAN.NORMAL)
      can.setfilter(0,  CAN.LIST16, 0, (123, 124, 125, 126))  #  set a filter to receive messages with id=123, 124, 125 and 126
      while  True:
          if can.any(0):
              data=can.recv(0)            # receive message on FIFO 0
              print('DATA:',data)
              can.send(b'message1',222)
      


    第二板子是先发送,然后等待接收。

      #  main.py -- put your code here!
      from  pyb import CAN
      can  = CAN(2, CAN.NORMAL)
      can.setfilter(0,  CAN.LIST16, 0, (222,221,231,241))  #  set a filter to receive messages with id=123, 124, 125 and 126
      can.send('message!',  123)   # send a message with id 123
      while  True:
          if can.any(0):
              data=can.recv(0)            # receive message on FIFO 0
              print('DATA:',data)
      



    0x05效果图

  • 相关阅读:
    Luogu4433:[COCI2009-2010#1] ALADIN(类欧几里德算法)
    Bzoj4766: 文艺计算姬(Matrix-tree/prufer)
    Bzoj5019: [Snoi2017]遗失的答案
    [HAOI2009]逆序对数列(加强)
    CF850F Rainbow Balls
    Luogu4887 第十四分块(前体)
    Luogu2483 [SDOI2010]魔法猪学院(可并堆)
    导数积分表
    Bzoj2395: [Balkan 2011]Timeismoney(最小乘积生成树)
    Min_25筛
  • 原文地址:https://www.cnblogs.com/xxosu/p/9758809.html
Copyright © 2020-2023  润新知