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.

[参考译文] TMS320C5535:将 TMS320C5535配置为 I2C 从机中断

Guru**** 2553450 points
Other Parts Discussed in Thread: TMS320C5535

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/615540/tms320c5535-configuring-tms320c5535-as-i2c-slave-interrupt

器件型号:TMS320C5535

我一直在尝试将 TMS320C5535配置为 I2C 从设备。 我正在 ezDSP5535平台上进行开发。  似乎我没有正确设置 I2C 中断、但在这一点上、我已经从阅读文献中用尽了任何想法。 基本上、如果我在从器件地址处使用 ICOAR 设置我的代码、我永远不会在 I2C 的 ISR 中遇到断点。 但是、如果我使用逻辑分析仪观察 SDA 和 SCL 线路、则在主处理器发送从器件地址时、DSP 会拉低 SDA 和 SCL 线路。 如果主处理器发送到其他地址、SDA 和 SCL 线不会被我的代码下拉、我可以成功地观察主处理器的其他 I2C 活动。  在任一种情况下、在 I2C 中断例程开始处设置的断点都不会被命中。 有人可以提供帮助吗? 感谢 you.e2e.ti.com/.../4431.main.ce2e.ti.com/.../usbstk5505.he2e.ti.com/.../IOpins.he2e.ti.com/.../aic3204.he2e.ti.com/.../csl_5F00_intc.he2e.ti.com/.../cslr_5F00_cpu.he2e.ti.com/.../PLL.he2e.ti.com/.../usbstk5505_5F00_i2c.c

我还附加了源文件、但 I2C 初始化和中断设置代码如下:

void lockin_I2C_init (void)

/*********
 I2C 设置
 设置是作为从发送器
 指南来自 TMS320C5535技术参考手册(SPRUH87D)
 P 317、sec 9.2.12.2描述了如何配置从接收器/发送器
 这是本节的功能。
秘书长的报告 /

   IRQ_disableAll();
      
 /*设置中断矢量起始地址*/
   IRQ_setVecs ((uint32)(&VECSTART));


   
   IRQ_plug (I2C_EVENT、&I2C_ISR);
   IRQ_CLEARALL ();      //清除任何挂起的中断

//step 1显示"enable clock from PSC level"(从 PSC 级别启用时钟)。
   SYS_PCGCR1 &=~SYSCLKDIS;   //当该位为0时、系统时钟激活
   SYS_PCGCR1 &=~I2CCG;      //当该位为0时、I2C 外设时钟有效
//step 2复位 I2C
   ICMDR &=~MDR_IRS;
//步骤3
//设置从地址,7位
   ICMDR &=~MDR_XA;
   ICOAR = 0x60;//0x61;//LockinSLA;   //将来,较低的4位将与插槽 ID 进行 OR 运算
//步骤4.
//ICIMR 针对特定的 I2C 外设事件启用中断。
//仅'AAS'、用于识别其自身从地址的 DSP 中断最初为
//启用。 然后、这将设置一个被启用的中断序列、如下所示:
//      -ICRRDY 可检测从器件地址之后的命令字节
//      -ICXRDY 可检测 ICXRDY 何时准备好接收新数据
//      -scd:检测到停止位、然后再次设置 AAS 以进行下一次发生
   ICIMR = ICIMR_AAS;
//步骤5.
//设置 I2C 预分频器(ICPSC 寄存器、第335页和第309页时钟图)
//this set the prescaled module clock which is described
//AS 要求6.7-13.3 MHz 的范围。 在编写本文档时、时钟源完全不清楚。
//I 正在按照所用常量的 USBSTK5505_I2C_init ()代码执行操作、它们的状态为20
//对于12MHz 时钟。 我不知道这个数字来自哪里、对于100MHz 并不明智
//整体时钟,但使用时基于假设,因为存在其他时钟,所以它必须正确
eZdsp 上的//I2C 器件、它们工作正常、例如 AIC3204编解码器。
///Step 5显示预分频模块时钟频率= PLL1输出频率/(IPSC + 1)
//PLL1输出频率被理解为100MHz。 如果值为20、则会得到4.76MHz、这太慢
//指定所需范围。 根据我的计算、对于12MHz、PSC 应为7.33
   ICPSC = 020;
//步骤6.
//配置 I2C 串行时钟频率 假设是对称的高半周期和低半周期、
//运行频率为(步骤5频率)/(ICC + 10)、其中 ICC 表示 ICCL 和 ICCH
//同样,USBSTK5505_I2C_init()代码与我的计算之间存在差异。
//对于20KHz 的 SCL,代码调用值20。 如果步骤5为12MHz、则提供 SCL
//、400 KHz。 如果步骤5为4.76MHz、则 SCL 为158.75KHz。 (P 326)
   ICCLKL=20;
   ICCLKH=20;
