Other Parts Discussed in Thread: TMS320F28069, C2000WARE
Tool/software: Code Composer Studio
I have written below code for getting data from encoder using SPIA
I started initially by sending dummy data(0x73) from F28069 to RLS encoder but RXBUF and RXEMU reads 65535 all the time.
SPI Mode is 0.
I doubt my SPIBRR calculation , still I calculated as 90M/8*15200 = 0x61
Below is my code. Please suggest where I am going wrong to get correct data from encoders
In oscilloscope , I can see MOSI,SCK and CS signal as required but MISO is always high
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File // Prototype statements for functions found within this file. Uint16 spi_xmit(Uint16 a); void spi_fifo_init(void); void spi_init(void); void error(void); void delay_loop( ); int n=0; int m=0; //int i=0; Uint16 sdata; // send data Uint16 sdata1; Uint16 rdata=0; // received data Uint16 rdata1=0; Uint16 rdata2=0; Uint16 rdata3=0; int flag=1; //void putsUart0(Uint16 str) //{ //Uint16 i; //for (i = 0; i < strlen(str); i++) // putcUart0(str[i]); //} void main(void) { // Step 1. Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the F2806x_SysCtrl.c file. InitSysCtrl(); // Step 2. Initalize GPIO: // This example function is found in the F2806x_Gpio.c file and // illustrates how to set the GPIO to it's default state. // InitGpio(); // Skipped for this example // Setup only the GP I/O only for SPI-A functionality // This function is found in F2806x_Spi.c InitSpiaGpio(); // Step 3. Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts DINT; // Initialize PIE control registers to their default state. // The default state is all PIE interrupts disabled and flags // are cleared. // This function is found in the F2806x_PieCtrl.c file. InitPieCtrl(); // Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000; // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). // This will populate the entire table, even if the interrupt // is not used in this example. This is useful for debug purposes. // The shell ISR routines are found in F2806x_DefaultIsr.c. // This function is found in F2806x_PieVect.c. InitPieVectTable(); // Step 4. Initialize all the Device Peripherals: // This function is found in F2806x_InitPeripherals.c // InitPeripherals(); // Not required for this example spi_fifo_init(); // Initialize the Spi FIFO spi_init(); // init SPI // Step 5. User specific code: // Interrupts are not used in this example. sdata = 0x73; sdata1=0x00; for(;;) { // GpioCtrlRegs.GPAPUD.bit.GPIO19 = 1; // Transmit data spi_xmit(sdata); delay_loop(); // Wait until data is received while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { } //rdata1 =spi_xmit(sdata); // Wait until data is received // while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { } // // Check against sent data rdata = SpiaRegs.SPIRXBUF ; // delay_loop(); } } // Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here: void error(void) { __asm(" ESTOP0"); // Test failed!! Stop! for (;;); } void delay_loop( ) { int i; for (i = 0; i < 1000; i++){} } void spi_init() { SpiaRegs.SPICCR.all =0x000F; // Reset on, rising edge, 16-bit char bits //llop back mode is enabled SpiaRegs.SPICTL.all =0x0006; // Enable master mode, normal phase, // enable talk, and SPI int disabled. SpiaRegs.SPIBRR = 0x61; SpiaRegs.SPICCR.all =0x008F; // Relinquish SPI from Reset SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission } Uint16 spi_xmit(Uint16 a) { SpiaRegs.SPITXBUF=a; return a; } void spi_fifo_init() { // Initialize SPI FIFO registers //SpiaRegs.SPIFFTX.all=0xE040; SpiaRegs.SPIFFTX.all=0xE040; SpiaRegs.SPIFFRX.all=0x2044; // SpiaRegs.SPIFFRX.all=0x6060F; SpiaRegs.SPIFFCT.all=0x00; } //=========================================================================== // No more. //===========================================================================