walnutcy

STM32 的CAN 应用

0
阅读(2067)

目前还只是在使用loopback模式测试,

使用的是ST提供的测试代码的基础上做了简单修改,

这里主要提下我使用的结构体:

应用层数据包:

typedef struct
{
u32 id; /* 标识符 ide==Ext,id为29位,ide==std,id为11位 */
u8 ide; /* 扩展帧标识 1:Ext, 0:std */
u8 rtr; /* 远程帧标识 1:rtr, 0:data*/
u8 len; /* Data length */
u8 dat[8];
}CAN_APP_PACK;

接收队列:

/* 定义:兼容2.0 A与2.0 B协议 */
typedef struct
{
u32 id; /* r31-r21: std-ID, r20-r3: ext-ID, r2:IDE, r1:RTR, r0:resv */
u8 len; /* Data length */
u32 dataL; /* Data3, Data2, Data1, Data0 */
u32 dataH; /* Data7, Data6, Data5, Data4 */
}CAN_TRANS_PACK;

typedef struct
{
u8 head; /* 队列前指针 */
u8 trail; /* 队列底指针 */
CAN_TRANS_PACK data[CAN_TRANS_MAX_NUM];
}CAN_TRANS_RX_LIST;

采用中断接收, 收到数据后先存入接收队列,

然后主任务中定时查询处理..

接下来的任务就是研究下波特率设置,过滤器设置等,

从而实现双结点的通信.

最后完成协议的应用层.

Baidu
map