This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] IWR1642BOOST:IWR 从器件写入 I2C 总线会导致 DSS:中断问题

Guru**** 2587345 points
Other Parts Discussed in Thread: IWR1642

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/642218/iwr1642boost-iwr-slave-write-to-the-i2c-bus-results-in-critical-error-in-the-dss-interrupts-issue

器件型号:IWR1642BOOST
主题中讨论的其他器件:IWR1642

您好!  

我使用 IWR1642 EVM 作为 I2C 从设备向 Arduino 主控制器发送数据。  

使用 SDK 中提供的 I2C 驱动程序和从站测试、我能够使 IWR 从站向总线写入数据、并在 Arduino 端接收到数据。  

但是、当我调用同一个写入函数时、  

I2CSlave_write (I2CSlave_handle handle、const void * buffer、size_t size) 

在执行毫米波演示期间、在 MSS 内核上、我在 DSS 内核中遇到故障。  

以下是控制台输出上的错误:  

{MODULE#8}:"../DSS_main.c"、第264行:错误{id:0x10000、args:[0x8139b4、0x8139b4]}
xdc.runtime.Error.raise:终止执行

这一行:

/*检查先前的线性调频脉冲处理是否已完成*/
DebugP_assert (gMmwDssMCB.dataPathObj.interFrameProcToken = 0); 

以下是出错期间的调用堆栈:  

我完全不知道为什么会发生这种情况、因为 i2c 写入函数在 MSS 内核上运行。 但是、调用堆栈确实会指向中断发生的错误。 这是因为 DSS 完成帧处理后、它向 MSS 发送中断信号、以便 MSS 可以接收中断、但在 i2c 情况下、i2c 驱动程序处于阻塞模式、因此 MSS 对来自 DSS 的中断没有响应吗? 我将进一步研究这一点、希望您能分享您的观点。

谢谢、  

Herman

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Herman、您好。

    由于 I2C 调用的阻塞性质、该异常可能非常好、也可能是 I2C 接口速度缓慢性质的原因。
    我们将让团队中的某个人重现此场景、并尽快向您发送更多详细信息。

    -Raghu
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、正如 Raghu 提到的、MSS 上的 I2C 调用可能会导致它错过来自 DSS 的握手中断。 I2C 驱动器可配置为以400kHz 运行-您尝试过这种运行还是以默认的100KHz 运行? 您还可以尝试减少发送的数据量、以测试它是否是计时问题。 如果您无法以400kHz 的频率运行并发送所有要发送的数据、您可能能够将传输分解为更小的部分以处理中断调度、或者尝试另一个串行接口(例如 UART 或 SPI)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。

    我已将 I2CSlave_write 函数放入新任务中、这允许代码运行大约1-2分钟、直到出现相同的握手错误。 我在任务优先级方面发挥了作用、但没有成功。

    接下来、当使用7位寻址模式时、I2CSlave_write 函数也返回 false。 (我需要使用7位地址模式来使用 Arduino 的 Wire 库。) 但是、写入函数仍会写入 I2C 总线、并且我看到从 Arduino 打印到控制台的数据。

    我尝试过400kHz 模式、但它似乎不起作用。 我更改了毫米波 SDK I2C 驱动程序中的默认参数、并已在400kHz 模式下配置 Arduino Wire 库、但未成功。 我一次只发送8个字节、因此比特率并不重要。

    最初我想查看 I2C、因为我想运行4个 IWR 从器件。 如果我不能很快使其工作、我一定会研究 SPI。

    有关我的代码的更多信息:

    我从 MSS_main.c 中的 MmwDemo_mssInitTask 调用 I2CSlave_Main 函数 在该文件中、我还使用一些数据更新 txProxObjData 数组、然后发布 I2CSREMHandle 二进制信号量以让 I2C_task 执行写入。  

    以下仅是 I2C 代码:

    /*标准包含文件。 */
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    /* BIOS/XDC 包含文件。 */
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    /*毫米波 SK 包含文件:*/
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    /
    秘书长的报告 全球定义
    (二 /
    #define I2C_TEST_Blocking_mode 1
    
    //全局变量*/
    静态 I2CSlave_handle i2cHandle;
    Semaphore_handle I2CSemHandle;
    uint8_t txProxObjData[8];
    uint8_t txData[8];
    
    int32_t I2CSlave_Main (void);
    
    
    静态 int32_t PlatformInit (void)
    {
    #if (defined (SOC_XWR14XX))
    /*设置 PINMUX 以显示 XWR14xx I2C 引脚*/
    Pinmux_set_OverrideCtrl (SOC_XWR14XX_PINR3_PADAH、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
    Pinmux_Set_FuncSel (SOC_XWR14XX_PINR3_PADAH、SOC_XWR14XX_PINR3_PADAH_I2C_SDA);
    Pinmux_set_OverrideCtrl (SOC_XWR14XX_PINP4_PADAI、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
    Pinmux_Set_FuncSel (SOC_XWR14XX_PINP4_PADAI、SOC_XWR14XX_PINP4_PADAI_I2C_SCL);
    #else
    /*设置 PINMUX 以显示 XWR16xx I2C 引脚*/
    Pinmux_set_OverrideCtrl (SOC_XWR16XX_PINF13_PADAH、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
    Pinmux_Set_FuncSel (SOC_XWR16XX_PINF13_PADAH、SOC_XWR16XX_PINF13_PADAH_I2C_SDA);
    
    Pinmux_set_OverrideCtrl (SOC_XWR16XX_PING14_PADAI、PINMUX_OUTEN_RETAK_HW_CTRL、PINMUX_INPEN_RETAK_HW_CTRL);
    Pinmux_Set_FuncSel (SOC_XWR16XX_PING14_PADAI、SOC_XWR16XX_PING14_PADAI_I2C_SCL);
    #endif
    
    返回0;
    }
    
    静态 int32_t I2CSlave_Init (void)
    {
    I2CSlave_Params i2cParams;
    内部32_t 错误代码= 0;
    uint32_t ARG;
    Semaphore_Params semParams;
    
    Semaphore_Params_init (semParams);
    semParams.mode = Semaphore_Mode_binary;
    I2CSemHandle = Semaphore_create (1、SemParams、NULL);
    
    PlatformInit();
    
    /*设置传输缓冲区*/
    //memset (&rxData、0、sizeof (rxData));
    memset (&txData、0、sizeof (txData));
    memset (&txProxObjData、0、sizeof (txProxObjData));
    
    
    /*初始化 I2C 从驱动程序*/
    I2CSlave_init();
    
    /*初始化 I2C 驱动程序默认参数*/
    I2CSlave_Params_init (&i2cParams);
    
    i2cParams.transferMode = I2CSLAVE_MODE_BLOCKING;
    i2cParams.slaveAddress = 0x48;
    
    /*打开 I2C 从驱动程序*/
    i2cHandle = I2CSlave_open (0、&i2cParams);
    
    if (i2cHandle ==空)
    {
    System_printf ("错误:I2C 驱动程序打开失败\n");
    返回-1;
    }
    //System_printf ("调试:通过 I2C 从设备打开\n");
    
    /*在扩展地址模式下配置 I2C 器件。 *
    ARG = 0;
    错误代码= I2CSlave_control (i2cHandle、I2C_CMD_ADDR_MODE、(void*)&arg);
    如果(错误代码< 0)
    {
    System_printf ("错误:I2C 控制集 XA 失败[错误代码%d]\n"、错误代码);
    返回-1;
    }
    //System_printf ("调试:通过 I2C 从机控制\n");
    返回0;
    }
    
    静态空 I2C_Task (UARg arg0、UARg arg1)
    {
    
    
    if (I2CSlave_Init()< 0);
    {
    System_printf ("错误:I2C Init 故障\n");
    }
    
    while (1)
    {
    Semaphore_pend (I2CSemHandle、BIOS_WAIT_FOREVE);
    memcpy ((void*)(&(txData[0]))、(void*)(&(txProxObjData[0]))、sizeof (txProxObjData));
    //System_printf ("写入前\n");
    /*从机写入*/
    if (I2CSlave_write (i2cHandle、(void*)(&(txData[0]))、sizeof (txData)= false)
    {
    System_printf ("错误:I2C 从设备写入 OK**\n");
    //return -1;
    }
    Task_sleep(10);
    
    }
    
    }
    
    int32_t I2CSlave_Main (void)
    {
    Task_Params 任务参数;
    
    /*初始化任务参数。 *
    Task_Params_init (&taskParams);
    //taskParams.priority = 2;
    taskParams.STACKSIZE = 6*1024;
    Task_create (I2C_Task、&taskParams、NULL);
    
    返回0;
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗯、你只发送8个字节? 这不应该是问题。  您是否检查过 I2C 任务的优先级低于 MMW 任务?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    更新 txProxObjData[8]缓冲区的任务是 MmwDemo_mboxReadTask。 此任务的优先级设置为4。 I2C_Task 优先级设置为1。 这无法解决问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有关此问题的任何新闻? 谢谢你。