Other Parts Discussed in Thread: PCM5142, CC8530
器件型号: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;
}
}
--------------------------------------------------------------------
我的问题是什么? 请回答我。。
谢谢你