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.

[参考译文] CCS/TMS320C5545:I2C EEPROM 编程

Guru**** 2617685 points

Other Parts Discussed in Thread: PCM5142, CC8530

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/658917/ccs-tms320c5545-i2c-eeprom-programing

器件型号:TMS320C5545

工具/软件:Code Composer Studio

你(们)好

我想在 I2C EEPROM 中对代码进行编程。

我的问题是它不能正常工作。

首先、我使用 HEX55.exe 制作了 bin 文件

然后我通过示例代码'programmer'对 bin 文件进行了编程

但我的板工作不好。 我更改了要检查的代码。

如果 DMA 更改了缓冲区数据、则 GPIO 9为高电平。 但它始终很低。  

我认为 DMA 不起作用。

这是我的代码。 我的代码正在通过 DMA 接收 CC8530数据,并将 DSP 数据发送到 DAC (PCM5142)

--------------------------------------------------

#include "cSL_dma.h"

#include "CSL_I2S.h"

#include

#include

#include "cSL_sysctrl.h"

#include "cSL_intc.h"

#include "DAC_PCM5142.h"

#include "CSL_PLL.h"

#include "cSL_general.h"

#include "CSL_pllAux.h"

#define CSL_TEST_FAILED      (1)

#define CSL_TEST_PASSED      (0)

#define CSL_DMA0_CH0       (0)

#define CSL_I2S_DMA_BUF_LEN (88)

#define DMA_DATA_LENGTH      CSL_I2S_DMA_BUF_LEN*4;

CSL_DMA_ChannelObj dmaObj0、dmaObj1、dmaObj2、dmaObj3;

CSL_DMA_Handle dmaLeftTxHandle;

CSL_DMA_Handle dmaRightTxHandle;

CSL_DMA_Handle dmaLeftRxHandle;

CSL_DMA_Handle dmaRightRxHandle;

CSL_DMA_Config dmaConfig;

CSL_I2sHandle  hI2、hI2s_2;

CSL_IRQ_Dispatch   调度表;

PLL_Obj pllObj;

PLL_Config pllCfg1;

pll_handle hPll;

PLL_Config * pConfigInfo;

PLL_Config pllCfg_12p288MHz ={0x8173、0x8000、0x0806、0x0000};

PLL_Config pllCfg_40MHz   ={0x8988、0x8000、0x0806、0x0201};

PLL_Config pllCfg_60MHz   ={0x8724、0x8000、0x0806、0x0000};

PLL_Config pllCfg_75MHz   ={0x88ED、0x8000、0x0806、0x0000};

PLL_Config pllCfg_100MHz  ={0x8BE8、0x8000、0x0806、0x0000};

PLL_Config pllCfg_120MHz  ={0x8E4A、0x8000、0x0806、0x0000};

易失性 UINT16 dmaTxFrameCount = 0、dmaRxFrameCount=0、dmaIntCount、toggle;

#pragma DATA_ALIGN (i2sDmaWriteLeftBuff、32);

uint32 i2sDmaWriteLeftBuff[CSL_I2S_DMA_BUF_LEN];

#pragma DATA_ALIGN (i2sDmaWriteRightBuff、32);

uint32 i2sDmaWriteRightBuff[CSL_I2S_DMA_BUF_LEN];

#pragma DATA_ALIGN (i2sDmaReadLeftBuff、32);

uint32 i2sDmaReadLeftBuff[CSL_I2S_DMA_BUF_LEN];

#pragma DATA_ALIGN (i2sDmaReadRightBuff、32);

uint32 i2sDmaReadRightBuff[CSL_I2S_DMA_BUF_LEN];

中断空 DmaIsr (空);

空用户算法(空);

void PLL_sample ()

  CSL_Status 状态;

  PLL_init (&pllObj、CSL_PLL_INST_0);

  hPll =(PLL_Handle)(&pllObj);

  PLL_RESET (hPll);

  /*将 PLL 配置为100MHz */

  pConfigInfo =&pllCfg_100MHz;

 PLL_CONFIG (hPll、pConfigInfo);

