CAN API Documentation
Contents
Functions
Example
This document describes the CAN API functions
Functions
can.init
Initializes the CAN interface with the specified parameters.
Parameters:
RxPin(default: 1): Receive pin number.TxPin(default: 2): Transmit pin number.Baud(default: 250000): Baud rate.(25000,50000,100000,125000,250000,500000,800000,1000000).Mode(default: 0): CAN mode (e.g., 0-NORMAL, 1-NO ACK,2-LISTEN_ONLY).
Usage: python can.init(RxPin, TxPin, Baud, Mode)
can.deinit
Deinitializes the CAN interface.
Usage: python can.deinit()
can.send
Sends a CAN message.
Parameters:
flags: Message flags.id: Message identifier.dat: Data to send (string or bytes).
Usage: python can.send(flags, id, dat)
can.filter
Sets a CAN filter.
Parameters:
dat: Filter data (string or bytes).single_filter: Boolean indicating if a single filter is used.
Usage: python can.filter(dat, single_filter)
can.any
Checks if any CAN messages are available.
Returns: Integer indicating the presence of messages.
Usage: python can.any()
can.recv
Receives a CAN message.
Returns: Bytes representing the received message.
Usage: python can.recv()
Example
from machine import Pin,UART,Timer,I2C,WDT
from micropython import const
import machine
import time
import can
import binascii
import struct
RxPin=39
TxPin=38
Baud=100000
Mode=0
SendDelay=0
CanSendFlags=0#Extended frame
CanSendId=0
CanSendBuf=''
CanRecBytes=bytes()
CanSendBytes=bytes()
T1S=0
def SetCanFlags(extd,rtr,ss,self_rev,dlc_non_comp):
global CanSendFlags
CanSendFlags=0
if extd:#0-standard frame; 1- Extended frame
CanSendFlags |= 0x01
if rtr:#0- data frame,1-Remote Frame
CanSendFlags |= 0x02
if ss:#0-Error resend; 1-Single send
CanSendFlags |= 0x04
if self_rev:#0- Do not receive messages sent by oneself, 1- Receive messages sent by oneself
CanSendFlags |= 0x08
if dlc_non_comp:#0-Data length not exceeding 8 (ISO 11898-1); 1- Data length greater than 8 (non-standard)
CanSendFlags |= 0x10
def time0_irq(time0):
global CanSendFlags,CanSendId,SendDelay,T1S,CanRecBuf
if T1S<1000:
T1S+=1
else:
T1S=0
if SendDelay:
SendDelay-=1
if SendDelay==0:
CanSendFlags = int.from_bytes(CanRecBytes[0:4], 'little')
CanSendId= int.from_bytes(CanRecBytes[4:8], 'little')
len = CanRecBytes[8]
#CanSendBuf = CanRecBytes[9:9+len].decode('utf-8')
CanSendBytes = CanRecBytes[9:9+len]
#print(CanSendBuf)
#can.send(CanSendId,CanSendBuf)
can.send(CanSendFlags,CanSendId,CanSendBytes)
#can.send(0x123,'12345678')
def CanFilter(acceptance_code,acceptance_mask,single_filter):
dat = acceptance_code.to_bytes(4,'little')
dat += acceptance_mask.to_bytes(4,'little')
can.filter(dat,single_filter)
def setup():
CanFilter(0,0xffffffff,True)
#CanFilter(0xe00001,0x1ffffe,True)
#CanFilter(0xe00000,0x1fffff,False)
#CanFilter(0xe0,0x1f,False)
can.init(RxPin,TxPin,Baud,Mode)
time0=Timer(0)
time0.init(period=1,mode=Timer.PERIODIC,callback=time0_irq)
def loop():
global SendDelay,CanRecBuf,CanRecBytes
print('loop')
while(1):
if can.any():
CanRecBytes = can.recv();
print(CanRecBytes.hex(' '))
SendDelay=200
if __name__=="__main__":
setup()
machine.lightsleep(10)
loop()