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.

Problem interfacing DSP28335 device with EEPROM for SPI communication

Other Parts Discussed in Thread: CONTROLSUITE

Hi all,

I connected DSP 28335 to EEPROM 25AA512 and while debugging I am seeing the SPI registers for checking whether transmission and receiving of the data had done properly but I am not able to see the SPIRXBUF register with the data what I had stored previously in that address. And I got the error like this when I am reading the data 

C28xx: Trouble Reading Register WRITE: Error 0x00000004/-2030 Error during: Register,  Access to an unknown or invalid register was attempted.

This was the Code I had written 



//   
//      SPI_EEPROM : TMS320F28335 
//      B J RAJENDRANATH 
//   
//###########################################################################   
//   
// FILE:    SPI_NEW.c   
//   
// TITLE:   SPI - EEPROM M95080     25AA512
//          CPU Timer0 ISR every 50 ms   
//          Watchdog active , served in ISR and main-loop    
//   
//###########################################################################   
//   
//  Ver | dd mmm yyyy | Who  | Description of changes   
// =====|=============|======|===============================================   
//  1.0 | 27 OCT 2014 | B J  | adapted to header-files Version 1.00     
//###########################################################################   
   
#include "DSP2833x_Device.h"
   
// Commands for the EEPROM   
#define WREN 0x06   // Write Enable   
#define WRDI 0x04   // Write Disable   
#define RDSR 0x05   // Read Status Register   
#define WRSR 0x01   // Write Status Register   
#define READ 0x03   // Read Command   
#define WRITE 0x02  // Write Command    


// external function prototypes

extern void InitSysCtrl(void);
extern void InitPieCtrl(void);
extern void InitPieVectTable(void);
extern void InitCpuTimers(void);
extern void ConfigCpuTimer(struct CPUTIMER_VARS *, float, float);

   
// Prototype statements for functions found within this file.   
   
void Gpio_select(void);   
void InitSystem(void);   
void SPI_Init(void);   
int  SPI_EEPROM_Read_Status(void);   
void SPI_EEPROM_Write_Enable(void);   
void SPI_EEPROM_Write(int,int);   
int SPI_EEPROM_Read(int);   
interrupt void cpu_timer0_isr(void); // Prototype for Timer 0 Interrupt Service Routine   
   
// Global Variables   
int dummy,V;   
   
void main(void)   
{   
    InitSystem();       // Initialize the DSP's core Registers   
       
    Gpio_select();      // Setup the GPIO Multiplex Registers   
       
    InitPieCtrl();      // Function Call to init PIE-unit ( code : DSP281x_PieCtrl.c)   
       
    InitPieVectTable(); // Function call to init PIE vector table ( code : DSP281x_PieVect.c )   
       
    // re-map PIE - entry for Timer 0 Interrupt    
    EALLOW;  // This is needed to write to EALLOW protected registers   
    PieVectTable.TINT0 = &cpu_timer0_isr;   
    EDIS;    // This is needed to disable write to EALLOW protected registers   
       
    InitCpuTimers();   
       
    // Configure CPU-Timer 0 to interrupt every 50 ms:   
    // 150MHz CPU Freq, 50000 �seconds interrupt period   
    ConfigCpuTimer(&CpuTimer0, 150, 50000);   
       
    // Enable TINT0 in the PIE: Group 1 interrupt 7   
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;   
   
    // Enable CPU INT1 which is connected to CPU-Timer 0:   
    IER = 1;   
       
    // Enable global Interrupts and higher priority real-time debug events:   
    EINT;   // Enable Global interrupt INTM   
    ERTM;   // Enable Global realtime interrupt DBGM   
       
    CpuTimer0Regs.TCR.bit.TSS = 0;   
       
    SPI_Init();   
       
    while(1)   
    {       
        while(CpuTimer0.InterruptCount < 4); // wait for Timer 0   
        CpuTimer0.InterruptCount = 0;   
        EALLOW;   
        SysCtrlRegs.WDKEY = 0xAA;       // and serve watchdog #2           
        EDIS;   
                              
        SPI_EEPROM_Write_Enable();  //  do an EEPROM write & enable EPROM for write   
        
        while( !(SPI_EEPROM_Read_Status() & 0x0002));      // wait for WEL = 1   
        
        SPI_EEPROM_Write(0x40,0x39);  // write 0x39 into 0x40  
                                              
       while (SPI_EEPROM_Read_Status()&0x0001);    // test for write in progress   
                
                                           
       V= SPI_EEPROM_Read(0x40);  // do an EEPROM-read  
    
    }   
}      
   
