基于树莓派3的CAN总线编程

本文介绍了如何在树莓派3B上通过Python使用SPI接口的MCP2515模块进行CAN总线通信。详细阐述了环境搭建步骤,包括安装Raspbian、启用SPI和Python相关库。提供mcp2515.py和mcp2515_run.py两个源代码文件,支持命令行交互式发送和接收CAN数据,以及查看帮助和退出功能。
摘要由CSDN通过智能技术生成

简介

树莓派3使用Python控制SPI接口的MCP2515 CAN模块。实现命令行控制CAN的收发。

github地址
接线图

环境搭建

  1. Raspiberry Pi Model 3B 安装Raspbian,并使能SPI功能(默认关闭)
  2. python2.7
  3. spidev-3.2(如有更新,下载最新版本)
  4. MCP2515模块(SPI接口)

使用说明

共mcp2515.py和mcp2515_run.py两个文件,放在同一目录下,运行mcp2515_run.py。

演示
如上图所示,命令行支持如下命令:
mcp -init //初始化,自动调用
mcp -w 1 2 3 //发送数据,这里发送了3个字节:0x01,0x02,0x03
mcp -r //读取接收缓冲区,示例中没有收到数据,为空
help //帮助信息
exit //退出命令行

源代码

mcp2515_run.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import spidev,time
import sys,cmd,shlex,types
from mcp2515 import *

spi = spidev.SpiDev(0,0)

def mcp2515_reset():
    tmpc = [0xc0]
    spi.writebytes(tmpc)

def mcp2515_writeReg(addr, val):
    buf = [0x02, addr, val]
    spi.writebytes(buf)

def mcp2515_readReg(addr):
    buf = [0x03, addr, 0x55]
    buf = spi.xfer2(buf)
    return int(buf[2])

def mcp2515_init():
    mcp2515_reset()
    time.sleep(2)
    #设置波特率为125Kbps
    #set CNF1,SJW=00,长度为1TQ,BRP=49,TQ=[2*(BRP+1)]/Fsoc=2*50/8M=12.5us
    mcp2515_writeReg(CNF1,CAN_125Kbps);
    #set CNF2,SAM=0,在采样点对总线进行一次采样,PHSEG1=(2+1)TQ=3TQ,PRSEG=(0+1)TQ=1TQ
    mcp2515_writeReg(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);
    #set CNF3,PHSEG2=(2+1)TQ=3TQ,同时当CANCTRL.CLKEN=1时设定CLKOUT引脚为时间输出使能位
    mcp2515_writeReg(CNF3,PHSEG2_3TQ);

    mcp2515_writeReg(TXB0SIDH,0xFF)#发送缓冲器0标准标识符高位
    mcp2515_writeReg(TXB0SIDL,0xEB)#发送缓冲器0标准标识符低位(第3位为发送拓展标识符使能位)
    mcp2515_writeReg(TXB0EID8,0xFF)#发送缓冲器0拓展标识符高位
    mcp2515_writeReg(TXB0EID0,0xFF)#发送缓冲器0拓展标识符低位

    mcp2515_writeReg(RXB0SIDH,0x00)#清空接收缓冲器0的标准标识符高位
    mcp2515_writeReg(RXB0SIDL,0x00)#清空接收缓冲器0的标准标识符低位
    mcp2515_writeReg(RXB0EID8,0x00)#清空接收缓冲器0的拓展标识符高位
    mcp2515_writeReg(RXB0EID0,0x00)#清空接收缓冲器0的拓展标识符低位
    mcp2515_writeReg(RXB0CTRL,0x40)#仅仅接收拓展标识符的有效信息
    mcp2515_writeReg(RXB0DLC,DLC_8)#设置接收数据的长度为8个字节

    mcp2515_writeReg(RXF0SIDH,0xFF)#配置验收滤波寄存器n标准标识符高位
    mcp2515_writeReg(RXF0SIDL,0xEB)#配置验收滤波寄存器n标准标识符低位(第3位为接收拓展标识符使能位)
    mcp2515_writeReg(RXF0EID8,0xFF)#配置验收滤波寄存器n拓展标识符高位
    mcp2515_writeReg(RXF0EID0,0xFF)#配置验收滤波寄存器n拓展标识符低位

    mcp2515_writeReg(RXM0SIDH,0xFF)#配置验收屏蔽寄存器n标准标识符高位
    mcp2515_writeReg(RXM0SIDL,0xE3)#配置验收屏蔽寄存器n标准标识符低位
    mcp2515_writeReg(RXM0EID8,0xFF)#配置验收滤波寄存器n拓展标识符高位
    mcp2515_writeReg(RXM0EID0,0xFF)#配置验收滤波寄存器n拓展标识符低位

    mcp2515_writeReg(CANINTF,0x00)#清空CAN中断标志寄存器的所有位(必须由MCU清空)
    mcp2515_writeReg(CANINTE,0x01)#配置CAN中断使能寄存器的接收缓冲器0满中断使能,其它位禁止中断

    mcp2515_writeReg(CANCTRL,REQOP_NORMAL|CLKOUT_ENABLED)#将MCP2515设置为正常模式,退出配置模式

    #tmpc = mcp2515_readReg(CANSTAT)#读取CAN状态寄存器的值
    #tmpd = int(tmpc[0]) & 0xe0
    #if OPMODE_NORMAL!=tmpd:#判断MCP2515是否已经进入正常模式
    #    mcp2515_writeReg(CANCTRL,REQOP_NORMAL|CLKOUT_ENABLED)#再次将MCP2515设置为XX模式,退出配置模式
    print '\r\nMCP2515 Initialized.\r\n'


def mcp2515_write(buf):
    for i in range(50):
        time.sleep(2) #通过软件延时约nms(不准确)
        if not mcp2515_readReg(TXB0CTRL)&0x08:#快速读某些状态指令,等待TXREQ标志清零
            break
    N = len(buf)
    for j in range(N):
        mc
  • 8
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值