//PLL 配置完成

//以下代码用于演示其他 CSL PLL API

  PLL_getconfig (hPll、&pllCfg1);//演示 PLL 配置

  PLL_BYPASS (hPll);//演示 PLL 旁路和断电

  PLL_ENABLE (hPll);//演示 PLL 使用之前的配置加电和启用

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

空 I2S_SET (空)

I2S_Config hwconfig;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  I2S_0

hI2 = I2S_open (I2S_INSTANCE0、DMA_polled、I2S_CHAN_STEREO);

SYS_setEBSR (CSL_EBSR_FIELD_SP0MODE、CSL_EBSR_SP0MODE_1); // i2s0端口被置位

/**设置配置结构的值*/

hwconfig.datatype = I2S_立体声_enable;       // 0立体声 单声道

//hwconfig.loopBackMode = I2S_loopback_enable;      // 1启用0禁用

hwconfig.loopBackMode    = I2S_loopback_disable;      // 1启用0禁用

hwconfig.fsPol = I2S_FSPOL_LOW;         // ws low =左通道

hwconfig.clkPol = I2S_FALLING_EDGE;        //在下降沿对接收数据进行采样,并将发送数据移入

                              //位时钟的上升沿。

hwconfig.datadelay = I2S_DATADELAY_ONEBIT;     //0 -> 1位延迟1->2位延迟

hwconfig.datapack = I2S_DATAPACK_DISABLE;     //

hwconfig.signext = I2S_SIGNEXT_DISABLE;     //单词扩展

hwconfig.wordLen = I2S_WORDLEN_16;        // 0-8、1-10、2-12、3-14、4-16、 5-18、6-20、7-22、8-24

//hwconfig.i2sMode = I2S_MASTER;          // 0个从设备,1个主设备

hwconfig.i2sMode       = I2S_SLAVE;          // 0个从设备,1个主设备

hwconfig.FError = I2S_FSERROR_DISABLE;

hwconfig.OutError = I2S_OUERROR_DISABLE;

I2S_setup (hI2、hwconfig);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  I2S_2

