我用的TMS320C6748 LCDK开发板,目前sd卡的读写没有问题,我想从mcasp回环程序中提取输入的音频保存在sd卡中,应该怎样去实现?下面是我的代码
int
Cmd_re(int argc, char *argv[])
{
FRESULT fresult;
UINT ByteWrite;
unsigned short parToSend;
unsigned short parToLink;
int total = 0;
/* Set up pin mux for I2C module 0 为I2C模块0设置PINMUX*/
I2CPinMuxSetup(0);
McASPPinMuxSetup();
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_MCASP0, PSC_POWERDOMAIN_ALWAYS_ON,
PSC_MDCTL_NEXT_ENABLE);
/* Power up EDMA3CC_0 and EDMA3TC_0 启动EDMA3通道控制器和传输控制器*/
PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_CC0, PSC_POWERDOMAIN_ALWAYS_ON,
PSC_MDCTL_NEXT_ENABLE);
PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_TC0, PSC_POWERDOMAIN_ALWAYS_ON,
PSC_MDCTL_NEXT_ENABLE);
#ifdef _TMS320C6X
// Initialize the DSP interrupt controller 初始化DSP中断控制器
IntDSPINTCInit();
#else
/* Initialize the ARM Interrupt Controller. 初始化ARM中断控制器*/
IntAINTCInit();
#endif
/* Initialize the I2C 0 interface for the codec AIC31
* 初始化编解码器AIC31的I2C 0接口*/
I2CCodecIfInit(SOC_I2C_0_REGS, INT_CHANNEL_I2C, I2C_SLAVE_CODEC_AIC31);
EDMA3Init(SOC_EDMA30CC_0_REGS, 0);
EDMA3IntSetup();
McASPErrorIntSetup();
#ifdef _TMS320C6X
IntGlobalEnable();
#else
/* Enable the interrupts generation at global level
* 启动所有级别的中断生成*/
IntMasterIRQEnable();
IntGlobalEnable();
IntIRQEnable();
#endif
/*
** Request EDMA channels. Channel 0 is used for reception and
** Channel 1 is used for transmission
** 请求EDMA通道,通道0用于接收,通道1用于发送
*/
EDMA3RequestChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA,
EDMA3_CHA_MCASP0_TX, EDMA3_CHA_MCASP0_TX, 0);
EDMA3RequestChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA,
EDMA3_CHA_MCASP0_RX, EDMA3_CHA_MCASP0_RX, 0);
/* Initialize the DMA parameters 初始化DMA参数*/
I2SDMAParamInit();
/* Configure the Codec for I2S mode 配置I2S模式的编解码器*/
AIC31I2SConfigure();
/* Configure the McASP for I2S 配置I2S模式的McASP*/
McASPI2SConfigure();
/* Activate the audio transmission and reception 激活音频发送和接收*/
I2SDataTxRxActivate();
#ifdef MMCSD_PERF
unsigned int thrPutRead = 0;
unsigned int timeRead = 0;
unsigned int ticksRead = 0;
unsigned int totalBytesRead = 0;
#endif
/*
** First, check to make sure that the current path (CWD), plus the file
** name, plus a separator and trailing null, will all fit in the temporary
** buffer that will be used to hold the file name. The file name must be
** fully specified, with path, to FatFs.
*/
if(strlen(g_cCwdBuf) + strlen(argv[1]) + 1 + 1 > sizeof(g_cTmpBuf))
{
UARTprintf("Resulting path name is too long\n");
return(0);
}
/*
** Copy the current path to the temporary buffer so it can be manipulated.
*/
strcpy(g_cTmpBuf, g_cCwdBuf);
/*
** If not already at the root level, then append a separator.
*/
if(strcmp("/", g_cCwdBuf))
{
strcat(g_cTmpBuf, "/");
}
/*
** Now finally, append the file name to result in a fully specified file.
*/
strcat(g_cTmpBuf, argv[1]);
/*
** Open the file for reading.
*/
fresult = f_open(&g_sFileObject, g_cTmpBuf, (BYTE)FA_WRITE | FA_CREATE_ALWAYS);
/*
** If there was some problem opening the file, then return an error.
*/
if(fresult != FR_OK)
{
return(fresult);
}
while(1)
{
if(lastFullRxBuf != lastSentTxBuf)
{
/*
** Start the transmission from the link paramset. The param set
** 1 will be linked to param set at PAR_TX_START. So do not
** update paRAM set1.
** 从链接参数开始传输,paRAM设置参数1将会链接到PAR_TX_START设置的参数.所以不要将paRAM更新设置1
*/
parToSend = PAR_TX_START + (parOffTxToSend % NUM_PAR);
parOffTxToSend = (parOffTxToSend + 1) % NUM_PAR;
parToLink = PAR_TX_START + parOffTxToSend;
lastSentTxBuf = (lastSentTxBuf + 1) % NUM_BUF;
/* Copy the buffer 复制缓冲区*/
memcpy((void *)txBufPtr[lastSentTxBuf],
(void *)rxBufPtr[lastFullRxBuf],
AUDIO_BUF_SIZE);
/*
** Send the buffer by setting the DMA params accordingly.
** 通过设置DMA params来发送缓冲区
** Here the buffer to send and number of samples are passed as
** parameters. This is important, if only transmit section
** is to be used.
** 这里要发送的缓冲区和样本数作为参数传递。 这是很重要的,如果只使用传输部分。
*/
BufferTxDMAActivate(lastSentTxBuf, NUM_SAMPLES_PER_AUDIO_BUF,
(unsigned short)parToSend,
(unsigned short)parToLink);
fresult = f_write(&g_sFileObject, (void *)rxBufPtr[lastFullRxBuf], sizeof((void *)rxBufPtr[lastFullRxBuf]) - 1, &ByteWrite );
if(fresult != FR_OK)
{
UARTprintf("\n");
return(fresult);
}
total++;
if(total >= 15)
break;
}
}
UARTprintf("the recording is complete \n");
#ifdef MMCSD_PERF
/*
** Print card bus-width, transfer speed.
*/
UARTPuts("\r\n ************ MMCSD Settings ************ ", -1);
UARTPuts("\r\n BUS WIDTH (BIT) : ", -1);
UARTPutNum((unsigned int) GET_SD_CARD_BUSWIDTH(sdCard));
UARTPuts("\r\n TRANSFER SPEED (MHz) : ", -1);
UARTPutNum((unsigned int) GET_SD_CARD_FRE(sdCard));
UARTPuts("\r\n **************************************** \r\n", -1);
/*
** Compute and print performance for file read.
*/
/* Time read in milliSecs */
timeRead = (unsigned int)(ticksRead / (CLK_EXT_CRYSTAL_SPEED / 1000));
thrPutRead = ((totalBytesRead / timeRead) * 1000) ;
UARTPuts("\r\n ****** MMCSD File Read Performance ***** ", -1);
UARTPuts("\r\n READ BUFFER SIZE (BYTES) : ", -1);
UARTPutNum((unsigned int)DATA_BUF_SIZE);
UARTPuts("\r\n TOTAL BYTES TRANSFERRED : ", -1);
UARTPutNum((unsigned int)totalBytesRead);
UARTPuts("\r\n TIME TAKEN (IN MILLISECS) : ", -1);
UARTPutNum((unsigned int)(timeRead));
UARTPuts("\r\n THROUGHPUT (BYTES / SECS ) : ", -1);
UARTPutNum((unsigned int)thrPutRead);
UARTPuts("\r\n **************************************** \r\n", -1);
#endif
/*
** Close the file.
*/
fresult = f_close(&g_sFileObject);
/*
** If there was an error closing, then print a newline and return the
** error to the user.
*/
if(fresult != FR_OK)
{
UARTPuts("\n", -1);
return(fresult);
}
return(0);
}