Dear sir
In my own design of TMS320F28062, i want communicate with TMC429-LI via SPI-B Channel (8bit), but some problem. When i transmit data will stored TX BUFF but SPIDAT Register garbage value.then after receive value in RX BUFF garbage. SPI parameter and function Given below.
void InitSpibGpio(void)
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0; // Enable pull-up on GPIO12 (SPISIMOB)
GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0; // Enable pull-up on GPIO13 (SPISOMIB)
GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0; // Enable pull-up on GPIO14 (SPICLKB)
GpioCtrlRegs.GPAPUD.bit.GPIO15 = 0; // Enable pull-up on GPIO15 (SPISTEB)
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 3; // Asynch input GPIO12 (SPISIMOB)
GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 3; // Asynch input GPIO13 (SPISOMIB)
GpioCtrlRegs.GPAQSEL1.bit.GPIO14 = 3; // Asynch input GPIO14 (SPICLKB)
GpioCtrlRegs.GPAQSEL1.bit.GPIO15 = 3; // Asynch input GPIO15 (SPISTEB)
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 3; // Configure GPIO12 as SPISIMOB
GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 3; // Configure GPIO13 as SPISOMIB
GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 3; // Configure GPIO14 as SPICLKB
GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 3; // Configure GPIO15 as SPISTEB
EDIS;
}
void spi_initB(void)
{
SpibRegs.SPICCR.all =0x0007;
SpibRegs.SPICTL.all =0x0006;
SpibRegs.SPIBRR =0x007F; // SPI Baud Rate = LSPCLK/(SPIBRR+1) =32/16 =2MHz
SpibRegs.SPICCR.all =0x00C7;
SpibRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}
void spi_fifo_initB()
{
SpibRegs.SPIFFTX.all=0xE040;
SpibRegs.SPIFFRX.all=0x2044;
SpibRegs.SPIFFCT.all=0x0000;
}
void InitSPI429(void)
{
InitSpibGpio();
// Initialize the Spi FIFO
spi_fifo_initB();
// init SPI
spi_initB();
}
void Write428Short(Uint8 Address, int32 Value)
{
Uint8 Write[4], Read[4];
Write[0]=Address;
Write[1]=0;
Write[2]=Value >> 8;
Write[3]=Value & 0xff;
ReadWrite428(Read, Write);
}
int32 Read428Short(Uint8 Address)
{
Uint8 Read[4], Write[4];
int32 Result;
Write[0]=Address|TMC428_READ; TMC428_READ is 1
Write[1]=0;
Write[2]=0;
Write[3]=0;
ReadWrite428(Read, Write);
Result=(Read[2]<<8)|(Read[3]);
if(Read[2] & 0x08) Result|=0xf000;
return Result;
}
void ReadWrite428(Uint8 *Read, Uint8 *Write)
{
int i;
for(i=0;i<4;i++)
{
SpibRegs.SPITXBUF=((Uint16)Write[i]<<8);
while(SpibRegs.SPIFFRX.bit.RXFFST !=1) { } // Wait until data is received
Read[i]=(SpibRegs.SPIRXBUF & 0xFFFF); // get data in Rx Buffer
}
}
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
#include "F2806x_Device.h"
#include "TMC429_Register.h"
int32 Amax;
void main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
TMC429_Enbl(); // TMC429 Clock enable 16MHz
InitSPI429(); // SPI B initialization
Write428Short(IDX_AMAX|MOTOR0, 2047); // IDX_AMAX 12, MOTOR0 0, value
Amax=Read428Short(IDX_AMAX); // Read value
}
Please any suggestion.
Divyesh.