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.

[参考译文] TMS320C6747:TMS320C6747 I2C(I2C0)によるEEPROMアクセスの動作不良

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1498674/tms320c6747-tms320c6747-i2c-i2c0-eeprom

部件号:TMS320C6747
主题中讨论的其他器件:OMAP-L137

工具/软件:

你(们)好

我无法使用 I2C0外设写入 EEPROM。
症状是当 DSP 是主器件时、没有输出到 SCL 和 SDA。

PSC 不会取消暂停 I2C0外设。
已经确认、当 I2C_INIT ()和 I2C_WRITE ()按步骤执行时、每个寄存器都正常变化。
已确认 ICPFUNC0.PFUNC0为0 (禁用)。
UART0外设是与 I2C0的 SCL 和 SDA 相冲突的引脚、处于睡眠模式。
SCL 和 SDA 端子通过10kΩ 上拉。

下面部分提取并列出了必要的代码。
这些代码基于 OMAP-L137_C6747_BSL 中包含的代码。


/******************************************************************** /

char pBuff[16];

/******************************************************************** /
U16 I2C_INIT (void)

   ICMDR0  = 0;               //复位 I2C
   ICMDR0 |= ICMDR_MST;       //释放 I2C 主器件

   // I2C 输入时钟= 16.384MHz
   ICPSC0 = 0x00000001;     // IPSC = 1      I2C 预分频器= 2
                               //预分频模块时钟= 16.384MHz /2 = 8.192MHz
   ICCLKL0 = 5;              // ICCL = 5      (ICCL + 6)+(ICCH + 6)
   ICCLKH0 = 5;              // ICCH = 5      (ICCL + 6)+(ICCH + 6)
                               // SCL =(16.384MHz / 2)/((ICCL + 6)+(ICCH + 6))
                               //    =(16.384MHz / 2)/ 22
                               //    = 372.363kHz
   ICSTR0 = ICSTR0;
   ICMDR0 |= ICMDR_IRS;       //从复位中释放 I2C
   ICSTR0 |=(ICSTR_ARDY | ICSTR_BB);
   返回0;
}

/******************************************************************** /
S16 I2C_CLOSE (void)

   ICMDR0    = 0;                     //复位 I2C
   返回0;
}

/******************************************************************** /
S16 I2C_RESET (void)

   I2C_CLOSE ();
   i2c_init ();
   返回0;
}

/******************************************************************** /
S16 I2C_WRITE (U16 i2c_addr、u08*数据、U16 len)

S32超时、I;

   ICCNT0  = len;                   //设置长度
   icsar0  = i2c_addr;              //设置 I2C 从器件地址
   ICMDR0  = ICMDR_STT              //设置为主器件写入
            | ICMDR_TRX
            | ICMDR_MST
            | ICMDR_IRS
            | ICMDR_FREE;

   I2C_WAIT( 1000 );                       //短延迟

   for (i = 0;i < len;i++)
   {
       ICDXR0 = DATA[i];             //写入

       timeout = i2c_timeout;
       应该做
       {
           if (timeout--< 0 )
           {
               I2C_RESET ();
               返回-1;
           }
       } while (( ICSTR0 & ICSTR_ICXRDY )== 0 ); //等待 Tx 就绪
   }

   ICMDR0 |= ICMDR_STP;            //生成停止
   返回0;

}

/******************************************************************** /
void main()

S16 ANS;

   // PLL、PINMUX 设置
       AUXCLK 为16.384MHz
       SYSCNF0.PINMUX8_19_16 = 2      // I2C_SCL
       SYSCNF0.PINMUX8_15_12 = 2      // I2C_SDA
   ...

   //
   i2c_init ();

       while (1){
           strcpy (pBuff[]、"test - 0");
           ANS = I2C_WRITE (pBuff、0x0FF0、8);       // 0x0FF0是 EEPROM 中的写入地址
           如果(ANS = 0)中断;
       }
   

}

/******************************************************************** /

谢谢。

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

    您好:

    我们不再支持 C674 DSP 的裸机软件开发。 请参阅 此公告 并在其中查找资源。  

    此致、

    建中