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.

[参考译文] C2000 - Simulink TI F2838x C28x I2C 发送

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1017581/c2000---simulink-ti-f2838x-c28x-i2c-transmit

主题中讨论的其他器件:C2000WARE

大家好、  

我正在使用28388D 控制卡、并尝试让 I2C 通信与 Simulink EmbedCoder 一起工作、

我首先从 CCS C 代码 I2C 示例开始、并对数据包进行了修改、使其正常运行、这是一个非常简单的代码、通过单个器件即可对芯片中的5个寄存器进行写入和读取。 因此可以证明硬件工作正常。

最终软件设计将在 Simulink EmbedCoder 问题中完成、我在该设计中遇到了问题。 尝试使用嵌入式 I2C 块、而不是使用自定义代码/s 函数。

在 CCS 上生成代码并运行代码并进行调试后、I2C 会接收消息、但不会发送消息。  

问题似乎出在线路"while (I2caRegs.I2CFFTX.bit.TXFFST!=0 & TX_LOOP<10000)"、其中 TXFFST 永远不等于零。 Simulink 中是否缺少某项内容来清除此问题?

下面是模型设置  

生成的代码

if (rtb_Compare) {
    /* S-Function (c280xi2c_tx): '<S9>/I2C Transmit' incorporates:
     *  Constant: '<S3>/Control Reg2'
     */
    {
      int unsigned tx_loop= 0;
      I2caRegs.I2CFFTX.bit.TXFFIENA = 0;/* Disable Tx Fifo interrupt*/
      while (I2caRegs.I2CFFTX.bit.TXFFST!=0 && tx_loop<10000 )
        tx_loop++;
      if (tx_loop!=10000) {
        I2caRegs.I2CSAR.bit.SAR = 0;   /* Set slave address*/
        I2caRegs.I2CCNT= 1;            /* Set data length */

        /* mode:1 (1:master 0:slave)  Addressing mode:0 (1:10-bit 0:7-bit)
           free data mode:0 (1:enbaled 0:disabled) digital loopback mode:0 (1:enabled 0:disabled)
           bit count:0 (0:8bit) stop condition:1 (1:enabled 0: disabled)*/
        I2caRegs.I2CMDR.all = 28192;
        tx_loop= 0;
        while (I2caRegs.I2CFFTX.bit.TXFFST==16 && tx_loop<10000)
          tx_loop++;
        if (tx_loop!=10000) {
          I2caRegs.I2CDXR.bit.DATA = (uint8_T)IPDM_Rev_A0_P.ControlReg2_Value;
        }
      }

      I2caRegs.I2CFFTX.bit.TXFFIENA = 1;/* Enable Tx Fifo interrupt*/
      I2caRegs.I2CFFTX.bit.TXFFINTCLR = 1;/* Clear Tx interrupt flag*/
    }

    /* S-Function (fcgen): '<S6>/Function-Call Generator' incorporates:
     *  SubSystem: '<S6>/StartRead'
     */
    /* S-Function (c280xi2c_tx): '<S8>/I2C Transmit' incorporates:
     *  Constant: '<S6>/Constant1'
     */
    {
      int unsigned tx_loop= 0;
      I2caRegs.I2CFFTX.bit.TXFFIENA = 0;/* Disable Tx Fifo interrupt*/
      while (I2caRegs.I2CFFTX.bit.TXFFST!=0 && tx_loop<10000 )
        tx_loop++;
      if (tx_loop!=10000) {
        I2caRegs.I2CSAR.bit.SAR = 16;  /* Set slave address*/
        I2caRegs.I2CCNT= 1;            /* Set data length */

        /* mode:1 (1:master 0:slave)  Addressing mode:0 (1:10-bit 0:7-bit)
           free data mode:0 (1:enbaled 0:disabled) digital loopback mode:0 (1:enabled 0:disabled)
           bit count:0 (0:8bit) stop condition:0 (1:enabled 0: disabled)*/
        I2caRegs.I2CMDR.all = 26144;
        tx_loop= 0;
        while (I2caRegs.I2CFFTX.bit.TXFFST==16 && tx_loop<10000)
          tx_loop++;
        if (tx_loop!=10000) {
          I2caRegs.I2CDXR.bit.DATA = (uint8_T)IPDM_Rev_A0_P.Constant1_Value;
          IPDM_Rev_A0_B.I2CTransmit = I2caRegs.I2CSTR.all;/* output i2c status */
        } else
          IPDM_Rev_A0_B.I2CTransmit = I2caRegs.I2CSTR.all | 0x40;/* output transmit data loss status */
      } else
        IPDM_Rev_A0_B.I2CTransmit = I2caRegs.I2CSTR.all | 0x80;/* output transmit data loss status */
      I2caRegs.I2CFFTX.bit.TXFFIENA = 1;/* Enable Tx Fifo interrupt*/
      I2caRegs.I2CFFTX.bit.TXFFINTCLR = 1;/* Clear Tx interrupt flag*/
    }

    /* End of Outputs for S-Function (fcgen): '<S6>/Function-Call Generator' */
  }

