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. //===========================================================================