首先来看一下接收:
接收到的报文,被存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文。
因为它有多少组Filter来着?所以,我现在就是要看到来自OBD模拟器的数据。
- 我要全部接收,是不是关掉Filter就好了?看不到全部接收的数据,
- STANDARD_FORMAT和EXTENDED_FORMAT分别是什么?8个Byte就是标准格式
- DATA_FRAME和REMOTE_FRAME分别是什么?
- 我要的数据呢?就那8个字节
- 配置文件在哪里被存储?在哪里被读取?
- CAN数据要进过Filter匹配了才能被收到
/* CAN message object structure */
typedef struct {
U32 id; /* 29 bit identifier */
U8 data[8]; /* Data field */
U8 len; /* Length of data field in bytes */
U8 ch; /* Object channel */
U8 format; /* 0 - STANDARD, 1 - EXTENDED IDENTIFIER */
U8 type; /* 0 - DATA FRAME, 1 - REMOTE FRAME */
} CAN_msg;
后来找到了问题:
1我用以下配置可以读到所有ID的帧
#if 0/*cantestonly*/
//ÅäÖùýÂËÆ÷
CAN_FilterInitStructure.CAN_FilterNumber=0; //¹ýÂËÆ÷0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32λ
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32λID
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32λMASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//¹ýÂËÆ÷0¹ØÁªµ½FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //¼¤»î¹ýÂËÆ÷0
CAN_FilterInit(&CAN_FilterInitStructure);//Â˲¨Æ÷³õʼ»¯
#endif
4,调试技巧,1可以查看CAN的第二个寄存器,有RX和RX samp位变化说明有采样到信号;2,R0FR可以看到收了几个帧,00到11个,以及溢出,等信息,3有一个寄存器可以看到帧ID,有一个寄存器可以看到该ID下面的数据。8个字节
未完待续!