void Gpio_select(void)   
{   
    EALLOW;   
    GpioCtrlRegs.GPAMUX1.all = 0x0;   // all GPIO port Pin's to I/O   
    GpioCtrlRegs.GPAMUX2.all = 0x0;   
    GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1;	// SPIA pin SPISIMOA enabled 
	GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1;    // SPIA pin SPISOMIA enabled 
	GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1;    // SPIA pin SPICLKA enabled 
	GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;    // SPIA pin /SPISTEA enabled 
    GpioCtrlRegs.GPBMUX1.all = 0x0;  
    GpioCtrlRegs.GPBMUX2.all = 0x0;       
    GpioCtrlRegs.GPCMUX1.all = 0x0;   
    GpioCtrlRegs.GPCMUX2.all = 0x0;   
                                           
      EDIS;   
}        
   
   
void InitSystem(void)   
{   
    EALLOW;   
    SysCtrlRegs.WDCR= 0x00AF;       // Setup the watchdog    
                                    // 0x00E8  to disable the Watchdog , Prescaler = 1   
                                    // 0x00AF  to NOT disable the Watchdog, Prescaler = 64   
    SysCtrlRegs.SCSR = 0;           // Watchdog generates a RESET      
    SysCtrlRegs.PLLCR.bit.DIV = 10; // Setup the Clock PLL to multiply by 5   
       
    SysCtrlRegs.HISPCP.all = 0x1; // Setup Highspeed Clock Prescaler to divide by 2   
    SysCtrlRegs.LOSPCP.all = 0x4; // Setup Lowspeed CLock Prescaler to divide by 4   
           
    // Peripheral clock enables set for the selected peripherals.      
    SysCtrlRegs.PCLKCR0.bit.SPIAENCLK=1; 
    SysCtrlRegs.PCLKCR0.bit.SCIAENCLK=0;   
    SysCtrlRegs.PCLKCR0.bit.SCIBENCLK=0; 
    SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=0; 
    SysCtrlRegs.PCLKCR0.bit.ECANBENCLK=0;     
    SysCtrlRegs.PCLKCR0.bit.ADCENCLK=0;   
    EDIS;   
}   
   
void SPI_Init(void)   
{   
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;  // Reset SPI   
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 1; // Data Out falling / In rising edge   
                                         // SPICLK passive = high   
    SpiaRegs.SPICCR.bit.SPILBK = 0;      // no loobback mode   
    SpiaRegs.SPICCR.bit.SPICHAR = 15;    // 16 characters   
    SpiaRegs.SPICCR.bit.SPISWRESET = 1;  // relinq. from reset   
       
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;   // no clock delay   
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;// SPI - Master   
    SpiaRegs.SPICTL.bit.TALK = 1;        // enable TALK   
    SpiaRegs.SPICTL.bit.SPIINTENA = 0;   // no SPI-Interrupts enabled   
    SpiaRegs.SPICTL.bit.OVERRUNINTENA =0;// overrun interrupt disabled   
       
    SpiaRegs.SPIBRR = 0x124;   
    // SPI Baud Rate =  LSPCLK / ( SPIBRR + 1)   
    //               =  37,5 MHz / ( 124 + 1 )   
    //               =  300 kHz   
}   
   
int SPI_EEPROM_Read_Status(void)   
{   
    int k;   
    GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;     // activate /CS for the EEPROM 1    
    SpiaRegs.SPITXBUF = RDSR<<8;           // read status register command   
       
    while (SpiaRegs.SPISTS.bit.INT_FLAG == 0) ; // wait for end of transmission   
                                                // int-flag is reset when RXBUF was red   
   
    k=SpiaRegs.SPIRXBUF;                    // read status , LSB is WIP   
   GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;   // deactivate /CS for the EEPROM    
    return (k);    
} 
   
