本帖最后由 xixixihaha 于 2015-10-21 22:31 编辑  
 
在研究用FLEXCAN的同一个MB接收Standard和Extended帧, 
目前在解决了之前帖子提到的FLEXCAN_Read 和 FLEXCAN_Write 的bug后,发现FLEXCAN_Rx_message函数的参数设置不妥。 
对于某一个接收到的MB,其ID Format是由其实际的帧类型决定的,而不应该由入口参数来决定。 
我在实现同一个MB接收Standard和Extended帧时发现,当如果用FLEXCAN_STANDARD 来作为入口,则接收到的EXTENDED消息返回ID不正确,而当用FLEXCAN_EXTENDED 来作为入口,则接收到的STANDARD消息返回ID不正确。但这个Format信息其实是由MessageBuffer中的IDE位来决定的。 
所以format应该设置为[out]类型, 
函数应该声明为 
uint32_t FLEXCAN_Rx_message( uint8_t dev_num, uint32_t mailbox_number, uint32_t *identifier, uint32_t *format, uint32_t *data_len_code, void *data, uint32_t int_enabled)  
代码应该修改为 在如下注释语句后加入format赋值,并将format判断修改为 *format 
   /* store data len */ 
   *format = can_reg_ptr->MB[mailbox_number].CS & CAN_CS_IDE_MASK?FLEXCAN_EXTENDED:FLEXCAN_STANDARD; 
   dlen = can_reg_ptr->MB[mailbox_number].CS & CAN_CS_DLC_MASK; 
   DLC = dlen >> CAN_CS_DLC_SHIFT; 
 
   /* Reassemble the message ID */ 
   switch (*format) 
 
这样函数就可以返回MB中接收的帧的正确类型,且返回正确的ID了 
 
 
        
        
        
         |