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.

mcasp录音保存到sd卡

Other Parts Discussed in Thread: TMS320C6748

我用的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);
}