HC32 CAN通信
HC CAN简介和ST对比
-
HC CAN
手册里面明确写出有两种不同类型的缓冲器,PTB 优先于STB。这点和ST的不一样。
HC的结构图
-
ST
ST CAN结构借用一下野火的图展示一下
STM32 的有两组 CAN 控制器,其中 CAN1 是主设备,框图中的“存储访问控制器”是由 CAN1 控制的, CAN2 无法直接访问存储区域,所以使用 CAN2 的时候必须使能CAN1 外设的时钟。
波特率设定
CAN 通信使用时钟 can_clk 的时钟源为外部高速振荡器, 使用 CAN 模块之前,需要设定 CAN 通信时钟。下图给出 CAN 位时间定义图,虚线上部分为 CAN 协议规定的位时间, 虚线下部分为本 CAN 控制器 CAN-CTRL 定义的位时间。 其中 segment1 和 segment2 可以通过寄存器 SBT 设定。 SBT 寄存器只能在 CAN_CFG_STAT.RESET=1 即 CAN 软件复位时设定。
注意:HC的CAN的时间片段并不是按照标准的CAN协议制定的。只有seg1和Seg2 两个参数,这个和ST的有不一样。在设置HCseg1 和seg2 的时候还需要满足手册上时间价格的要求,具体如下:
筛选器
CAN_CTRL 提供 16 组 32 位筛选器用于过滤接收到的数据从而降低 CPU 负荷, 筛选器可以支持标准格式 11 位 ID 或者扩展格式 29 位 ID。每组筛选器有一个 32 位 ID CODE 寄存器和一个 32 位 ID MASK 寄存器, ID CODE 寄存器用于比较接收到 CAN ID, 而 ID MASK 寄存器用于选择比较的 CAN ID 位。 对应的 ID MASK 位为 1 时,不比较该位的 ID CODE。
注意: HC的 CODE模式和ST32的基本上一直表示 只有CAN ID和code寄存器里面的一样才会被接收。MASK模式也和ST32的掩码模式类似,进行过滤筛选,值得注意的是ST32的掩码模式相应的位置被设置为1后,进行掩码为的对比,只要掩码(关键字)相同,就符合要求,报文就会被保存到接收 FIFO。 但是HC的掩码模式是相应的掩码位设置为1后,是不对比CAN ID对应的改位的,反而设置为0后才需要和ID进行匹配。即 ST掩码模式设置1的是需要比对的ID位,而HC设置为1的是需要忽略的位。
需要注意的坑
- CAN 的一些设置完全可以参照dll库中提供的配置方式进行为微调。值得注意的是CAN的中断模式是全部打开的,在设计的时候需要先将所有的全部失能,然后再根据自己的需求进行配置。
CAN_IntCmd(TYPE_CANX, CAN_INT_ALL, Disable);
CAN_IntCmd(TYPE_CANX, CAN_INT_RX | CAN_INT_ERR_INT
|XXXXX| XXXXX | XXXXXX,
Enable);
- stc_can_tx_t结构体
typedef struct
{
uint32_t u32ID; /*!< 11 bits standard ID or 29 bits extended ID, depending on IDE. */
union
{
uint32_t u32Ctrl;
struct
{
uint32_t DLC: 4; /*!< Data length code. Length of the data segment of data frame. \
It should be zero while the frame is remote frame. \
This parameter can be a value of @ref CAN_DLC */
uint32_t BRS: 1; /*!< Bit rate switch. */
uint32_t FDF: 1; /*!< CAN FD frame. */
uint32_t RTR: 1; /*!< Remote transmission request bit.
It is used to distinguish between data frames and remote frames. */
uint32_t IDE: 1; /*!< Identifier extension flag.
It is used to distinguish between standard format and extended format.
This parameter can be a 1 or 0. */
uint32_t RSVD: 24; /*!< Re