本帖最后由 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了
|