This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Need correction for I2c write routine

Hi ,
The following code works fine while reading the contents from the EEPROM (24C04) but does not continuously writes to EEPROM.

Please suggest the correction in this code.

#include <REG52.H>
#include <stdio.h>
#include <intrins.h>

sbit SDA = P2^0;
sbit SCL = P2^1;


#define uchar unsigned char
#define uint unsigned int
#define Byte unsigned char
#define Word unsigned int
#define bool bit
#define true 1
#define false 0


#define SomeNOP(); _nop_();_nop_();_nop_();_nop_();

void I2CStart(void);
void I2CStop(void);
void WaitAck(void);
void SendAck(void);
void SendNotAck(void);
void I2CSendByte(Byte);
Byte I2CReceiveByte(void);
void contr(uchar);

void contw(uchar,uchar);

void main(void)
{
unsigned char count=0;
PCON |= 0x80; // Set bit 7 of the PCON register (SMOD = 1)
SCON = 0x50; // 0101,0000 (Mode 1 and RxD enable)
TMOD |= 0x20; // Timer #1 in autoreload 8 bit mode
TH1 = 0xFA; // Baud rate is determined by
// Timer #1 overflow rate
TR1 = 1; // Turn on Timer 1
TI = 1;


contw(0,'P');
contw(1,'O');


while(1)
{
if(count==5)
count=0;
contr(count++);
}
}


/**--------------------------------------------------------------------------------
void I2CStart(void)
I2C
---------------------------------------------------------------------------------*/
void I2CStart(void)
{
SDA=1;
SCL=1;
SomeNOP();//INI
SDA=0;
SomeNOP(); //START
SCL=0;
SomeNOP();
}


/**--------------------------------------------------------------------------------

void I2CStop(void)
I2C

---------------------------------------------------------------------------------*/
void I2CStop(void)
{
SCL=0;
SDA=0;
SomeNOP(); //INI
SCL=1;
SomeNOP();
SDA=1; //STOP
SomeNOP();
}

/**--------------------------------------------------------------------------------
bit I2CAck(void)
I2C
----------------------------------------------------------------------------------*/

void WaitAck(void)
{
SDA=1;
SomeNOP();
SCL=1;
while(SDA)
SomeNOP();
SCL=0;
SomeNOP();
}

/**--------------------------------------------------------------------------------

void SendAck(void)
I2C

---------------------------------------------------------------------------------*/
void SendAck(void)
{
SDA=0;
SomeNOP();
SCL=1;
SomeNOP();
SCL=0;
}


/**--------------------------------------------------------------------------------

void SendNotAck(void)
I2C

**--------------------------------------------------------------------------------*/
void SendNotAck(void)
{
SDA=1;
SomeNOP();
SCL=1;
SomeNOP();
SCL=0;
}

/**--------------------------------------------------------------------------------

void I2CSend(uchar ch)
I2C

---------------------------------------------------------------------------------*/
void I2CSendByte(Byte ch)
{
uchar i=8;
while (i--)
{
SCL=0;
_nop_();
SDA=(bit)(ch&0x80);
ch<<=1;
SomeNOP();
SCL=1;
SomeNOP();
}
SCL=0;
}


/**--------------------------------------------------------------------------------

uchar I2CReceive(void)
I2C

---------------------------------------------------------------------------------*/
Byte I2CReceiveByte(void)
{
uchar i=8;
Byte ddata=0;
SDA=1;
while (i--)
{
ddata<<=1;
SCL=0;
SomeNOP();
SCL=1;
SomeNOP();
ddata|=SDA;
}
SCL=0;
return ddata;
}

/**--------------------------------------------------------------------------------

void contr(uchar)
I2C Content Read

---------------------------------------------------------------------------------*/

void contr(uchar loc)
{
char i;
I2CStart();
I2CSendByte(0xA2);
WaitAck();
I2CSendByte(loc);
WaitAck();
I2CStop();

I2CStart();
I2CSendByte(0xA3);
WaitAck();
printf("%c",I2CReceiveByte());
SendNotAck();
I2CStop();
}


/**--------------------------------------------------------------------------------

void contw(uchar,uchar)
I2C Content Write

*Error in function*
---------------------------------------------------------------------------------*/

void contw(uchar loc,uchar info)
{
I2CStart();
I2CSendByte(0xA2);
WaitAck();
I2CSendByte(loc);
WaitAck();
I2CSendByte(info);
WaitAck();
I2CStop();
}