hI2s_2 = I2S_open (I2S_instance2、dma_polled、I2S_CHAN_STEREO);

  SYS_setEBSR (CSL_EBSR_FIELD_PPMODE、CSL_EBSR_PPMODE_6);  // i2s2模式设置

  /**设置配置结构的值         *

  hwconfig.datatype       = I2S_立体声_ENABLE;       // 0立体声 单声道

  //hwconfig.loopBackMode      = I2S_LOOP_ENABLE;      // 1启用0禁用

  hwconfig.loopBackMode    = I2S_loopback_disable;      // 1启用0禁用

  hwconfig.fsPol        = I2S_FSPOL_LOW;         //

  hwconfig.clkPol        = I2S_FALLING_EDGE;        //在下降沿对接收数据进行采样,并将发送数据移入

                                //位时钟的上升沿。

  hwconfig.datadalay      = I2S_DATADELAY_ONEBIT;     //0 -> 1位延迟1->2位延迟

  hwconfig.datapack       = I2S_DATAPACK_DISABLE;     //

  hwconfig.signext       = I2S_SIGNEXT_DISABLE;     //单词扩展

  hwconfig.wordLen       = I2S_WORDLEN_16;        // 0-8、1-10、2-12、3-14、4-16、 5-18、6-20、7-22、8-24

//  hwconfig.i2sMode       = I2S_MASTER;          // 0个从设备,1个主设备

  hwconfig.i2sMode       = I2S_SLAVE;          // 0个从设备,1个主设备

  //hwconfig.clkDiv        = I2S_CLKDIV8;         //I2Sn_CLK =系统时钟/(2CLKDIV+1)

  //hwconfig.fsDiv        = I2S_FSDIV256;         //I2Sn_FS = I2Sn_CLK /(2FSDIV+3)

  hwconfig.FError        = I2S_FSERROR_DISABLE;

  hwconfig.OuError       = I2S_OUERROR_DISABLE;

  I2S_setup (hI2s_2、hwconfig);

void dma_set (void)

  内部16.       状态= CSL_TEST_FAILED、ifrValue;

  IRQ_DISABLE (DMA_EVENT);

  IRQ_CLEAR (DMA_EVENT);

  CSL_SYSCTRL_REGS->DMAIER = 0x0000;

  ifrValue = CSL_sysctrl_regs->DMAIFR;

  cSL_sysctrl_regs->DMAIFR |= ifrValue;

  IRQ_plug (DMA_EVENT、&DmaIsr);// DMA 中断置1

dma_init(); //dma 时钟启用

  IRQ_ENABLE (DMA_EVENT);// DMA 中断使能

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// I2S0_RX_LEFT 通道 DMA 通道1

dmaConfig.pingPongMode = CSL_DMA_PING_PON_ENABLE;

dmaConfig.autoMode   = CSL_DMA_AUTORELOAD_ENABLE;

dmaConfig.burstLen   = CSL_DMA_TXBUST_1WORD;

dmaConfig.trigger   = CSL_DMA_EVENT_TRIGGER;

dmaConfig.dmaEvt    = CSL_DMA_EVT_I2S0_RX;

dmaConfig.dmaInt    = CSL_DMA_INTERRUPT_ENABLE;

dmaConfig.chanDir   = CSL_DMA_READ;

dmaConfig.trfType   = CSL_DMA_TRANSIT_IO_MEMORY;

dmaConfig.dataLen   = dma_data_length;

dmaConfig.srcAddr   =(uint32)&CSL_I2S0_regs->I2SRXLT0;// I2S0_I2SRXLT0

dmaConfig.destAddr   =(uint32) i2sDmaReadLeftBuff;

dmaLeftRxHandle = DMA_open (CSL_DMA_CHAN1、&dmaObj0、STATUS);

  dma_config (dmaLeftRxHandle、&dmaConfig);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// I2S0_RX_RIGHT 通道 DMA CH2

dmaConfig.pingPongMode = CSL_DMA_PING_PON_ENABLE;

dmaConfig.autoMode   = CSL_DMA_AUTORELOAD_ENABLE;

dmaConfig.burstLen   = CSL_DMA_TXBUST_1WORD;

dmaConfig.trigger   = CSL_DMA_EVENT_TRIGGER;

dmaConfig.dmaEvt    = CSL_DMA_EVT_I2S0_RX;

dmaConfig.dmaInt    = CSL_DMA_INTERRUPT_ENABLE;

dmaConfig.chanDir   = CSL_DMA_READ;

dmaConfig.trfType   = CSL_DMA_TRANSIT_IO_MEMORY;

dmaConfig.dataLen   = dma_data_length;

dmaConfig.srcAddr   =(uint32)&CSL_I2S0_regs->I2SRXRT0;//I2S0_I2SRXRT0

dmaConfig.destAddr   =(uint32) i2sDmaReadRightBuff;

dmaRightRxHandle = DMA_open (CSL_DMA_CHAN2、&dmaObj1、STATUS);

  dma_config (dmaRightRxHandle、&dmaConfig);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// I2S2_TX_LEFT 通道 DMA 通道 CH4

  dmaConfig.pingPongMode = CSL_DMA_PING_PON_ENABLE;

  dmaConfig.autoMode   = CSL_DMA_AUTORELOAD_ENABLE;

  dmaConfig.burstLen   = CSL_DMA_TXBUST_1WORD;

  dmaConfig.trigger   = CSL_DMA_EVENT_TRIGGER;

  dmaConfig.dmaEvt    = CSL_DMA_EVT_I2S2_TX;

  dmaConfig.dmaInt    = CSL_DMA_INTERRUPT_ENABLE;

  dmaConfig.chanDir   = CSL_DMA_WRITE;

  dmaConfig.trfType   = CSL_DMA_TRANSIT_IO_MEMORY;

  dmaConfig.dataLen   = dma_data_length;

  dmaConfig.srcAddr   =(uint32) i2sDmaWriteLeftBuff;

//  dmaConfig.srcAddr   =(uint32) i2sDmaReadLeftBuff;

  dmaConfig.destAddr   =(UINT32)(0x2A08);

  dmaLeftTxHandle = DMA_open (CSL_DMA_CHAN4、&dmaObj2、STATUS);

  dma_config (dmaLeftTxHandle、&dmaConfig);

  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// I2S2_TX_RIGHT 通道 DMA ch5

  dmaConfig.pingPongMode = CSL_DMA_PING_PON_ENABLE;

  dmaConfig.autoMode   = CSL_DMA_AUTORELOAD_ENABLE;

  dmaConfig.burstLen   = CSL_DMA_TXBUST_1WORD;

  dmaConfig.trigger   = CSL_DMA_EVENT_TRIGGER;

  dmaConfig.dmaEvt    = CSL_DMA_EVT_I2S2_TX;

  dmaConfig.dmaInt    = CSL_DMA_INTERRUPT_ENABLE;

  dmaConfig.chanDir   = CSL_DMA_WRITE;

  dmaConfig.trfType   = CSL_DMA_TRANSIT_IO_MEMORY;

  dmaConfig.dataLen   = dma_data_length;

  dmaConfig.srcAddr   =(uint32) i2sDmaWriteRightBuff;

//  dmaConfig.srcAddr   =(uint32) i2sDmaReadRightBuff;

  dmaConfig.destAddr   =(uint32)(0x2A0C);

  dmaRightTxHandle = DMA_open (CSL_DMA_CHAN5、&dmaObj3、STATUS);

  dma_config (dmaRightTxHandle、&dmaConfig);

中断空 DmaIsr (空)

  易失性 uint16 ifrValue;

  ifrValue = CSL_sysctrl_regs->DMAIFR;

  cSL_sysctrl_regs->DMAIFR |= ifrValue;

  IF (ifrValue & 4)          // DMA 通道4,5发送

  {

    dmaTxFrameCount++;

  }

  IF (ifrValue & 5)

  {

    dmaTxFrameCount++;

  }

  IF (ifrValue & 1)         // DMA 通道1、2 Rx

  {

    dmaRxFrameCount++;

  }

  IF (ifrValue & 2)

  {

    dmaRxFrameCount++;

  }

  dmaIntCount++;

void main (void)

Int16  环流器;

uint32 check_buff = 0;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 初始化

  CSL_SYSCTRL_REGS->PCGCR1 = 0x0000;

  CSL_SYSCTRL_REGS->PCGCR2 = 0x0000;

  //绕过 PLL 作为系统时钟源

  asm ("  *端口(#0x1C1F)=#0x0 ");//时钟配置 MSW 寄存器

  // 在 CLK_SEL = 0时将 PLL 编程为100MHz

  asm ("  *端口(#0x1c20)=#0x8BE8 ");//PLL 控制1寄存器

  asm ("  *端口(#0x1c21)=#0x8000 ");//PLL 控制2寄存器

  asm ("  *端口(#0x1c22)=#0x0806 ");//PLL Control 3 reg

  asm ("  *端口(#0x1C23)=#0x0000 ");//PLL 控制4寄存器

  //等待至少4毫秒以锁定 PLL

  asm ("  repeat (0xC350) ");

  asm ("     NOP"   );

  asm ("  *端口(#0x1c1F)=#0x0001 ");//时钟配置 MSW 寄存器

  //启用 mport 并禁用 HWA

  *(volatile ioport UINT16 *) 0x0001 = 0x020E;

  asm ("  idle");

  IRQ_globalDisable();

  IRQ_disableAll();

  IRQ_CLEARALL();

  //重置所有外设

  CSL_SYSCTRL_REGS->PSRCR = 0x0020;

  CSL_SYSCTRL_REGS->PRCR = 0x00BF;

  //pll_sample();

  //CSL_SYSCTRL_REGS->CGCR1 =0x87CC;//SYSCLK 65.563Mhz

  CSL_GPIO_regs->IODIR2 = 0x0001; //GPIO 16输出设置(DAC XSMT)

  CSL_GPIO_regs->IOOUTSTATA2=0x0001;// 1输出

  for (looper=0;looper < CSL_I2S_DMA_BUF_LEN;looper++)

  {

    i2sDmaWriteLeftBuff[looper]=0;

    i2sDmaReadLeftBuff[环] = 0;

    i2sDmaWriteRightBuff[looper]=0;

    i2sDmaReadRightBuff[looper]=0 ;

  }

/*

  memset (&i2sDmaWriteLeftBuff、0、sizeof (i2sDmaWriteLeftBuff);

  memset (&i2sDmaWriteLeftBuff、0、sizeof (i2sDmaWriteLeftBuff);

  memset (&i2sDmaWriteLeftBuff、0、sizeof (i2sDmaWriteLeftBuff);

  memset (&i2sDmaWriteLeftBuff、0、sizeof (i2sDmaWriteLeftBuff);

*

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

  PCM5142_init ();// DAC 设置(i2c)

I2S_SET ();//I2S 置位

dma_set();// dma set

  IRQ_globalEnable();

I2S_transEnable (hI2、TRUE);// I2S_0启动

  I2S_transEnable (hI2s_2、true);// I2S_2启动

//  dma_start (dmaLeftRxHandle);

//  dma_start (dmaRightRxHandle);

//  dma_start (dmaLeftTxHandle);

//  dma_start (dmaRightTxHandle);

  while (1)

  {

    /*

    if (切换)

    {

      CSL_GPIO_regs->IOOUTSTATA2=0x0001;// 1输出

      TOGGLE = 0;

    }

    其他

    {

      CSL_GPIO_regs->IOOUTSTATA2=0x0000;// 1输出

      切换= 1;

    }

*

    if (check_buff=i2sDmaReadLeftBuff[1])(如果(check_buff=i2sDmaReadLeftBuff[1])

    {

      CSL_GPIO_regs->IOOUTSTATA2=0x0000;// 1输出

    }

    其他

    {

      CSL_GPIO_regs->IOOUTSTATA2=0x0001;// 1输出

    }

    check_buff=i2sDmaReadLeftBuff[1];

    UserAlgorith();//receive 和 transmit

  }

空用户算法(空)

  int i;

  if (!dmaRxFrameCount)

  {

    /* Start Left Rx DMA */

    DMA_START (dmaLeftRxHandle);

    /*启动右 RX DMA */

    DMA_START (dmaRightRxHandle);

  }

  IF (dmaRxFrameCount >= 2)

  {

    dmaRxFrameCount=0;

    (i=0;<CSL_I2S_DMA_BUF_LEN; i++)

    {

      i2sDmaWriteLeftBuff[i] = i2sDmaReadLeftBuff[i];

      i2sDmaWriteRightBuff[i]= i2sDmaReadRightBuff[i];

    }

//     memcpy (&i2sDmaWriteLeftBuff、i2sDmaReadLeftBuff、sizeof (i2sDmaWriteLeftBuff));//Rx 2 -> LeftCPY

//     memcpy (&i2sDmaWriteRightBuff、i2sDmaReadRightBuff、sizeof (i2sDmaWriteRightBuff));

    /*--在此处插入算法--*/

  }

  if (!dmaTxFrameCount)

  {

    /*开始左 Tx DMA */

    DMA_START (dmaLeftTxHandle);

    /*右启动 Tx DMA */

    DMA_START (dmaRightTxHandle);

  }

  /*清除 DMA 帧计数*/

  if (dmaTxFrameCount>=2)

  {

    dmaTxFrameCount = 0;

  }

--------------------------------------------------------------------

我的问题是什么? 请回答我。。

谢谢你