极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11579|回复: 0

MicroPython教程之TPYBoard v102 CAN总线通信

[复制链接]
发表于 2017-10-25 14:08:55 | 显示全部楼层 |阅读模式
  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/late ... /?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效果图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 07:52 , Processed in 0.043267 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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