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.

TMS320C5535 - Codec read/write code in an interrupt based routine

Other Parts Discussed in Thread: TMS320C5535

Hi.
I created the Getting Started Application ("Texas Instruments C5505 Teaching Materials CD-ROM", on chapter 1), using TMS320C5535 and CCS5. It's working fine to me. I'm using headphones and microphone on the DSP, and I can listen my own voice while I talking. This is the C code example by Texas:

#include "stdio.h"
#include "usbstk5505.h"
#include "aic3204.h"
#include "PLL.h"
#include "stereo.h"

Int16 left_input;
Int16 right_input;
Int16 left_output;
Int16 right_output;
Int16 mono_input;


#define SAMPLES_PER_SECOND 48000

unsigned long int i = 0;

void main( void ) 
{
    USBSTK5505_init( ); // Initialize BSL
	pll_frequency_setup(100); //Initialize PLL
    aic3204_hardware_init(); // Initialise hardware interface and I2C for code
	aic3204_init(); // Initialise the AIC3204 codec

	/* Setup sampling frequency and 30dB gain for microphone */
    set_sampling_frequency_and_gain(SAMPLES_PER_SECOND, 30);	
  
    asm(" bclr XF");
   
 	for ( i = 0  ; i < SAMPLES_PER_SECOND * 600L  ;i++  )
 	{

     aic3204_codec_read(&left_input, &right_input); // Configured for one interrupt per two channels.
   
     mono_input = stereo_to_mono(left_input, right_input);
   
     left_output =  left_input;     // Directly connect inputs to outputs.
     right_output = right_input;    //  
    
     aic3204_codec_write(left_output, right_output);
 	}

   /* Disable I2S and put codec into reset */ 
    aic3204_disable();

    printf( "\n***Program has Terminated***\n" );
    SW_BREAKPOINT;
}

I'd like measure MIPS on C5535. In this post there is an attached code example and an explanation how to do this (using Timer in C55xx device): http://e2e.ti.com/support/dsp/c5000/f/109/t/48231.aspx.

To use this code example, I need change my codec read/write code to an interrupt based routine. First, I converted my application in a DSP/BIOS application:
File->New->CCS Project
Family: C5500
Device: TMS320C5535
From the project templates and examples: DSP/BIOS v5.xx Examples->ezdsp5535 Examples->hello example
Finish and Build Project
In hello.tcf file, right click System->Global Settings
Memory Model= HUGE, Apply, OK, then File->Save
In the project Properties: --ptrdiff_size = 32, --memory_Model = huge
OK, Build Project, and it works fine, too.
Then:
- I copied the Getting Started Application sources (Chapter 1) to my ezdsp5535 Hello Example.
- I copied the source files from http://processors.wiki.ti.com/index.php/Porting_C5000_Teaching_ROM_to_C5535_eZdsp.
- I deleted lnkx.cmd file.
- I deleted "main.c", and my "hello.c" like this:

#include <std.h>
#include <clk.h>
#include <idl.h>
#include <log.h>
#include <sem.h>
#include <swi.h>
#include <tsk.h>

#include "hellocfg.h"

#include "csl_intc.h" // to use interrupt

#include "stdio.h"
#include "usbstk5505.h"
#include "aic3204.h"
#include "PLL.h"
#include "stereo.h"

Int16 left_input;
Int16 right_input;
Int16 left_output;
Int16 right_output;
Int16 mono_input;

#define SAMPLES_PER_SECOND 8000

unsigned long int i = 0;

/* Reference the start of the interrupt vector table */
/* This symbol is defined in file vectors.asm        */
extern void VECSTART(void);

Void main()
{
	// ========================= application init =====================
    USBSTK5505_init( );
 	pll_frequency_setup(100);
    aic3204_hardware_init();
 	aic3204_init();
    set_sampling_frequency_and_gain(SAMPLES_PER_SECOND, 15);
    // ===================================================================


    IRQ_globalDisable(); // Disable interrupt
	IRQ_clearAll(); // Clear any pending interrupts
	IRQ_disableAll(); // Disable all the interrupts
    IRQ_setVecs((Uint32)(&VECSTART)); // Initialize Interrupt Vector table

    //IRQ_enable( .... ); // What interrupt ??????????
    IRQ_globalEnable();

    return;
}

// Is it correct ???
interrupt void my_interrupt(void)
{
	// codec read
	Int16 left_input;
	Int16 right_input;

	left_input = I2S2_W0_MSW_R; // Left intput
	right_input = I2S2_W1_MSW_R; // Right intput

	// codec write
	I2S2_W0_MSW_W = left_input;  // Left output
    I2S2_W0_LSW_W = 0;
    I2S2_W1_MSW_W = right_input; // Right output
    I2S2_W1_LSW_W = 0;
}

In hello.tcf file, right click Scheduling->HWI, I can see several interrupts HWI:

What HWI should I use? Is this correct way to change my codec read/write code to an interrupt based routine ? Could anyone help me implement this routine, please? (Posting a example code, or indicating some material).


Thank you so much

Code Composer Studio Version: 5.5.0.00077
DSP/BIOS 5.42.1.09
TMS320C5535 eZDSP

(English isn’t my first language, so please excuse any mistakes)

  • Would you've tried the Chip Support Library I2S interrupt example for reference? Please download v3.03 from the following link: http://www.ti.com/tool/sprc133

    This example will not be specifically for C5535, but atleast they can demonstrate how to write interrupt-based i2s transmission code. Specifically the example: csl_i2s_IntcExample.

    It uses I2S0 for a loopback and PROG0 and PROG1 interrupts for I2S0Tx and I2S0Rx. You may refer the sequence as in this example.

    Moreover, the I2S module is very much the same in c5535 as well as in C5504/05/14/15.