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.

[参考译文] TMS320DM6446:TMS320DM6446

Guru**** 2587365 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/635023/tms320dm6446-tms320dm6446

器件型号:TMS320DM6446

我必须使用 TMS320DM6446的 I2C 外设对 PCA2129进行写入和读取。

我正在检查在示波器上从 TMS320DM6446的 I2C 发出的数据、该数据与写入代码的实际数据不匹配。

请建议问题可能是什么?

使用的代码如下所示:



#include "stdio.h"
#include "davincievm.h"
#include "davincievm_uart.h"
#include
#include
#include
 
#include "stdlib.h"

#include "davincievm.h"


#include "string.h"

 
 
void main( void )

 
uint32 i;
uint32 jj;
 
unsigned char add_regI2c=0、I2C_len=0、I2C_SLAddr、cntRD;
 
DAVINCIEVM_GPIO_init();
 
 PINMUX0 &=0xffffff7fE0;
 
 DAVINCIEVM_GPIO_setDirection (12、0);
 DAVINCIEVM_GPIO_setOutput (12、1);
 
   
 
  PINMUX1 &=0xffffff7f;
  PINMUX1 |=0x00000080;
  DAVINCIEVM_I2C_RESET();
 
    add_regI2c=0x03;
   //I2C_len = 0x02;
   //I2C_SLAddr = 0xA2;
    while (1)
   {
    DAVINCIEVM_I2C_WRITE (0xA2、&add_regI2c、3);
    
    DAVINCIEVM_I2C_READ (0xA3、&RDsec、0x01);
 
   cntRD++;
   }

 
 
 
 
 
//将以下文件添加为头文件/源文件/include 文件
 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
 * Copyright 2005 by Spectrum Digital Incorporated。
 * 保留所有权利。 Spectrum Digital Incorporated 的财产。
 *
 * 不可分发。
 *
 
