查看: 11735|回复: 3

[S32] NXP官网S32K144 Flexcan例程的bug!!

[复制链接]

该用户从未签到

3

主题

15

帖子

1

注册会员

Rank: 2

积分
117
最后登录
2022-6-26
发表于 2018-6-29 16:10:44 | 显示全部楼层 |阅读模式
本帖最后由 wjandsq 于 2018-6-29 16:17 编辑

/*
* @brief: Send data via CAN to the specified mailbox with the specified message id
* @param mailbox   : Destination mailbox number
* @param messageId : Message ID
* @param data      : Pointer to the TX data
* @param len       : Length of the TX data
* @return          : None
*/
void SendCANData(uint32_t mailbox, uint32_t messageId, uint8_t * data, uint32_t len)
{
    /* Set information about the data to be sent
     *  - 1 byte in length
     *  - Standard message ID
     *  - Bit rate switch enabled to use a different bitrate for the data segment
     *  - Flexible data rate enabled
     *  - Use zeros for FD padding
     */
    flexcan_data_info_t dataInfo =
    {
            .data_length = len,
            .msg_id_type = FLEXCAN_MSG_ID_STD,
            .enable_brs  = true,
            .fd_enable   = true,
            .fd_padding  = 0U
    };
    /* Configure TX message buffer with index TX_MSG_ID and TX_MAILBOX*/
    FLEXCAN_DRV_ConfigTxMb(INST_CANCOM1, mailbox, &dataInfo, messageId);
    /* Execute send non-blocking */
    FLEXCAN_DRV_Send(INST_CANCOM1, mailbox, &dataInfo, messageId, data);
}
这个发送函数,似乎没有问题,但进入SDK函数FLEXCAN_DRV_ConfigTxMb中,看到

/*FUNCTION**********************************************************************
*
* Function Name : FLEXCAN_DRV_ConfigTxMb
* Description   : Configure a Tx message buffer.
* This function will first check if RX FIFO is enabled. If RX FIFO is enabled,
* the function will make sure if the MB requested is not occupied by RX FIFO
* and ID filter table. Then this function will set up the message buffer fields,
* configure the message buffer code for Tx buffer as INACTIVE, and enable the
* Message Buffer interrupt.
*
* Implements    : FLEXCAN_DRV_ConfigTxMb_Activity
*END**************************************************************************/
status_t FLEXCAN_DRV_ConfigTxMb(
    uint8_t instance,
    uint8_t mb_idx,
    const flexcan_data_info_t *tx_info,
    uint32_t msg_id)
{
    DEV_ASSERT(instance < CAN_INSTANCE_COUNT);
    DEV_ASSERT(tx_info != NULL);
    flexcan_msgbuff_code_status_t cs;
    CAN_Type * base = g_flexcanBase[instance];
    /* Initialize transmit mb*/
    cs.dataLen = tx_info->data_length;
    cs.msgIdType = tx_info->msg_id_type;
    if (tx_info->is_remote)
    {
        cs.code = (uint32_t)FLEXCAN_TX_REMOTE;
    }
    else
    {
        cs.code = (uint32_t)FLEXCAN_TX_INACTIVE;
    }
    return FLEXCAN_SetTxMsgBuff(base, mb_idx, &cs, msg_id, NULL);
}



cs.code 数据信息中包含有FLEXCAN_TX_REMOTE和FLEXCAN_TX_INACTIVE的区别,而这个变量在

上层函数根本没有设置!利用 ZLG USBCAN-II 做CAN收发调试,USBCAN-II 发送标准帧数据,
S32K144回复的CAN数据总有个别为远程帧,而将上位程序中的dataInfo.is_remote 变量赋值
为false后(dataInfo.is_remote  = false;),问题解决!


为了避免发生仲裁,can 接收和发送均设置了软件FIFO,为以后能利用CAN-FD,没有使用Flexcan的

硬件FIFO。修改后的 SendCANData 函数如下:


typedef struct {

  uint32_t msgId;                     /*!< Message Buffer ID*/

  uint8_t data[64];                   /*!< Data bytes of the FlexCAN message*/

  uint8_t dataLen;                    /*!< Length of data in bytes */

  flexcan_msgbuff_id_type_t msg_id_type;  /*!< Type of message ID (standard or extended)*/

} flexcan_msg_tx_buf;



/* Flex_CAN Send function ( for Max 64 byte data)*/

status_t SendCANData(uint32_t mailbox, flexcan_msg_tx_buf * can_tx_pstr)

{

  /* Set information about the data to be sent

   *  - 1 byte in length

   *  - Standard message ID

   *  - Bit rate switch enabled to use a different bitrate for the data segment

   *  - Flexible data rate enabled

   *  - Use zeros for FD padding

   */

  flexcan_data_info_t dataInfo;

  dataInfo.data_length = can_tx_pstr->dataLen;

  dataInfo.msg_id_type = can_tx_pstr->msg_id_type;

  dataInfo.enable_brs = false;

  dataInfo.fd_enable  = false;

  dataInfo.fd_padding = 0;

  dataInfo.is_remote  = false;

  status_t result;


  /* Configure TX message buffer with index TX_MSG_ID and TX_MAILBOX*/

  FLEXCAN_DRV_ConfigTxMb(INST_CANCOM1, mailbox, &dataInfo, can_tx_pstr->msgId);


  /* Execute send non-blocking */

  result = FLEXCAN_DRV_Send(INST_CANCOM1, mailbox, &dataInfo, can_tx_pstr->msgId, can_tx_pstr->data);

  return result;

}

修改后的函数测试正常!如下图所示,连续发送32个不同ID的报文,S32K144设置了较大的接收和发送的
软件FIFO,没有丢一个报文。

S32K144_CAN_TEST.jpg


我知道答案 目前已有3人回答
回复

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24924
最后登录
2025-7-23
发表于 2018-7-2 13:29:46 | 显示全部楼层
感谢楼主的经验分享!
回复 支持 反对

使用道具 举报

  • TA的每日心情
    郁闷
    2019-9-19 15:56
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    2

    主题

    20

    帖子

    0

    注册会员

    Rank: 2

    积分
    74
    最后登录
    2019-11-6
    发表于 2019-9-12 16:44:01 | 显示全部楼层
    同样遇到,这个bug居然一直没改吗
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    15

    帖子

    1

    注册会员

    Rank: 2

    积分
    117
    最后登录
    2022-6-26
     楼主| 发表于 2020-7-17 09:36:19 | 显示全部楼层
    本帖最后由 wjandsq 于 2020-7-17 09:46 编辑

    最新的 S32SDK_S32K1xx_RTM_4.0.0.exe 文件解压,得到的源代码,FlexCAN 当前的这个bug 已修复,但目前为止,补丁仍然没有发布。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-24 06:36 , Processed in 0.102287 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表