void SPI_EEPROM_Write_Enable(void)   
{   
   GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;      // activate /CS for the EEPROM   
    SpiaRegs.SPITXBUF = WREN<<8;          // read status register command   
    while (SpiaRegs.SPISTS.bit.INT_FLAG == 0) ; // wait for end of transmission   
                                            // int-flag is reset when RXBUF was red   
    dummy=SpiaRegs.SPIRXBUF;                // dummy read    
    GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;   // deactivate /CS for the EEPROM    
}   
   
void SPI_EEPROM_Write(int address,int data)   
{   
    GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;      // activate /CS for the EEPROM   
    SpiaRegs.SPITXBUF = (WRITE<<8)+(address>>8);   
                                            // instruction + upper addressbyte     
    while (SpiaRegs.SPISTS.bit.INT_FLAG == 0) ; // wait for end of transmission   
                                            // int-flag is reset when RXBUF was red   
    dummy=SpiaRegs.SPIRXBUF;                // dummy read    
       
    SpiaRegs.SPITXBUF = (address<<8)+(data & 0x00FF);    
                                            // write lower address + databyte   
    while (SpiaRegs.SPISTS.bit.INT_FLAG == 0) ; // wait for end of transmission   
    dummy=SpiaRegs.SPIRXBUF;                // dummy read    
       
   GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;     // deactivate /CS for the EEPROM    
}   
   
int SPI_EEPROM_Read(int address)   
{   
    int data;   
   GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0; ;           // activate /CS for the EEPROM   
    SpiaRegs.SPITXBUF = (READ<<8)+ (address>>8); // command + upper addressbyte     
    while (SpiaRegs.SPISTS.bit.INT_FLAG == 0) ; // wait for end of transmission   
                                               // int-flag is reset when RXBUF was red   
    dummy=SpiaRegs.SPIRXBUF;                  // dummy read    
       
    SpiaRegs.SPITXBUF = (address<<8);       // write lower address    
                                           // and read data with 16 clk's   
    while (SpiaRegs.SPISTS.bit.INT_FLAG == 0) ; // wait for end of transmission   
    data=SpiaRegs.SPIRXBUF;              // read data    
       
   GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // deactivate /CS for the EEPROM    
    return(data);   
}   
   
