CAN类 –控制器区域网络通信总线¶
CAN实施标准CAN通信协议。其物理层包括两道线:RX和TX。注意:将pyboard或OpenMV Cam与CAN总线连接时,您必须使用来CAN传输器将来自的CAN逻辑信号转换为总线上正确的电压等级。
构造函数¶
方法¶
-
CAN.init(mode, extframe=False, prescaler=100, *, sjw=1, bs1=6, bs2=8)¶ 使用给定参数初始化CAN总线:
mode为下列之一:NORMAL, LOOPBACK, SILENT, SILENT_LOOPBACK- 若
extframe为True,总线使用框架(29位)中的扩展标识符;否则使用标准的11位标识符。 prescaler用于设置1时间量的持续时长;时间量为分配器分割的输入时钟(PCLK1,见 pyb.freq() )。sjw是以时间量计的同步跳转宽度;数值可为1、2、3、4。bs1以时间量为单位定义了样本点的位置;该数值介于1-1024间。bs2以时间量为单位定义了传输点的位置;该数值介于1-16间。
时间量(tq)是CAN总线的基本时间单位。Tq即CAN预分频器值除以PCLK1(内部外围总线1的频率);确定PCLK1,详见 pyb.freq() 。
一个位是由同步段组成的,通常即为1时间量。然后是位段1,位段2。样本点在位段1结束后。传输点在位段2结束后。波特率是二进时间,位时间即1 + BS1 + BS2与tq的乘积。
例:当PCLK1=42MHz,prescaler=100,sjw=1,bs1=6,bs2=8,tq值为2.38微秒。位时间为35.7微秒,波特率为28kHz。
-
CAN.deinit()¶ 关闭CAN总线。
-
CAN.setfilter(bank, mode, fifo, params, *, rtr)¶ 配置一个滤波器组:
bank是将被配置的滤波器组。mode是滤波器运行的模式。fifo是fifo (0 or 1)信息储存的位置,前提是滤波器接受该信息。params是一组定义滤波器的值。该组值取决于mode参数。
rtr是一组布尔数组,该数组规定过滤器是否应接受远程传输请求消息。若该参数未给出,则默认所有条目为False。这一数组的长度取决于 mode 参数。
-
CAN.clearfilter(bank)¶ 清空并禁用一个滤波器组:
bank是将被清空的滤波器组。
-
CAN.any(fifo)¶ 若有消息在FIFO上等待,则返回
True;若无,则返回False。
-
CAN.recv(fifo, *, timeout=5000)¶ 在总线上接收数据:
fifo是一个整数,FIFO即在此接收。timeout是以毫秒计的等待接收的超时时长。
返回值:包含4个值的元组
- 消息的id。
- 一个表明消息是否是RTR消息的布尔值。
- FMI值(过滤器匹配指数)。
- 一个包含数据的数组。.
-
CAN.send(data, id, *, timeout=0, rtr=False)¶ 在总线上发送消息:
data是发送的数据(发送一个整数或一个缓冲区对象)。id是所发送的消息的id。timeout是以毫秒计的等待发送的超时时长。rtr是一个指定消息是否应该作为远程传输请求发送的布尔值。若rtr为True ,则只使用data长度来填充框架的DLC插槽,
而不使用
data中的实际字节。若暂停时间为0,消息则置于三个硬件缓冲区中的其中一个,该方法立即返回。若三个缓冲区都被占用,则会引发异常。若暂停时间不为0,该方法会等待消息传输完毕。若该消息不能在指定时间内传输,则会引发异常。
返回值:
None.
-
CAN.rxcallback(fifo, fun)¶ 当空FIFO接收消息时,注册一个回调函数:
fifo是接收的FIFO。fun是FIFO变为非空时要调用的函数。
回调函数有两个参数:一个是CAN对象本身,一个是表明回调原因的整数。
回调用法示例:
def cb0(bus, reason): print('cb0') if reason == 0: print('pending') if reason == 1: print('full') if reason == 2: print('overflow') can = CAN(1, CAN.LOOPBACK) can.rxcallback(0, cb0)