Parents
  • //24c01-24c16&#35835;&#20889;&#39537;&#21160;&#31243;&#24207;&#65292;
    sbit a0=ACC^0; //&#23450;&#20041;ACC&#30340;&#20301;&#65292;&#21033;&#29992;ACC&#25805;&#20316;&#36895;&#24230;&#26368;&#24555;
    sbit a1=ACC^1;
    sbit a2=ACC^2;
    sbit a3=ACC^3;
    sbit a4=ACC^4;
    sbit a5=ACC^5;
    sbit a6=ACC^6;
    sbit a7=ACC^7;

    void s24(void) {
    _nop_();scl=0;sda=1;scl=1;_nop_();sda=0;_nop_();scl=0;
    }
    void s240(void) {
    _nop_();scl0=0;sda0=1;scl0=1;_nop_();sda0=0;_nop_();scl0=0;
    }
    void p24(void) {
    sda=0;scl=1;_nop_();sda=1;
    }
    void p240(void) {
    sda0=0;scl0=1;_nop_();sda0=1;
    }
    unsigned char rd24(void) {
    sda=1;
    scl=1;a7=sda;scl=0;
    scl=1;a6=sda;scl=0;
    scl=1;a5=sda;scl=0;
    scl=1;a4=sda;scl=0;
    scl=1;a3=sda;scl=0;
    scl=1;a2=sda;scl=0;
    scl=1;a1=sda;scl=0;
    scl=1;a0=sda;scl=0;
    sda=1;scl=1;scl=0;
    return(ACC);
    }

    void wd24(unsigned char dd) {
    ACC=dd;
    sda=a7;scl=1;scl=0;
    sda=a6;scl=1;scl=0;
    sda=a5;scl=1;scl=0;
    sda=a4;scl=1;scl=0;
    sda=a3;scl=1;scl=0;
    sda=a2;scl=1;scl=0;
    sda=a1;scl=1;scl=0;
    sda=a0;scl=1;scl=0;
    sda=1;scl=1;
    }

    unsigned char read(unsigned int address){
    unsigned char dd;
    dd=((address&0x7ff)/256)<<1;
    s24();wd24(0xa0|dd);scl=0;wd24(address);scl=0;
    s24();wd24(0xa1|dd);scl=0;dd=rd24();p24();return(dd);
    }

    void write(unsigned int address,unsigned char dd){
    unsigned char ddd;
    ddd=((address&0x7ff)/256)<<1;
    s24();wd24(0xa0|ddd);scl=0;wd24(address);scl=0;wd24(dd);scl=0;p24();
    time=0; //time&#20026;&#23450;&#26102;&#22120;&#26102;&#38388;&#21442;&#32771;&#65292;time&#22686;&#21152;1&#20195;&#34920;1ms,&#22914;&#26524;&#27809;&#26377;&#29992;&#23450;&#26102;&#22120;&#65292;&#21462;&#28040;&#35813;&#34892;
    while (1) {
    s24();
    wd24(0xa0|ddd);
    sda=1;
    if (sda==0) break;
    if (time>10) break; //&#27492;&#34892;&#38450;&#27490;&#30001;&#20110;eeprom&#22120;&#20214;&#25439;&#22351;&#21518;&#30340;&#27515;&#24490;&#29615;
    scl=0;
    }
    }

Reply
  • //24c01-24c16&#35835;&#20889;&#39537;&#21160;&#31243;&#24207;&#65292;
    sbit a0=ACC^0; //&#23450;&#20041;ACC&#30340;&#20301;&#65292;&#21033;&#29992;ACC&#25805;&#20316;&#36895;&#24230;&#26368;&#24555;
    sbit a1=ACC^1;
    sbit a2=ACC^2;
    sbit a3=ACC^3;
    sbit a4=ACC^4;
    sbit a5=ACC^5;
    sbit a6=ACC^6;
    sbit a7=ACC^7;

    void s24(void) {
    _nop_();scl=0;sda=1;scl=1;_nop_();sda=0;_nop_();scl=0;
    }
    void s240(void) {
    _nop_();scl0=0;sda0=1;scl0=1;_nop_();sda0=0;_nop_();scl0=0;
    }
    void p24(void) {
    sda=0;scl=1;_nop_();sda=1;
    }
    void p240(void) {
    sda0=0;scl0=1;_nop_();sda0=1;
    }
    unsigned char rd24(void) {
    sda=1;
    scl=1;a7=sda;scl=0;
    scl=1;a6=sda;scl=0;
    scl=1;a5=sda;scl=0;
    scl=1;a4=sda;scl=0;
    scl=1;a3=sda;scl=0;
    scl=1;a2=sda;scl=0;
    scl=1;a1=sda;scl=0;
    scl=1;a0=sda;scl=0;
    sda=1;scl=1;scl=0;
    return(ACC);
    }

    void wd24(unsigned char dd) {
    ACC=dd;
    sda=a7;scl=1;scl=0;
    sda=a6;scl=1;scl=0;
    sda=a5;scl=1;scl=0;
    sda=a4;scl=1;scl=0;
    sda=a3;scl=1;scl=0;
    sda=a2;scl=1;scl=0;
    sda=a1;scl=1;scl=0;
    sda=a0;scl=1;scl=0;
    sda=1;scl=1;
    }

    unsigned char read(unsigned int address){
    unsigned char dd;
    dd=((address&0x7ff)/256)<<1;
    s24();wd24(0xa0|dd);scl=0;wd24(address);scl=0;
    s24();wd24(0xa1|dd);scl=0;dd=rd24();p24();return(dd);
    }

    void write(unsigned int address,unsigned char dd){
    unsigned char ddd;
    ddd=((address&0x7ff)/256)<<1;
    s24();wd24(0xa0|ddd);scl=0;wd24(address);scl=0;wd24(dd);scl=0;p24();
    time=0; //time&#20026;&#23450;&#26102;&#22120;&#26102;&#38388;&#21442;&#32771;&#65292;time&#22686;&#21152;1&#20195;&#34920;1ms,&#22914;&#26524;&#27809;&#26377;&#29992;&#23450;&#26102;&#22120;&#65292;&#21462;&#28040;&#35813;&#34892;
    while (1) {
    s24();
    wd24(0xa0|ddd);
    sda=1;
    if (sda==0) break;
    if (time>10) break; //&#27492;&#34892;&#38450;&#27490;&#30001;&#20110;eeprom&#22120;&#20214;&#25439;&#22351;&#21518;&#30340;&#27515;&#24490;&#29615;
    scl=0;
    }
    }

Children
No data