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łą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 ?