Simulink 硬件设置

我不熟悉 C2000系列和 Simulink、因此我希望这是一个我遗漏的简单修复!  

此致、

Neil

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

    尼尔

    感谢您发布块代码、我将与我们团队的 I2C 所有者联系、看看内联代码是否有任何变化。  如果我们发现缺少某些内容、并且无法确定如何通过 GUI 实施、我们可以加入 MW 团队。

    您能评论一下您在 C2000Ware 中使用的哪一个示例工作正常吗?  这将为我们提供与 Simulink 生成的代码不同的内容。

    最棒的

    Matthew

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

    你好、Matthew

    它是文件夹中的 i2c_ex2_EEPROM 项目。  C2000Ware_3_04_00_00\driverlib\f2838x\examples\C28x\i2c

    谢谢

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

    尼尔

    您是否已启用 TX FIFO 和 RX FIFO 以开始? 您只在代码片段中附带了什么内容、我不确定您是否已启用 FIFO、如下所示。 此外、当您遇到此错误时、TXFFST 位的状态是什么? TXFFST = 0吗?

    要使用 TX FIFO、您需要进行设置

    I2CFFTX.I2CFFEN = 1

    I2CFFTX.TXFFRST = 1.

    要使用 RX FIFO、您需要进行设置

    I2CFFRX.RXFFRST = 1

    此致、

    曼诺伊

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

    您好 Manoj

    并不一定需要 FIFO 功能、因为它的消息速率很低、

    从我在 Simulink 硬件设置中可以看到、没有禁用/启用 FIFO 的选项、尽管查看生成的 c 代码(在下面提取)、Simulink 的默认值似乎是启用 FIFO?  

    与 FIFO 相关的唯一选项是选择 FIFO 中断级别? (所有中断被禁用)

    void init_I2C_GPIO(void)
    {
      EALLOW;                              /* Initial I2C GPIO pin*/
      GpioCtrlRegs.GPCPUD.bit.GPIO91 = 0;  /* Enable pull-up on GPIO91 (SDAA)*/
      GpioCtrlRegs.GPCGMUX2.bit.GPIO91 = 1;/* Configure GPIO91 as SDAA*/
      GpioCtrlRegs.GPCMUX2.bit.GPIO91 = 2; /* Configure GPIO91 as SDAA*/
      GpioCtrlRegs.GPCPUD.bit.GPIO92 = 0;  /* Enable pull-up on GPIO92 (SCLA)*/
      GpioCtrlRegs.GPCGMUX2.bit.GPIO92 = 1;/* Configure GPIO92 as SCLA*/
      GpioCtrlRegs.GPCMUX2.bit.GPIO92 = 2; /* Configure GPIO92 as SCLA*/
      EDIS;
    }
    
    void init_I2C_A(void)
    {
      /* Initialize I2C*/
      EALLOW;
      CpuSysRegs.PCLKCR9.bit.I2C_A = 1;    /* Enable pheripheral clocks for I2C */
      EDIS;
      I2caRegs.I2CMDR.bit.MST = 1;         /* Select master or slave mode*/
      I2caRegs.I2CMDR.bit.DLB = 0;         /* Enable digital loopback bit */
      I2caRegs.I2CPSC.all = 199;        /* Prescaler - need 7-12 Mhz on module clk*/
      I2caRegs.I2CCLKL = 20;               /* NOTE: must be non zero*/
      I2caRegs.I2CCLKH = 20;               /* NOTE: must be non zero*/
      I2caRegs.I2CFFTX.all |= 0x6000;      /* Enable TxFIFO mode*/
      I2caRegs.I2CFFRX.all |= 0x2000;      /* Enable RxFIFO mode*/
      I2caRegs.I2CMDR.bit.IRS = 1;         /* Take I2C out of reset*/
    }

    TXFFST 值为2这在原始 POST 代码的 while 循环行8上使用断点)或使用连续刷新选项(如果这是快速更改、则刷新选项可能会更新该值)

    FIFO I2CFFEN 和 TXFFRST 的其他值 似乎与您建议使用的值相匹配、并且我尚未修改 Simulink 生成的任何代码  

    非常感谢、

    Neil

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

    TXFFST = 2告诉我您的 TXFIFO 中有2个字。 TXFFST 位域只有在 TXFIFO 中的内容被传输时才可读为"0"。 这只能通过生成 START 条件来实现。

    我从未使用 Simulink 生成 I2C 代码。 您是否使用 Simulink 进行了检查?

    此致、

    曼诺伊

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

    尼尔

    此问题是否已解决? 我可以关闭此主题吗?

    此致、

    曼诺伊