Sir, I am trying to write 34 into the eeprom at address location 0x0000, but whenever I read and dislpay it on lcd, 49 is displayed. please help me.
my code
sbit SCL=P3^7; // Port pin for SCL line sbit SDA=P3^6; // Port pin for SDA line
void i2c_delay(void); // I2C Clock delay void i2c_start(void); // Generates a I2C Start condition void i2c_stop(void); // Generates a I2C Stop condition void i2c_wbyte(char i2c_wb); // Writes a single byte from I2C Slave unsigned char i2c_rbyte(void); // Reads and returns a single byte from I2C Slave char i2c_ack(void); void i2c_nack(void); void i2c_write(char id, char add,char dat); unsigned char i2c_read(char id,char add);
void i2c_delay(void) { char a; for(a=0;a<80;a++); }
void i2c_start(void) { SCL = 1; i2c_delay(); SDA = 1; i2c_delay(); SDA = 0; i2c_delay(); SCL = 0; i2c_delay(); }
void i2c_stop(void) { //SDA_Dir = 1; //SDA pin as output SDA = 0; i2c_delay(); SCL = 1; i2c_delay(); SDA = 1; i2c_delay(); SCL = 0; }
void i2c_wbyte(unsigned char i2c_wb) { char a; //DA_Dir = 1; // Set SDA pin as output for(a=0;a<8;a++) // Send 8 bits { SCL = 0; i2c_delay(); if(i2c_wb & (0x80 >> a)) { SDA = 1; } else { SDA = 0; } i2c_delay(); SCL = 1; i2c_delay(); }
}
unsigned char i2c_rbyte(void) { char a; unsigned char b; b=0; //SDA_Dir = 0; // Set SDA pin as input for(a=0;a<8;a++) { SCL = 1; i2c_delay(); if(SDA) { b |= (0x80 >> a); // Set data bit on SDA line } i2c_delay(); SCL = 0; i2c_delay(); } return(b); } char i2c_ack(void) { char a; //SDA_Dir = 1; // Set SDA pin as output i2c_delay(); SCL = 0; i2c_delay(); SDA = 1; i2c_delay(); SCL = 1; i2c_delay();
//SDA_Dir = 0; // Set SDA pin as input i2c_delay(); a = SDA; i2c_delay(); SCL = 0; i2c_delay(); return(a); }
void i2c_nack(void) { //SDA_Dir = 1; // Set SDA pin as output SDA = 1; i2c_delay(); SCL = 1; i2c_delay(); SCL = 0; i2c_delay(); } void i2c_write(unsigned char id, unsigned char add, unsigned char dat) { i2c_start(); i2c_wbyte(id); i2c_ack(); i2c_wbyte(add); i2c_ack(); i2c_wbyte(dat); i2c_ack(); i2c_stop(); }
unsigned char i2c_read(unsigned char id,unsigned char add) { unsigned char rd; i2c_start(); i2c_wbyte(id); i2c_ack(); i2c_wbyte(add); i2c_ack(); i2c_start(); i2c_wbyte((id|0x01)); i2c_ack(); rd = i2c_rbyte(); i2c_nack(); i2c_stop(); return(rd); } main() { unsigned char v=34; unsigned char dat=0; i2c_write(0xA0,0x0000,v); dat=i2c_read(0xA0,0x0000); send2lcd(dat); } the delay between read and write correct? the delay between scl and sda line, is ok? please help me
thanks in advance
The i2c_delay is too much, can't be. by the standard if your delay is even years, the bus will still work.
Erik
So why did you jump into your old thread about i2c suddenly? and why did you not see what happened using your? (intentional question mark) LCD routines to display a constant to DIVIDE AND CONQUER.
I am getting a suspicion that you threw some code collected from the internet together and have no idea how to make it work.
More of an FYI and not so much a "I wouldn't do". I have seen too many times where people just don't pay attention to when the posts were created. I agree the information is useful. Could just be me as well, As a Mod on another unrelated board thread res there is an issue.
In this case, the thread is about I2C and the recent poster have completely different problems. And already have ongoing threads.
What are you trying to say?
Hi, is there a I2C robust library? similar as the RL_FlashFS/RL_USB, etc... If the answer is NO, then is it possible to write such a library?
is there a I2C robust library? probably; however, most users of such do not take into consderation the differences between the "I2C robust library" and their application (pins/clock speed/...) and then complain that it is not 'robust'.
WHY ON EARTH do people still do bit-banging I²C when there are legio derivatives with I²C hardware?
is it possible to write such a library? sure, with the above caveats.