/*
 * I2C 实现
 *
 *
 
#include "davincievm_i2c.h"
 
/*---------------------------------------------- *
 *                                                                         *
 * DAVINCIEVM_I2C_INIT()                                                 *
 *                                                                         *
 *     启用并初始化 I2C 模块                                *
 *                                                                         *
 *     I2C 时钟设置为以20KHz 运行                                *
 *                                                                         *
 ******************************************************************************************************* *
int16 DAVINCIEVM_I2C_init()

   #ifdef ARM_SIDE
 
       CSL_Status 状态;
       CSL_I2cClkSetup i2c_clksetup;
       CSL_I2cHwSetup i2c_hwsetup;
       CSL_I2cParam   i2c_param;
 
       CSL_i2cInit(0);
       I2C_Handle = CSL_i2cOpen (&i2c_obj、0、&i2c_param、&status);
 
       I2C_clksetup.prescalar     = 26;
       I2C_clksetup.clklowdiv     = 20;
       i2C_clksetup.clkhighdiv    = 20;
 
       I2C_hwsetup.mode           = 1;   // 0:从模式       1:主模式
       I2C_hwsetup.dir            = 0;   // 0:Rx 模式          1:TX 模式
       I2C_hwsetup.addrMode       = 0;   // 0:7位模式       1:10位模式//0
       I2C_hwsetup.sttbyteen      = 0;   // 0:正常模式      1:起始字节模式//0
       I2C_hwsetup.ownaddr        = 1;   //#:自有地址//0
       I2C_hwsetup.ackMode        = 0;   // 0:ACK 模式         1:NACK 模式
       i2c_hwsetup.runMode        = 0;   // 0:无自由运行模式 1:自由运行模式//
       I2C_hwsetup.repeMode     = 0;   // 0:无重复模式   1:重复模式
       I2C_hwsetup.loopBackMode   = 0;   // 0:无环回      1:环回模式//0
       i2c_hwsetup.freeDataFormat = 0;   // 0:无可用数据 fmt 1:免费数据 fmt
       I2C_hwsetup.resetMode      = 1;   // 0:复位            1:超出复位范围//0
       I2C_hwsetup.bcm            = 0;   // 0:不兼容   1:兼容
       i2c_hwsetup.inten          = 0;   //#:INTR 使能掩码
       i2C_hwsetup.clksetup       =&i2c_clksetup;
 
       status = CSL_i2cHwSetup( i2c_handle,&i2c_hwsetup );
 
       CSL_i2cHwControl (i2c_handle、CSL_I2C_CMD_OUTOFRESET,0);
       返回0;
 
   #Elif DSP_Side
 
       I2C_ICMDR  = 0;                   //复位 I2C
       I2C_ICPSC  = 26;                  //配置27MHz 的预分频器
       I2C_ICCLKL = 5;                   //针对50kHz 配置 clk 为低电平
       I2C_ICCLKH = 5;                   //针对50kHz 配置 clk 为高电平
       I2C_ICMDR |= ICMDR_IRS;           //从复位状态释放 I2C
       返回0;
 
   #endif

 
/*---------------------------------------------- *
 *                                                                         *
 * DAVINCIEVM_I2C_CLOSE ()                                                *
 *                                                                         *
 ******************************************************************************************************* *
Int16 DAVINCIEVM_I2C_CLOSE ()

   #ifdef ARM_SIDE
 
       cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_RESET、0);
       cSL_i2cClose (i2c_handle);
       返回0;
 
   #Elif DSP_Side
 
       I2C_ICMDR = 0;                     //复位 I2C
       返回0;
 
   #endif

 
/*---------------------------------------------- *
 *                                                                         *
 * DAVINCIEVM_I2C_RESET()                                                *
 *                                                                         *
 *                                                                         *
 *                                                                         *
 ******************************************************************************************************* *
Int16 DAVINCIEVM_I2C_RESET()

   DAVINCIEVM_I2C_CLOSE ();
   DAVINCIEVM_I2C_INIT();
   返回0;

 
/*---------------------------------------------- *
 *                                                                         *
 * DAVINCIEVM_I2C_WRITE( i2addr、data、len )                             *
 *                                                                         *
 *     主模式下的 I2C 写入                                           *
 *                                                                         *
 *     i2addr <- I2C 从器件地址                                       *
 *     data   <- I2C data ptr                                            *
 *     len    <-要写入的字节数                                     *
 *                                                                         *
 ******************************************************************************************************* *
int16 DAVINCIEVM_I2C_write( uint16 i2caddr、uint8* data、uint16 len )

   uint16 i;
   Int32超时  = 0x20000;
   Int32 TimeCount = 0;
 
   #ifdef ARM_SIDE
 
       uint16响应;
 
       cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_DATA_COUNT、&len);
       cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_SLAVE_ADDR、&i2cadr);
       cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_DIR_transmit、0);
       cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_start、0);
 
       DAVINCIEVM_WAIT (10);
 
       for (i = 0;i < len;i++)
       {
           cSL_i2cWrite (i2c_handle、&data[i]);
 
           TimeCount = 0;
           操作
           {
               cSL_i2cGetHwStatus (i2c_handle、cSL_I2C_query_TX_RDY、&Response);
 
               TimeCount++;
               如果(TimeCount >= timeout)
               {
                   DAVINCIEVM_I2C_RESET();
                   退货1000;
               }
 
           } while (response =0);
       }
 
     //CSL_i2cHwControl (i2c_handle、CSL_I2C_CMD_stop、0);
 
       返回0;
 
   #Elif DSP_Side
 
       I2C_ICCNT = len;                   //设置 len
       I2C_ICSAR = i2addr;               //设置 I2C 从器件地址
       I2C_ICMDR = ICMDR_STT              //配置主设备写入
                 | ICMDR_TRX
                 | ICMDR_MST
                 | ICMDR_IRS
                 | ICMDR_FREE
                 ;
 
       DAVINCIEVM_WAIT( 10);             //短延迟
 
       for (i = 0;i < len;i++)
       {
           I2C_ICDXR = DATA[i];           //写入
 
           TimeCount = 0;
           操作
           {
               TimeCount++;
               如果(TimeCount >= timeout)
               {
                   DAVINCIEVM_I2C_RESET();
                   退货1000;
               }
           } while ((I2C_ICSTR & ICSTR_ICXRDY)=0);//等待 Tx 就绪
       }
 
       I2C_ICMDR |= ICMDR_STP;            //生成停止
       返回0;
 
   #endif

 
/*---------------------------------------------- *
 *                                                                         *
 * DAVINCIEVM_I2C_READ( i2addr、data、len )                              *
 *                                                                         *
 *     主模式下的 I2C 读取                                            *
 *                                                                         *
 *     i2addr <- I2C 从器件地址                                       *
 *     data   <- I2C data ptr                                            *
 *     len    <-要写入的字节数                                     *
 *                                                                         *
 ******************************************************************************************************* *
int16 DAVINCIEVM_I2C_READ( uint16 i2caddr、uint8* data、uint16 len )

   uint16 i;
   Int32超时  = 0x20000;
   Int32 TimeCount = 0;
 
   #ifdef ARM_SIDE
 
       uint16响应;
 
       cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_DATA_COUNT、&len);
       cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_SLAVE_ADDR、&i2cadr);
       cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_DIR_Receive、0);
       cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_start、0);
 
       DAVINCIEVM_WAIT (10);
 
       for (i = 0;i < len;i++)
       {
           TimeCount = 0;
           操作
           {
               cSL_i2cGetHwStatus (i2c_handle、cSL_I2C_query_RX_RDY、&Response);
 
               TimeCount++;
               如果(TimeCount >= timeout)
               {
                   DAVINCIEVM_I2C_RESET();
                   退货1000;
               }
 
           } while (response =0);
 
           cSL_i2cRead (i2c_handle,&data[i]);
       }
 
     //CSL_i2cHwControl (i2c_handle、CSL_I2C_CMD_stop、0);
 
       返回0;
 
   #Elif DSP_Side
 
       I2C_ICCNT = len;                   //设置 len
       I2C_ICSAR = i2addr;               //设置 I2C 从器件地址
       I2C_ICMDR = ICMDR_STT              //配置为主器件读取
                 | ICMDR_MST
                 | ICMDR_IRS
                 | ICMDR_FREE
                 ;
 
       for (i = 0;i < len;i++)
       {
           TimeCount = 0;
           操作
           {
               TimeCount++;
               如果(TimeCount >= timeout)
               {
                   DAVINCIEVM_I2C_RESET();
                   退货1000;
               }
           } while (( I2C_ICSTR & ICSTR_ICRDY )=0);//等待 Rx 就绪
           DATA[i]= I2C_ICDRR;           //读取
       }
 
       I2C_ICMDR |= ICMDR_STP;            //生成停止
       返回0;
 
   #endif

 
/*---------------------------------------------- *
 *                                                                         *
 * DAVINCIEVM_I2C_READ_variable (i2addr、data、len)                     *
 *                                                                         *
 *     主模式下的 I2C 读取                                            *
 *                                                                         *
 *     i2addr <- I2C 从器件地址                                       *
 *     data   <- I2C data ptr                                            *
 *     len    <-要写入的字节数                                     *
 *                                                                         *
 ******************************************************************************************************* *
int16 DAVINCIEVM_I2C_READ_variable (uint16 i2caddr、uint8* data、uint16 len)

   uint16 i;
   Int32超时  = 0x20000;
   Int32 TimeCount = 0;
 
   #ifdef ARM_SIDE
 
       uint16响应;
 
       cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_DATA_COUNT、&len);
       cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_SLAVE_ADDR、&i2cadr);
       cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_DIR_Receive、0);
       cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_start、0);
 
       DAVINCIEVM_WAIT (10);
 
       for (i = 0;i < len;i++)
       {
           如果(i ==1)
           {
               len =数据[0];
               cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_DATA_COUNT、&len);
           }
 
           TimeCount = 0;
           操作
           {
               cSL_i2cGetHwStatus (i2c_handle、cSL_I2C_query_RX_RDY、&Response);
 
               TimeCount++;
               如果(TimeCount >= timeout)
               {
                   DAVINCIEVM_I2C_RESET();
                   退货1000;
               }
 
           } while (response =0);
 
           cSL_i2cRead (i2c_handle,&data[i]);
       }
 
     //CSL_i2cHwControl (i2c_handle、CSL_I2C_CMD_stop、0);
 
       返回0;
 
   #Elif DSP_Side
 
       I2C_ICCNT = len;                   //设置 len
       I2C_ICSAR = i2addr;               //设置 I2C 从器件地址
       I2C_ICMDR = ICMDR_STT              //配置为主器件读取
                 | ICMDR_MST
                 | ICMDR_IRS
                 | ICMDR_FREE
                 ;
 
       for (i = 0;i < len;i++)
       {
           如果(i ==1)
           {
               len =数据[0];
               I2C_ICCNT = len;           //设置 len
           }
 
           TimeCount = 0;
           操作
           {
               TimeCount++;
               如果(TimeCount >= timeout)
               {
                   DAVINCIEVM_I2C_RESET();
                   退货1000;
               }
           } while (( I2C_ICSTR & ICSTR_ICRDY )=0);//等待 Rx 就绪
           DATA[i]= I2C_ICDRR;           //读取
       }
 
       I2C_ICMDR |= ICMDR_STP;            //生成停止
       返回0;
 
   #endif

 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
 
/*
 * Copyright 2005 by Spectrum Digital Incorporated。
 * 保留所有权利。 Spectrum Digital Incorporated 的财产。
 *
 * 不可分发。
 *
 
/*
 * I2C 头文件
 *
 *
 
ifndef I2C_
#define I2C_
 
#include "davincievm.h"
 
#ifdef ARM_SIDE
 
   #include "cSL_i2c.h"
   静态 CSL_I2cHandle i2c_handle;
   静态 CSL_I2cObj   i2c_obj;
 
#Elif DSP_Side
 
#endif
 
/*---------------------------------------------- *
 *                                                                         *
 * I2C 原型                                                         *
 *                                                                         *
 ******************************************************************************************************* *
int16 DAVINCIEVM_I2C_init ();
int16 DAVINCIEVM_I2C_CLOSE ();
int16 DAVINCIEVM_I2C_WRITE( uint16 slaveaddr、uint8* data、uint16 len );
int16 DAVINCIEVM_I2C_READ ( uint16 slaveaddr、uint8* data、uint16 len );
 
#endif
 
 
  
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//在 include EX:csl_i2c.h 等中添加了更多与 I2C 相关的头文件
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

    有关软件支持、请参阅以下 e2e 文章:

    e2e.ti.com/.../622094

    此致、
    帕维尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Pavel Botev、
    您能更清楚地回答一下。
    您提供的链接中提到的大多数电子邮件都有销售电子邮件 ID。
    希望您已了解我们的当前要求。
    我们正在寻找通过 I2C 外设传输和接收软件、并布置了我正在使用的软件、但示波器上的 I2C 数据 o/p 波形不正确。 请在发布的软件中建议所需的修改。

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

    如需了解任何详细的软件支持、请联系下面推荐的任何精选合作伙伴。 他们拥有丰富的 DM64x 软件专业知识和系统经验。

    它们是(按字母顺序排列):

    D3 Engineering (sales@d3engineering.com)

    eInfochips (ajat.dhawal@einfochips.com)

    Ittiam Systems (ids-mkt@ittiam.com)

    Path 合作伙伴技术(sales@pathpartnertech.com)

    Z3 Technologies (sales@z3technology.com)

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

    您好!

    由于所面临的问题本质上是与 TI ARM 处理器中的标准 I2C 接口相关的通用问题、因此我正在寻找一个问题的紧急解决方案、因此请对下面描述的问题作出响应:

    我必须使用的 I2C 外设对 PCA2129执行写和读操作

    TMS320DM6446配置为更成熟。  我正在检查从的 I2C 发送的数据(包括从器件地址)

    示波器上的 TMS320DM6446与实际数据不匹配

    代码中编写的代码。

    所使用的 I2C 代码、数据表

    PCA2129 、在示波器上捕获的波形和模块原理图随附以供参考。

    振荡器频率

    我们的电路板为27MHz (I/p 至 TMS320DM6446)。

    请建议什么

    可能是问题吗?

    注- PCA2129需要 I2C 协议

    在 PCA2129数据表的第-56页中提到。

    如果您需要更多详细信息、请告知我们。

    要求 作出迅速反应,因为我们需要紧急解决这一问题。

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    使用的代码如下所示:



    #include "stdio.h"
    #include "davincievm.h"
    #include "davincievm_uart.h"
    #include
    #include
    #include
     
    #include "stdlib.h"

    #include "davincievm.h"


    #include "string.h"

     
     
    void main( void )

     
    uint32 i;
    uint32 jj;
     
    unsigned char add_regI2c=0、I2C_len=0、I2C_SLAddr、cntRD;
     
    DAVINCIEVM_GPIO_init();
     
     PINMUX0 &=0xffffff7fE0;
     
     DAVINCIEVM_GPIO_setDirection (12、0);
     DAVINCIEVM_GPIO_setOutput (12、1);
     
       
     
      PINMUX1 &=0xffffff7f;
      PINMUX1 |=0x00000080;
      DAVINCIEVM_I2C_RESET();
     
        add_regI2c=0x03;
        //I2C_len = 0x02;
        //I2C_SLAddr = 0xA2;
        while (1)
        {
         DAVINCIEVM_I2C_WRITE (0xA2、&ADD_regI2c、1);  //发送从地址(0xA2、后跟一个字节数据、即 PCA2129的第二个寄存器(0x03H)的地址
         
         DAVINCIEVM_I2C_READ (0xA3、&RDsec、0x01);    //从 PCA2129的第二个寄存器(0x03H)只读取一个字节  

     
        cntRD++;
        }

     
    //注:请参阅 PCA2129的已缓存数据表第56页上的 PCA2129 I2C 协议
     
     
     
     
    //将以下文件添加为头文件/源文件/include 文件
     
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /*
     * Copyright 2005 by Spectrum Digital Incorporated。
     * 保留所有权利。 Spectrum Digital Incorporated 的财产。
     *
     * 不可分发。
     *
     
    /*
     * I2C 实现
     *
     *
     
    #include "davincievm_i2c.h"
     
    /*---------------------------------------------- *
     *                                                                         *
     * DAVINCIEVM_I2C_INIT()                                                 *
     *                                                                         *
     *     启用并初始化 I2C 模块                                *
     *                                                                         *
     *     I2C 时钟设置为以20KHz 运行                                *
     *                                                                         *
     ******************************************************************************************************* *
    int16 DAVINCIEVM_I2C_init()

       #ifdef ARM_SIDE
     
           CSL_Status 状态;
           CSL_I2cClkSetup i2c_clksetup;
           CSL_I2cHwSetup i2c_hwsetup;
           CSL_I2cParam   i2c_param;
     
           CSL_i2cInit(0);
           I2C_Handle = CSL_i2cOpen (&i2c_obj、0、&i2c_param、&status);
     
           I2C_clksetup.prescalar     = 26;
           I2C_clksetup.clklowdiv     = 20;
           i2C_clksetup.clkhighdiv    = 20;
     
           I2C_hwsetup.mode           = 1;   // 0:从模式       1:主模式
           I2C_hwsetup.dir            = 0;   // 0:Rx 模式          1:TX 模式
           I2C_hwsetup.addrMode       = 0;   // 0:7位模式       1:10位模式//0
           I2C_hwsetup.sttbyteen      = 0;   // 0:正常模式      1:起始字节模式//0
           I2C_hwsetup.ownaddr        = 1;   //#:自有地址//0
           I2C_hwsetup.ackMode        = 0;   // 0:ACK 模式         1:NACK 模式
           i2c_hwsetup.runMode        = 0;   // 0:无自由运行模式 1:自由运行模式//
           I2C_hwsetup.repeMode     = 0;   // 0:无重复模式   1:重复模式
           I2C_hwsetup.loopBackMode   = 0;   // 0:无环回      1:环回模式//0
           i2c_hwsetup.freeDataFormat = 0;   // 0:无可用数据 fmt 1:免费数据 fmt
           I2C_hwsetup.resetMode      = 1;   // 0:复位            1:超出复位范围//0
           I2C_hwsetup.bcm            = 0;   // 0:不兼容   1:兼容
           i2c_hwsetup.inten          = 0;   //#:INTR 使能掩码
           i2C_hwsetup.clksetup       =&i2c_clksetup;
     
           status = CSL_i2cHwSetup( i2c_handle,&i2c_hwsetup );
     
           CSL_i2cHwControl (i2c_handle、CSL_I2C_CMD_OUTOFRESET,0);
           返回0;
     
       #Elif DSP_Side
     
           I2C_ICMDR  = 0;                   //复位 I2C
           I2C_ICPSC  = 26;                  //配置27MHz 的预分频器
           I2C_ICCLKL = 5;                   //针对50kHz 配置 clk 为低电平
           I2C_ICCLKH = 5;                   //针对50kHz 配置 clk 为高电平
           I2C_ICMDR |= ICMDR_IRS;           //从复位状态释放 I2C
           返回0;
     
       #endif

     
    /*---------------------------------------------- *
     *                                                                         *
     * DAVINCIEVM_I2C_CLOSE ()                                                *
     *                                                                         *
     ******************************************************************************************************* *
    Int16 DAVINCIEVM_I2C_CLOSE ()

       #ifdef ARM_SIDE
     
           cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_RESET、0);
           cSL_i2cClose (i2c_handle);
           返回0;
     
       #Elif DSP_Side
     
           I2C_ICMDR = 0;                     //复位 I2C
           返回0;
     
       #endif

     
    /*---------------------------------------------- *
     *                                                                         *
     * DAVINCIEVM_I2C_RESET()                                                *
     *                                                                         *
     *                                                                         *
     *                                                                         *
     ******************************************************************************************************* *
    Int16 DAVINCIEVM_I2C_RESET()

       DAVINCIEVM_I2C_CLOSE ();
       DAVINCIEVM_I2C_INIT();
       返回0;

     
    /*---------------------------------------------- *
     *                                                                         *
     * DAVINCIEVM_I2C_WRITE( i2addr、data、len )                             *
     *                                                                         *
     *     主模式下的 I2C 写入                                           *
     *                                                                         *
     *     i2addr <- I2C 从器件地址                                       *
     *     data   <- I2C data ptr                                            *
     *     len    <-要写入的字节数                                     *
     *                                                                         *
     ******************************************************************************************************* *
    int16 DAVINCIEVM_I2C_write( uint16 i2caddr、uint8* data、uint16 len )

       uint16 i;
       Int32超时  = 0x20000;
       Int32 TimeCount = 0;
     
       #ifdef ARM_SIDE
     
           uint16响应;
     
           cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_DATA_COUNT、&len);
           cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_SLAVE_ADDR、&i2cadr);
           cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_DIR_transmit、0);
           cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_start、0);
     
           DAVINCIEVM_WAIT (10);
     
           for (i = 0;i < len;i++)
           {
               cSL_i2cWrite (i2c_handle、&data[i]);
     
               TimeCount = 0;
               操作
               {
                   cSL_i2cGetHwStatus (i2c_handle、cSL_I2C_query_TX_RDY、&Response);
     
                   TimeCount++;
                   如果(TimeCount >= timeout)
                   {
                       DAVINCIEVM_I2C_RESET();
                       退货1000;
                   }
     
               } while (response =0);
           }
     
         //CSL_i2cHwControl (i2c_handle、CSL_I2C_CMD_stop、0);
     
           返回0;
     
       #Elif DSP_Side
     
           I2C_ICCNT = len;                   //设置 len
           I2C_ICSAR = i2addr;               //设置 I2C 从器件地址
           I2C_ICMDR = ICMDR_STT              //配置主设备写入
                     | ICMDR_TRX
                     | ICMDR_MST
                     | ICMDR_IRS
                     | ICMDR_FREE
                     ;
     
           DAVINCIEVM_WAIT( 10);             //短延迟
     
           for (i = 0;i < len;i++)
           {
               I2C_ICDXR = DATA[i];           //写入
     
               TimeCount = 0;
               操作
               {
                   TimeCount++;
                   如果(TimeCount >= timeout)
                   {
                       DAVINCIEVM_I2C_RESET();
                       退货1000;
                   }
               } while ((I2C_ICSTR & ICSTR_ICXRDY)=0);//等待 Tx 就绪
           }
     
           I2C_ICMDR |= ICMDR_STP;            //生成停止
           返回0;
     
       #endif

     
    /*---------------------------------------------- *
     *                                                                         *
     * DAVINCIEVM_I2C_READ( i2addr、data、len )                              *
     *                                                                         *
     *     主模式下的 I2C 读取                                            *
     *                                                                         *
     *     i2addr <- I2C 从器件地址                                       *
     *     data   <- I2C data ptr                                            *
     *     len    <-要写入的字节数                                     *
     *                                                                         *
     ******************************************************************************************************* *
    int16 DAVINCIEVM_I2C_READ( uint16 i2caddr、uint8* data、uint16 len )

       uint16 i;
       Int32超时  = 0x20000;
       Int32 TimeCount = 0;
     
       #ifdef ARM_SIDE
     
           uint16响应;
     
           cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_DATA_COUNT、&len);
           cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_SLAVE_ADDR、&i2cadr);
           cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_DIR_Receive、0);
           cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_start、0);
     
           DAVINCIEVM_WAIT (10);
     
           for (i = 0;i < len;i++)
           {
               TimeCount = 0;
               操作
               {
                   cSL_i2cGetHwStatus (i2c_handle、cSL_I2C_query_RX_RDY、&Response);
     
                   TimeCount++;
                   如果(TimeCount >= timeout)
                   {
                       DAVINCIEVM_I2C_RESET();
                       退货1000;
                   }
     
               } while (response =0);
     
               cSL_i2cRead (i2c_handle,&data[i]);
           }
     
         //CSL_i2cHwControl (i2c_handle、CSL_I2C_CMD_stop、0);
     
           返回0;
     
       #Elif DSP_Side
     
           I2C_ICCNT = len;                   //设置 len
           I2C_ICSAR = i2addr;               //设置 I2C 从器件地址
           I2C_ICMDR = ICMDR_STT              //配置为主器件读取
                     | ICMDR_MST
                     | ICMDR_IRS
                     | ICMDR_FREE
                     ;
     
           for (i = 0;i < len;i++)
           {
               TimeCount = 0;
               操作
               {
                   TimeCount++;
                   如果(TimeCount >= timeout)
                   {
                       DAVINCIEVM_I2C_RESET();
                       退货1000;
                   }
               } while (( I2C_ICSTR & ICSTR_ICRDY )=0);//等待 Rx 就绪
               DATA[i]= I2C_ICDRR;           //读取
           }
     
           I2C_ICMDR |= ICMDR_STP;            //生成停止
           返回0;
     
       #endif

     
    /*---------------------------------------------- *
     *                                                                         *
     * DAVINCIEVM_I2C_READ_variable (i2addr、data、len)                     *
     *                                                                         *
     *     主模式下的 I2C 读取                                            *
     *                                                                         *
     *     i2addr <- I2C 从器件地址                                       *
     *     data   <- I2C data ptr                                            *
     *     len    <-要写入的字节数                                     *
     *                                                                         *
     ******************************************************************************************************* *
    int16 DAVINCIEVM_I2C_READ_variable (uint16 i2caddr、uint8* data、uint16 len)

       uint16 i;
       Int32超时  = 0x20000;
       Int32 TimeCount = 0;
     
       #ifdef ARM_SIDE
     
           uint16响应;
     
           cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_DATA_COUNT、&len);
           cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_SLAVE_ADDR、&i2cadr);
           cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_DIR_Receive、0);
           cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_start、0);
     
           DAVINCIEVM_WAIT (10);
     
           for (i = 0;i < len;i++)
           {
               如果(i ==1)
               {
                   len =数据[0];
                   cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_DATA_COUNT、&len);
               }
     
               TimeCount = 0;
               操作
               {
                   cSL_i2cGetHwStatus (i2c_handle、cSL_I2C_query_RX_RDY、&Response);
     
                   TimeCount++;
                   如果(TimeCount >= timeout)
                   {
                       DAVINCIEVM_I2C_RESET();
                       退货1000;
                   }
     
               } while (response =0);
     
               cSL_i2cRead (i2c_handle,&data[i]);
           }
     
         //CSL_i2cHwControl (i2c_handle、CSL_I2C_CMD_stop、0);
     
           返回0;
     
       #Elif DSP_Side
     
           I2C_ICCNT = len;                   //设置 len
           I2C_ICSAR = i2addr;               //设置 I2C 从器件地址
           I2C_ICMDR = ICMDR_STT              //配置为主器件读取
                     | ICMDR_MST
                     | ICMDR_IRS
                     | ICMDR_FREE
                     ;
     
           for (i = 0;i < len;i++)
           {
               如果(i ==1)
               {
                   len =数据[0];
                   I2C_ICCNT = len;           //设置 len
               }
     
               TimeCount = 0;
               操作
               {
                   TimeCount++;
                   如果(TimeCount >= timeout)
                   {
                       DAVINCIEVM_I2C_RESET();
                       退货1000;
                   }
               } while (( I2C_ICSTR & ICSTR_ICRDY )=0);//等待 Rx 就绪
               DATA[i]= I2C_ICDRR;           //读取
           }
     
           I2C_ICMDR |= ICMDR_STP;            //生成停止
           返回0;
     
       #endif

     
     
     
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
     
     
    /*
     * Copyright 2005 by Spectrum Digital Incorporated。
     * 保留所有权利。 Spectrum Digital Incorporated 的财产。
     *
     * 不可分发。
     *
     
    /*
     * I2C 头文件
     *
     *
     
    ifndef I2C_
    #define I2C_
     
    #include "davincievm.h"
     
    #ifdef ARM_SIDE
     
       #include "cSL_i2c.h"
       静态 CSL_I2cHandle i2c_handle;
       静态 CSL_I2cObj   i2c_obj;
     
    #Elif DSP_Side
     
    #endif
     
    /*---------------------------------------------- *
     *                                                                         *
     * I2C 原型                                                         *
     *                                                                         *
     ******************************************************************************************************* *
    int16 DAVINCIEVM_I2C_init ();
    int16 DAVINCIEVM_I2C_CLOSE ();
    int16 DAVINCIEVM_I2C_WRITE( uint16 slaveaddr、uint8* data、uint16 len );
    int16 DAVINCIEVM_I2C_READ ( uint16 slaveaddr、uint8* data、uint16 len );
     
    #endif
     
     
      
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //在 include EX:csl_i2c.h 等中添加了更多与 I2C 相关的头文件

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    代码中仅启用写入功能的波形如下所示:(从地址0xA2 和数据0x03不匹配!)

    代码中仅启用读取功能的波形如下所示:(从地址0xA2 和数据0x03不匹配!)

    //使用中的原理图:

    数据上拉、CLK 线为0.9K 、VCC=1.8V

    建议您尽快提问。

      

    此致

    Sanjay Kumar Singh
    经理。
    Crypto & Datacom、C-D&E、
    Bharat Electronics Ltd.
    Bangalore -560013。
    PH:+91-80-22195844 

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

    你好、Pavel、我仍然没有从你提供的链接中得到任何回复。

    请按以下方式回答有关 I2C 的一般性问题:

    ADD_regI2c[0]= 0x0F;

    add_regI2c[1]=0x06;

    DAVINCIEVM_I2C_WRITE (0x51、&add_regI2c[0]、0x02);

    上述指令不会发出有效的停止波形!!!

    请告诉我们达芬奇 ARM 不是什么原因

    是否发出正确的停止?