//步骤7.
//配置模式寄存器 ICMDR (第329页)
   ICMDR = 0;
   ICMDR |= RM;  //数据字在 STP 位手动置位前连续重新生成/传输
   ICMDR |= MDR_STT; //monitor 总线和 transmit /rec'v、用于响应主命令
//步骤8.
   ICSTR = ICSTR;   //通过写入1来清除任何挂起的中断标志
   while (ICIVR)   //通过读取 ICIVR 来将其置零
      ;
      
   ICDXR = CURRENT_YN[0];   //Keep XSMT=0、防止 SDA/SCA 线路拉低
//从复位中释放 I2C
   ICMDR |= MDR_IRS;
//步骤9.
//清除存在的任何中断
   ICSTR = ICSTR;   //通过写入1来清除任何挂起的中断标志
   while (ICIVR)   //通过读取 ICIVR 来将其置零
      ;
//步骤10
//检测起始条件和自身地址
      ICMDR |= MDR_STT;  //这也是在步骤7中完成的


      //启用 CPU 中断
   enable_interrupts ();
   //IRQ_globalEnable();
   
   ICntr = 0;
   TxP =&lockin_Drain[0];

ISR 代码如下:

中断空 I2C_ISR (空)
{    
   SYS_GPIO_DATAOUT0 &= ClearPin15;
      //确定中断源
   if ( ICSTR & ICSTR_AAS )
   {
         //从器件地址建议
      ICntr = 1;

         TxP =&Current_yn[1];

   }
   否则( ICSTR & ICXRDY )
   {
         //发送请求的数据
      ICDXR =*(TXP+icntr++);
      如果(icntr == 6)
         ICIMR = ICIMR_SCD;       
   }
   否则、如果(ICSTR & ICSTR_SCD)   //停止位
      ICIMR = ICIMR_AAS;
   
      //清除刚刚处理的挂起中断
   ICSTR = ICSTR;
   
   SYS_GPIO_DATAOUT0 |= SetPin15;
   enable_interrupts ();
      

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

    尊敬的 Ron:

    我已将此内容转发给 C55x 软件专家。 他们的反馈应发布在此处。

    BR
    Tsvetolin Shulev

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你 Tsvetolin。 您是否知道他们通常需要多长时间才能作出回应? 此设计问题是完成此项目的关键途径。 是否有直接联系方式?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ron、
    请看一下 C5545上的 I2C 从设备实现。 此示例位于 MSP430和 C5545 Booster Pack 之间、但提供了应如何设置的示例。 C5535和45是类似的器件。

    C:\ti\c55_lp\c55_CSL_3.07\demos\out_for_box\c5545\c5545bp_software_01.01.00.00\source_codes\c55xx_diagnostics\board\diag\i2c_dsp_test\dsp_slave_msp_master\src\iMSP_master_2c.c

    希望这有助于解决这个问题。

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

    谢谢、我将会介绍一下。 但是,*有人*看了我提供的代码吗? 这对我们来说并不是一种爱好、 这是产品开发工作的一个关键路径要素、将近两周的答复为我提供了家庭作业任务、而不是对我的系统中的问题进行实际的直接分析、这是我过去的经验。 如果此示例不能解决我的问题、FAE 是否有电话号码或直接电子邮件地址可以帮助我们公司快速解决此问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我只是看了看…… 这是硬盘驱动器上的路径吗? 我们无法做到这一点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ron、

    您的 PC 上是否安装了 C55x CSL?
    是的、这是安装 CSL 后 HD 上的路径。
    software-dl.ti.com/.../index_FDS.html

    Lali
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这无法解决我的问题。 请查看我的初始*详细*问题及随附的代码。 我需要有一个 I2C 中断服务从机数据请求、它需要快速执行。 正如我说过的、I2C 中断显然没有执行、但 I2C 设置必须正确、因为如果主器件发送 ICOAR 地址、SCL 和 SDA 数据线会被下拉。 如果 ICOAR 设置为与设置的地址不同的地址、则来自主器件的 I2C 流量不会中断。 我怀疑线路被下拉、因为 ICDXR 寄存器为空、因为 I2C 中断不会跳闸并重新加载它(ICDXR 已在我的设置代码中预加载)。 此外、此参考代码使用对"黑盒"CSL_Fins 函数的调用、但不能查看寄存器位在内部执行的调整。 我已经阅读了大约十几本 TI 参考手册、其中包含数千页。 我对 TI 的耐心已经结束了。 能否向我提供直接与 FAE 联系并直接了解如何执行此操作的信息??
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ron、

    对这些挫折表示歉意。 E2E 是获取支持的最佳途径、但显然尚未解决您的问题。 让我更详细地了解一下您的代码和后续行动。

    您的代码是否基于我在上面提到的 CSL?

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

    感谢你的帮助。 在整个代码中都有注释、尤其是 I2C 设置部分中几乎每行都有注释、描述了每个 SPRU 文档中的页码和章节编号信息来自。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ron、

    好的、明白了。
    仅供将来参考、建议使用 C5000 CSL 作为您的开发代码库、因为它更受支持、并且具有适用于各种外设的驱动程序等。

    此外、为了澄清这一点、总线上还有其他 I2C 器件可由主处理器成功访问、但只有 C5535无法访问?

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

    是的、没错。 线路上有一个 DAC、可在相同线路上与主器件的并发 I2C 命令正常配合使用。 5535似乎通过下拉 SDA 和 SCL 线路在其从器件地址到达(将其设置为0x60)时做出响应、但 ISR 断点未跳闸、表明 I2C ISR 未正确完全设置。 如果我将 ICOAR 设置为不同的数字(0x61)、则 SDA 和 SCL 线不会被下拉。

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

    Ron、

    您是否启用了接收中断(ICIMR = ICIMR_AAS)? 代码中_enable_interrupts()的定义是什么?

    如果您看一下我之前提到的 CSL 示例、这里是配置从机模式的 CSL 步骤。

    静态 test_status run_i2c_mspmst_dspslv_test (void *testArgs)
    {
    int16 RetVal;
    
    uint16索引、count;
    
    //初始化 I2C 模块*/
    Retrfins = I2C_init (CSL_I2C0);
    if (RetVal!= C55x_msgok)
    {C55x_mspr_r*
    /I2C_r*
    
    
    
    inr/
    iDCR (I2C_r_r_r_r/ iDCR)、I2C_r_r/ inr/ r/ r/ inr_r_r/
    
    r/ inr_r_r/ intrs (i2C_r/ i2c)/r/ r_r_r_r_r/ r_r/ r_r_r_r/ inrs (i2cr) return!/i2C_r/ i2cr、in/
    
    
    /* I2C 将模式设置为从设备*/
    CSL_fins (CSL_I2C_0_regs->ICMDR、I2C_ICMDR_MST、0);
    
    /* I2C 将地址模式设置为7位*/
    CSL_ICR (CSL_I2C_DR_0)
    
    
    
    
    
    
    
    
    
    
    
    ;* ICL_ICR 设置为0、I2C_AR_ICR、ICR、ICR、ICR、ICR 0)* ICL_AR_ICR (CS0_ICR、ICR、ICR、I2C_AR_ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR、ICR
    
    C55x_msgWrite ("正在等待 MSP 传输数据...\n\n\r\n");
    
    /*等待总线空闲转接*/
    执行{
    RESPONSE=CSL_FEXT (CSL_I2C_0_regs->ICSTR、I2C_ICSTR_BB );
    }while (((RESPONSE & 0x1)!=0x0);
    
    /*从主设备接收64字节/页数据*/
    for (i=0;i ICSTR、I2C_ICSTR_ICRDY);
    }while ((Response & 0x01)=0);
    /*从接收数据寄存器读取数据*/
    i2cSlaveDataBuf[i]= CSL_FEXT (CSL_I2C_0_regs->ICDRR、I2C_ICDRR_D);
    }
    
    C55x_msgWrite ("从主设备接收的数据:\n\r");
    for (index = 0;index < I2C_SLV_DATA_size;)
    {
    for (count = 0;count < I2C_SLV_DATA_BLOCK_SIZE;count++)
    {
    C55x_msgWrite ("0x%x\t"、i2cWrite_Memby"
    );c55x+(c+)
    
    
    index += I2C_SLV_DATA_BLOCK_SIZE;
    
    C55X_DELAY_msec (800);
    }
    
    //比较接收到的数据*/
    //*为了便于验证,假设主器件从
    0到15发送16字节数据*。 主测试实现应发送相同的数据、以
    *成功执行测试*/
    用于(INDEX = 0;INDEX < I2C_SLV_DATA_SIZE;index++)
    {
    if (i2cSlaveDataBuf[index]!= INDEX)
    {
    C55x_msgWrite ("\n\RDATA received from Master Offset with Expected Data at %d"、index)
    ;(return)、失配"(%d_test)
    
    }
    
    C55x_msgWrite ("\n\nRDATA received from Master matched with Expected Data!\n\n");
    
    //重置 I2C 模块*/
    CSL_fins (CSL_I2C_0_regs->ICMDR、I2C_ICMDR_IRS、0);
    
    return (test_pass);
    
    } 

    此外、我还附加了一个相同 DSP (从器件)-MSP430 (主器件)的.out 文件、该文件的地址为二进制配置的0x60。 您是否认为您可以在设置中尝试此操作以查看 DSP 是否响应? 不确定它是否能正常工作、只是一个实验。

    调试代码很困难、因为它不使用任何 CSL 调用、只使用基于 TRM 的寄存器的原始函数。 此外、是否有办法重现它? 我们通常会研究 CSL 推出的 API、并建议客户使用这些 API。

    Lali

    /cfs-file/__key/communityserver-discussions-components-files/791/4466.i2c_5F00_dsp_5F00_slave_5F00_msp_5F00_master.out