interrupt void cpu_timer0_isr(void)   
{   
    CpuTimer0.InterruptCount++;   
    // Serve the watchdog every Timer 0 interrupt   
    EALLOW;   
    SysCtrlRegs.WDKEY = 0x55;       // Serve watchdog #1   
    EDIS;   
   
   // Acknowledge this interrupt to receive more interrupts from group 1   
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   
}   
//===========================================================================   
// End of SourceCode.   
//===========================================================================   
   



  • Actually now I came to know that the write action is not at all happening .This I came to know that by polling the WIP (Write in Progrss ) in the status register of EEprom 25AA512 

    ie., WIP=1 Write is in progress so further action cann't be taken WIP=0 Write is complete 

    when I am using while (!(SPI_EEPROM_Read_Status()&0x0001)); it is not coming out of the loop.But the thing is eeprom responding while I am reading the Status register and not responding to read an address bcoz nothing wrote on that address.

    Can any one help me where I went Wrong.

    #include "DSP2833x_Device.h"
    
    //EEPROM instructions
    #define READ    03       // READ       instruction code  
    #define WRITE   02       // WRITE      instruction code 
    #define WRDI    04       // WR DISBALE instruction code 
    #define WREN    06       // WR ENABLE  instruction code
    #define RDSR    05       // RD STATUS  instruction code 
    #define WRSR    01       // WR STATUS  instruction code 
    #define NOPROT  00       // NO WRITE PROTECTION 
    
    
    // external function prototypes
    extern void InitSysCtrl(void);
    extern void InitPieCtrl(void);
    extern void InitPieVectTable(void);
    extern void InitCpuTimers(void);
    extern void ConfigCpuTimer(struct CPUTIMER_VARS *, float, float);
    
    // Prototype statements for functions found within this file. 
    void Gpio_select(void);
    void SPI_Init(void);
    int  SPI_EEPROM_Read_Status(void);   
    void SPI_EEPROM_Write_Enable(void);   
    void SPI_EEPROM_Write(int,int);
    void SPI_EEPROM_Write_Status(void);    
    int SPI_EEPROM_Read(int);   
    interrupt void cpu_timer0_isr(void); 
       
    // Global Variables   
    volatile int dummy; 
    unsigned int mee;	
    
    
    void main(void)
    {
     
      InitSysCtrl();      // Initialize the DSP's core Registers  
      DINT;				// Disable all interrupts 
      Gpio_select();      // Setup the GPIO Multiplex Registers   
      InitPieCtrl();      // Function Call to init PIE-unit 
      InitPieVectTable(); // Function call to init PIE vector table  
      EALLOW;      
      PieVectTable.TINT0 = &cpu_timer0_isr;       // re-map PIE - entry for Timer 0 Interrupt    
      EDIS;    
      InitCpuTimers();   
      ConfigCpuTimer(&CpuTimer0, 150, 50000);    // Configure CPU-Timer 0 to interrupt every 50 ms:   
      SPI_Init(); 
      PieCtrlRegs.PIEIER1.bit.INTx7 = 1;   
      IER = 1;                                    // Enable CPU INT1 which is connected to CPU-Timer 0:
      EINT;                                       // Enable Global interrupt INTM   
      ERTM;                                       // Enable Global realtime interrupt DBGM                                              
      CpuTimer0Regs.TCR.bit.TSS = 0;   
      //while (SPI_EEPROM_Read_Status()&0x0001);	  // test for write in progress 
      while(1)
    	{ 
    
    		//SPI_EEPROM_Write_Enable();   // enable EPROM for write  
    		SPI_EEPROM_Write_Status();
            //mee=SPI_EEPROM_Read_Status() ;
            SPI_EEPROM_Write_Enable();   // enable EPROM for write                 
            while(!(SPI_EEPROM_Read_Status() & 0x0002));      
            SPI_EEPROM_Write(0x1111,0x55); 
            while(CpuTimer0.InterruptCount < 40);
    		CpuTimer0.InterruptCount = 0;	
    		EALLOW;
    	    SysCtrlRegs.WDKEY = 0x55;	// service WD #1
    	    EDIS;    
            while (SPI_EEPROM_Read_Status()&0x0001);            // test for write in progress   
            mee = SPI_EEPROM_Read(0x1111);                      // eeprom read   	   
    	}   
    } 
    
    void Gpio_select(void)
    {
    	EALLOW;
    	
    	GpioCtrlRegs.GPAMUX1.all = 0x00000000;
    	GpioCtrlRegs.GPAMUX2.all = 0x00000055;	
    	GpioCtrlRegs.GPBMUX1.all = 0x00000000;	
    	GpioCtrlRegs.GPBMUX2.all = 0x00000000;		//All GPIO's except Pins 19,18,17,16 as SPI pins
    	GpioCtrlRegs.GPCMUX1.all = 0x00000000;	
    	GpioCtrlRegs.GPCMUX2.all = 0x00000000;	
    		
        EDIS;
    }   
    
    
    void SPI_Init(void)   
    {   
        SpiaRegs.SPICCR.bit.SPISWRESET = 0;  // Reset SPI   
        SpiaRegs.SPICCR.bit.CLKPOLARITY = 1; // Data Out falling / In rising edge   
                                             // SPICLK passive = high   
        SpiaRegs.SPICCR.bit.SPILBK = 0;      // no loobback mode   
        SpiaRegs.SPICCR.bit.SPICHAR = 15;    // 16 characters   
        SpiaRegs.SPICCR.bit.SPISWRESET = 1;  // relinq. from reset   
           
        SpiaRegs.SPICTL.bit.CLK_PHASE = 0;   // no clock delay   
        SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;// SPI - Master   
        SpiaRegs.SPICTL.bit.TALK = 1;        // enable TALK   
        SpiaRegs.SPICTL.bit.SPIINTENA = 0;   // no SPI-Interrupts enabled   
        SpiaRegs.SPICTL.bit.OVERRUNINTENA =0;// overrun interrupt disabled   
           
        SpiaRegs.SPIBRR = 0x24;   
        // SPI Baud Rate =  LSPCLK / ( SPIBRR + 1)   
        //               =  37,5 MHz / ( 124 + 1 )   
        //               =  300 kHz   
    } 
    int SPI_EEPROM_Read_Status(void)   
    {   
    	  int k;
    	 GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;
             
        SpiaRegs.SPITXBUF = RDSR<<8;                 // read status register command   
           
        while (SpiaRegs.SPISTS.bit.INT_FLAG == 0) ;  // wait for end of transmission   
                                                     // int-flag is reset when RXBUF was read   
        GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;
        k=SpiaRegs.SPIRXBUF;                 
         GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;        // read status , LSB is WIP     
        return (k);    
    }  
    
    void SPI_EEPROM_Write_Status(void)   
    {      
    	GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;
        SpiaRegs.SPITXBUF =(WRSR<<8)+(0x80);                 // read status register command   
        while (SpiaRegs.SPISTS.bit.INT_FLAG == 0) ;  // wait for end of transmission   // int-flag is reset when RXBUF was red  
        dummy=SpiaRegs.SPIRXBUF; 
        GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;                    // dummy read       
    } 
       
    void SPI_EEPROM_Write_Enable(void)   
    {      
    	 GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;
        SpiaRegs.SPITXBUF = WREN<<8;                 // read status register command   
        while (SpiaRegs.SPISTS.bit.INT_FLAG == 0) ;  // wait for end of transmission   // int-flag is reset when RXBUF was red  
        dummy=SpiaRegs.SPIRXBUF;             
         GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;        // dummy read       
    }   
       
    void SPI_EEPROM_Write(int address,int data)   
    {   
    	 GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;
        SpiaRegs.SPITXBUF = (WRITE<<8)+(address>>8);        // instruction + upper addressbyte     
        while (SpiaRegs.SPISTS.bit.INT_FLAG == 0) ;         // wait for end of transmission   
        dummy=SpiaRegs.SPIRXBUF;                            // dummy read    
           
        SpiaRegs.SPITXBUF = (address<<8)+(data & 0x00FF);   // write lower address + databyte 
        while (SpiaRegs.SPISTS.bit.INT_FLAG == 0) ;         // wait for end of transmission   
        dummy=SpiaRegs.SPIRXBUF;
        GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;                            // dummy read       
    }
    
       
    int SPI_EEPROM_Read(int address)   
    {   
    	 int data;
    	 GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;
              
        SpiaRegs.SPITXBUF = (READ<<8)+ (address>>8);       // command + upper addressbyte 
        while (SpiaRegs.SPISTS.bit.INT_FLAG == 0) ;        // wait for end of transmission     
        dummy=SpiaRegs.SPIRXBUF;  
        SpiaRegs.SPITXBUF = (address<<8);                       // write lower address 
        while (SpiaRegs.SPISTS.bit.INT_FLAG == 0) ;  // wait for end of transmission   
        data=SpiaRegs.SPIRXBUF;  
         GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;                    // read data         
        return(data);   
    } 
       
    interrupt void cpu_timer0_isr(void)   
    {   
        CpuTimer0.InterruptCount++;   
        // Serve the watchdog every Timer 0 interrupt   
        EALLOW;   
        SysCtrlRegs.WDKEY = 0xAA;       // Serve watchdog #1   
        EDIS;   
          
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;  
    }
    //===========================================================================
    // End of SourceCode.
    //===========================================================================
    

  • You can find SPI_Boot.c in the following controlSUITE path if you have already installed control suite.

    controlSUITE\libs\utilities\boot_rom\2833x\2833x_boot_rom_v2\source

    You can use this code as a reference point for your debug. May be even try SPI boot using your EEPROM to understand how everything works.

    -Manoj

  • Yes, I am seeing it.I have seen the code and i under stood the the functions  cputimer0 and cputimer1 will be copies to SARAM and I builded it no errors how can I ensure that was working. For that I want to write a value in zone 7 which  was connected to SARAM and I want to read it again.

    For that #pragma CODE_SECTION(data,"xintffuncs"); and data is my function and I am writing

    Uint16 *x,*y,z;

    void data(void)
    {
    Uint16 *x;
    a=0x0000;

    while(!(a<&XintffuncsRunStart))
    {
    a++;
    }
    data_value=12;
    x=&XintffuncsRunStart;
    x=x+1;
    *x=data_value;
    z=*x;
    y=&z;
    }

    But i am seeing the values as follows

    x=0xD56F9A99

    y=0x1FDD3F11

    z=60622

    I am not understanding what was happened