Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
03/04/08 13:13
Read: times


 
#151866 - Problem with P89V51RD2 to AT93C46A (SERIAL EEPROM)
I am trying to interface the AT93C46A to a P89V51RD2 using SPI. I am having a problem with writing commands and data to the memory.

I have attached my code and if any body can help me troubleshoot it would be great.
I have used LEDs for troubleshooting and used LED1 to notify me that the spi_transfer() function is working fine. The problem lies in that function itself. The execution gets stuck at while (!(SPCFG & 0x80))

/*****************************************************************************************/
//Program: Interfacing AT93C46A	serial EEPROM to a P89V51RD2 using the SPI//
/*****************************************************************************************/


#include <stdio.h>
#include <p89v51rx2.h>

unsigned char spi_transfer(unsigned char dat);
void delay(unsigned char Delval);
void delay_ms(unsigned int Delval_ms);

// Opcodes for controling the EPROM

#define EWEN 0x98
#define ERASE 0xe0
#define WRITE 0xa0
#define READ 0xc0

unsigned char ADDRESS = 0x01; //Memory Address
unsigned char DATA_1 = 0x25; // Data to be written to the memory
unsigned char read_data = 0x00;	//Data to be read from the memory

//SPI Pin Defination 
sbit cs = P1^4;
sbit di = P1^5;
sbit dou = P1^6;
sbit clk = P1^7;

//Debugging LEDs
sbit LED1 = P2^0;
sbit LED2 = P2^1;

//SPI READ and WRITE Function
unsigned char spi_transfer(unsigned char dat)
{
   SPDAT = dat;
   while (!(SPCFG & 0x80));
   SPCFG = 0x00;
   read_data = SPDAT;
   LED1 = 1; //LED1 used to check if the spi_transfer function is completely executed
   return(read_data);
   
}

//DELAY FUNCTIONS
//delay(10) = 200usec.

void delay(unsigned char Delval)
{
 unsigned char i=25;
 for(;Delval!=0;Delval--)
  for(;i!=0;i--);
}
 
void delay_ms(unsigned int Delval_ms)
{
 for(;Delval_ms!=0;Delval_ms--)
 {
  delay(250);
  delay(250);
  delay(250);
  delay(250);
 }
}
//MAIN
void main(void)
{

      unsigned char DATA_1 = 0x25; 
      unsigned char ret_dat = 0;
	
	LED1 = 0;
	LED2 = 0;

	cs = 1;
	di = 1;
	dou = 1;
	clk = 1;
	   
       SPCTL = 0x73; //initialize SPI
       cs = 0;
       delay_ms(10);
	   cs = 1;
	   spi_transfer(ERASE);
	   spi_transfer(ADDRESS);
       cs = 0;
       delay_ms(10);
	   
	   cs = 1;
       spi_transfer(EWEN); //enable write of eeprom
       cs = 0;
       delay_ms(10);

       cs = 1;
       spi_transfer(WRITE); //write sample data to the memory
       spi_transfer(ADDRESS);
       spi_transfer(DATA_1); 
       cs = 0;
       delay_ms(10);

     cs = 1;
     spi_transfer(READ); //read the data that is written at previous address
     spi_transfer(ADDRESS);
     ret_dat = read_data;
     cs = 0;
     delay_ms(10);
   
   //Check if all above operations are performed as desired
   if(ret_dat == DATA_1)
  {	
     LED2 = 1;
  }
  else    
 {
    LED2 = 0;
 } 
 while(1);

}



List of 25 messages in thread
TopicAuthorDate
Problem with P89V51RD2 to AT93C46A (SERIAL EEPROM)            01/01/70 00:00      
   Dummy Bit            01/01/70 00:00      
      RE: Dummy Bit & Code Update            01/01/70 00:00      
         asm?            01/01/70 00:00      
            ASM            01/01/70 00:00      
               disassemble            01/01/70 00:00      
                  Re: ASM            01/01/70 00:00      
                     options            01/01/70 00:00      
                        that is silly            01/01/70 00:00      
                           that's a +-10 lines C source...            01/01/70 00:00      
                              CODE compiler directive            01/01/70 00:00      
                                 #code ?            01/01/70 00:00      
                                    Sorry.... here            01/01/70 00:00      
                              I believe in doing it right, even when ...            01/01/70 00:00      
                                 10 lines maximum            01/01/70 00:00      
                                    Thanks Jon Ledbetter            01/01/70 00:00      
               .lst            01/01/70 00:00      
         "1" preceeding instructions and "0" for data            01/01/70 00:00      
   The ASM lst file            01/01/70 00:00      
      Jan, would you not ...            01/01/70 00:00      
         to be absolutely honest...            01/01/70 00:00      
            LEDs            01/01/70 00:00      
               Re: LEDs            01/01/70 00:00      
                  this might be the problem            01/01/70 00:00      
                     LED Test            01/01/70 00:00      

Back to Subject List