Reply by bartekbosowiec April 3, 20072007-04-03
Hi everyone,

I'm programming TMS320F2812 to talk with TLC3578 converter. The converter
is connected to McBSP port: MFSRA,MFSXA->CS, MCLKRA,MCLKXA->SCLK,
MDRA->SDO, MDXA->SDI, 1->FS. The program in in C using CCS 3.3.42.1, CPU
clock 150MHz. The piece of code  below is the essence of the program.

The problem is that I can't get to work even the McBSP port alone. I want
to send two consecutive 0xFFFF just to put TLC into default mode but my
oscilloscope shows only the first 0xFFFF is sent. The next is ignored or
so, even if I check the XRDY flag.

#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"

int transfer_in_progress = 0;

void interrupt TLC3578_ExtInt1(void);

int main(void)
{
	DINT; // wyłącz przerwania

	InitSysCtrl();

	InitPieVectTable();

	EALLOW;
    	SysCtrlRegs.LOSPCP.bit.LSPCLK = 3;
	GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8 = 1; // GPB8 is CAP4 input	
	PieVectTable.CAPINT4 = (PINT)TLC3578_ExtInt1;
	EvbRegs.CAPCONB.bit.CAP4EDGE = 2; //falling edge
	EvbRegs.CAPCONB.bit.CAP45EN = 1; //enable CAP4,5 Unit
	IER |= M_INT5; // enable INT5 of IER to get the CAP interrupt

	GpioMuxRegs.GPFMUX.bit.MCLKXA_GPIOF8 = 1;
	GpioMuxRegs.GPFMUX.bit.MCLKRA_GPIOF9 = 1;
	GpioMuxRegs.GPFMUX.bit.MFSXA_GPIOF10 = 1; 
	GpioMuxRegs.GPFMUX.bit.MFSRA_GPIOF11 = 1;
	GpioMuxRegs.GPFMUX.bit.MDXA_GPIOF12 = 1;
	GpioMuxRegs.GPFMUX.bit.MDRA_GPIOF13 = 1;

	McbspaRegs.SPCR2.bit.FRST = 0; // reset frame generator
	McbspaRegs.SPCR2.bit.GRST = 0; //reset generator
	McbspaRegs.SPCR1.bit.RRST = 0; //reset receiver
	McbspaRegs.SPCR2.bit.XRST = 0; //reset transmitter

	McbspaRegs.PCR.bit.FSXM = 1;
	McbspaRegs.PCR.bit.CLKXM = 1;
	McbspaRegs.PCR.bit.FSXP = 1;
	McbspaRegs.PCR.bit.FSRP = 1;
	McbspaRegs.PCR.bit.CLKXP = 1;
	McbspaRegs.PCR.bit.CLKRP = 1;

	McbspaRegs.XCR2.bit.XDATDLY = 0; //0 bit data delay
	McbspaRegs.RCR2.bit.RDATDLY = 0; //0 bit data delay
	McbspaRegs.XCR1.bit.XWDLEN1 = 2; //word length
	McbspaRegs.RCR1.bit.RWDLEN1 = 2; //word length

	McbspaRegs.SPCR1.bit.CLKSTP = 2;
	McbspaRegs.SRGR2.bit.CLKSM = 1;
	McbspaRegs.SRGR1.bit.CLKGDV = 4;

	McbspaRegs.SPCR2.bit.GRST = 1; //enable generator 
	McbspaRegs.SPCR2.bit.XRST = 1; //enable transmitter
	McbspaRegs.SPCR1.bit.RRST = 1; //enable receiver 
	McbspaRegs.SPCR2.bit.FRST = 1; // enable frame generator
	{
		volatile int tick;
		for(tick = 0; tick < 100; tick++);
	}

	GpioMuxRegs.GPADIR.bit.GPIOA14 = 1;
	
	EDIS;
	EINT; // w&#322;&#261;cz przerwania

	PieCtrlRegs.PIEIFR5.bit.INTx5 = 0;
	EvbRegs.EVBIMRC.bit.CAP4INT = 1;
	McbspaRegs.DXR1.all = 0xFFFF;
	{
		volatile int tick;
		for(tick = 0; tick < 50; tick++);
	}	
	PieCtrlRegs.PIEIFR5.bit.INTx5 = 0;
	EvbRegs.EVBIMRC.bit.CAP4INT = 1;
	McbspaRegs.DXR1.all = 0xFFFF;

	while(1)
	{
		if(!transfer_in_progress)
		{
			transfer_in_progress = 1;
			PieCtrlRegs.PIEIFR5.bit.INTx5 = 0;
			PieCtrlRegs.PIEIER5.bit.INTx5 = 1;
			EvbRegs.EVBIMRC.bit.CAP4INT = 1; 
			McbspaRegs.DXR1.all = 0xD000;
		}
	}

	return 0;
}

void interrupt TLC3578_ExtInt1(void)
{
	static long i = 0;

	transfer_in_progress = 0;
	if(i++ >= 1000)
	{
		i = 0;
		GpioDataRegs.GPATOGGLE.bit.GPIOA14 = 1;
	}

	EvbRegs.EVBIFRC.all = BIT0;
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP5;
}

Can anyone show me what I'm doing wrong or give example of code?

regards
Bartek



_____________________________________
Do you know a company who employs DSP engineers?  
Is it already listed at http://dsprelated.com/employers.php ?