使用 MicroPython 开发 STM32F407 的 CAN 总线

首先烧录 .dfu 固件到你自己的开发板上,之后把串口 0 的两个引脚上拉。

// A9 is used for USB VBUS detect, and A10 is used for USB_FS_ID.

不然连接电脑后不会识别。

然后就可以尝试使用 CAN 总线了。我这里使用的是 CAN2(PB12 -> CAN2_RX, PB13-> CAN2_TX)。发送器使用 TJA1050,据说 1050 配合 STM32 使用的时候 1050 的供电需要使用 5V。
代码也很简单。三行就能发送出去了。默认的波特率是 28K。

from pyb import CAN
can = CAN(2, CAN.NORMAL)
can.send('123', 124)  # 第一个变量是数据,第二个是数据包的 ID 。

总线上的数据

更多的功能可以查看官方手册。

CAN 总线的一些东西也一并写到这吧,从各种资料汇总来的。
MPy 中 CAN 总线波特率设置主要有三个参数,默认值为 prescaler=100, bs1=6, bs2=8。pyb.freq() 可以获取 pclk1,即 APB1 bus 的时钟频率。

计算公式

可能有很多个 bs1 和 bs2 满足条件,建议符合下面的式子:


采样点设置

CAN 的报文根据 ID 不同可以分为两种,一种是标准格式(11 位 ID),另一种是扩展格式(29 位 ID)。

报文头部

报文头部有 SOF,帧起始;然后是 ID,之后 RTR = 0 表明是数据帧,= 1 为远程帧,不携带数据,只用作请求;IDE 为 ID 长度,即是标准格式还是扩展格式;随后是一个保留位;数据长度和数据;最后是 CRC,ACK等。

数据长度和数据

CAN 总线自带仲裁,帧ID值越小,发送优先级越高,比如两个节点在同时请求发送,ID 小的那个会优先发送。在帧格式和帧ID都相同情况下,数据帧的优先级比远程帧优先级高。
报文中的数据只有 8 字节。

你可能感兴趣的:(使用 MicroPython 开发 STM32F407 的 CAN 总线)