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

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
11/15/09 05:46
Read: times


 
#170836 - AT24C256
HI GUYS,

I am trying to interface my 89C51 with AT24C256. I have the code but it is not working. can anyone tell me what might be wrong with the code.
The green LED is glowing that means that the received data is not the same as the one that i have written.

#include <REG51.h>
#include <generic1.h>

//---------------------------------Defining Macros---------------------------------------------------------------------------
sbit sclk = P1^0;	
sbit sda = P1^1;	
sbit GREEN_LED = P3^6;
sbit YELLOW_LED = P3^7;

//---------------------------------------------------------------------------------------------------------------------------

//******************************FXN prototypes******************************/
void start_s_eeprom();
void send_byte_s_eeprom(char);
char get_byte_s_eeprom();
void stop_s_eeprom();
void send_to_mem(char, char);
unsigned int get_from_mem(char);
void wait();
void acknowledge();

//***************************************************************************/

//*********************fxn to send data to serial eeprom*********************/
// give the adress and the data as the parametrs to the fxn

 void send_to_mem(char s_address, char s_data)
 {
    start_s_eeprom();             // sending start condition to eeprom 
    send_byte_s_eeprom(0XA0);     // A0 = 10100000 = sending device address word for write
    acknowledge();
    send_byte_s_eeprom(s_address); // sending data address
    acknowledge();
    send_byte_s_eeprom(s_data);   // sending data 
    acknowledge();
    stop_s_eeprom();              // sending stop condition to eeprom
	acknowledge();
	return;
 }
//********************************************************************************************/

//*********************fxn to get the data back frm the serial eeprom****************/
// just give the adress from where the data is to be retrieved
 unsigned int get_from_mem(char s_address)
 {
    char i = 0;
//-------dummy write seq----+ word address------------------------------------
    start_s_eeprom();             // sending start condition to eeprom 
    send_byte_s_eeprom(0XA0);     // sending A0 = 10100000 = device address word for write
    acknowledge();
    send_byte_s_eeprom(s_address); // sending data address
    acknowledge();
//----------------dummy over----------------------------------------------------
    start_s_eeprom();
    send_byte_s_eeprom(0XA1);     // sending A1 =10100001 = device adress word for read
    acknowledge();
    i = get_byte_s_eeprom(); // sending data 
    acknowledge();
    stop_s_eeprom();              // sending stop condition to eeprom
	acknowledge();

    return(i); 
 }
//************************************************************************/

//*********************fxn to transmit a byte to the eeprom *****************************/
//this fxn just send the 8 bits serialy on the SDA line
//this fnx does not store the data in eeprom but just transmits it, this fxn is used by the storing fxn
//just pass the byte to be transmitted as parameter to this fxn
 void send_byte_s_eeprom(char s_byte)
 {
    char temp = s_byte;
    char i ;

	for(i = 7 ; i >= 0 ; i--)
    {
 
        temp = s_byte;
        temp = temp >> i;
        temp = temp & 0X01;

     
        if(temp == 0)
            sda =   0;
        else
            sda =   1;

		sclk   =   1;
        wait();
        sclk   =   0;
	   
    }
	return;
 }
//************************************************************************/

//*********************fxn to receive 8 bits serialy from sda line***************
// this is not a fxn to read from eeprom
// it just receives 8 bits serialy and retuns the byte received to the calling fxn
 char get_byte_s_eeprom()
 {
    char temp, temp_h, i;
    temp = 0;
    temp_h = 1;	

    sda = 1;    // making SDA as input pin for microcontroller
  	sclk	=	0;

    for(i = 7; i >=0 ; i--)
    {
        sclk = 1;
     	if(sda == 1)
        {
            temp = temp | temp_h<<i ;                      
        }
        wait();
		sclk = 0;

    }
    
    sclk = 0;
    return(temp);
 }
//************************************************************************/

//************************fxn to send the start condition*****************************/
 void start_s_eeprom()
 {
    sda     =   1;
    sclk    =   1;
    wait();
	sda     =   0;
	sclk    =   0;  
	return; 
 }
//************************************************************************/

//**************************fxn to send stop condition**********************/
 void stop_s_eeprom()
 {
    sda     =   0;
    sclk    =   1;
    wait();
    sda     =   1;
    sclk    =   0;
	return;   
 }
//**************************************************************************************************************/

//**************************fxn for acknowledging the eeprom***************************************************
// this fxn actualy does not read the acknowledge signal
// it just waits for sufficient time and assumes that the eeprom has given tha ack by the time the wait gets over
 void acknowledge()
 {
 	sclk = 1;
   	wait();
	sclk = 0;
	return;
 }
//**************************************************************************************************************/

//*************************a small delay fxn to ensure the line settels down after transition********************
 void wait()
 {
    char i;
    for(i=0;i<=20;i++)
		i++;
    return;
 }
//**************************************************************************************************************/

void main()
{
char COMPARING_BYTE = 0,ADDRESS_=0x11;
while(1)
{
send_to_mem(0x11,0XAA);//void send_to_mem(char address, char data);
usec_wait(10);
COMPARING_BYTE = get_from_mem(0x11);
if(COMPARING_BYTE == 0xAA)
GREEN_LED = 0;
else
YELLOW_LED = 0;
sec_wait(1);
GREEN_LED = 1;
YELLOW_LED = 1;
send_to_mem(0x11,0X00);
COMPARING_BYTE = 0;
sec_wait(1);
}
}insert code here
 



List of 16 messages in thread
TopicAuthorDate
AT24C256            01/01/70 00:00      
   help            01/01/70 00:00      
   BitBang's Amost Always....            01/01/70 00:00      
   Why use void functions            01/01/70 00:00      
      thanks            01/01/70 00:00      
      Writing to specific address            01/01/70 00:00      
         Send sensible address values.            01/01/70 00:00      
   I2C_0.0.zip            01/01/70 00:00      
   no luck,            01/01/70 00:00      
      You have more pins to mis-wire.            01/01/70 00:00      
   i2c used, What should be the address            01/01/70 00:00      
      Read Murray's excellent Help Files            01/01/70 00:00      
   Incorrect reply            01/01/70 00:00      
      Please take some time to READ the Help            01/01/70 00:00      
   single byte read write working            01/01/70 00:00      
      I2C_0.1.zip released!            01/01/70 00:00      

Back to Subject List