walnutcy

STM32 的CAN 应用

0
阅读(2084)

目前还只是在使用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;

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

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

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

从而实现双结点的通信.

最后完成协议的应用层.