#define I2C_ROM_PAGE_SIZE 32
-static unsigned char i2c_eeprom_write_1block(unsigned char i2caddr, unsigned char page_hi, unsigned char page_lo, unsigned char *data)
+static unsigned char i2c_eeprom_write_1block(unsigned char i2caddr, unsigned int addr, unsigned char *data, unsigned int size)
{
unsigned char i;
unsigned char *p = data;
+ unsigned char page_hi = addr >> 8;
+ unsigned char page_lo = addr & 0xff;
#ifdef __SDCC
i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
I2C_STOP();
i2c_close();
#else
+ if((size == 0) || (size > I2C_ROM_PAGE_SIZE)) return 0x00;
OpenI2C(MASTER, SLEW_ON);
SSPADD = 0x5;
IdleI2C();
while(SSPCON2bits.ACKSTAT);
if(!SSPCON2bits.ACKSTAT){
- for(i = 0; i < I2C_ROM_PAGE_SIZE; i++){
+ for(i = 0; i < size ; i++){
if(SSPCON1bits.SSPM3) {
WriteI2C(*p);
while(SSPCON2bits.ACKSTAT);
-// IdleI2C();
+ IdleI2C();
p++;
}
}
}
StopI2C();
while (SSPCON2bits.PEN);
-// idle_time_ms(10);
-// do {
-// StartI2C();
-// WriteI2C(i2caddr & 0xfe);
-// idle_time_ms(1);
-// } while(SSPCON2bits.ACKSTAT);
-// StopI2C();
-// while (SSPCON2bits.PEN);
+ idle_time_ms(2);
+ do {
+ StartI2C();
+ WriteI2C(i2caddr & 0xfe);
+ idle_time_ms(1);
+ } while(SSPCON2bits.ACKSTAT);
+ StopI2C();
+ while (SSPCON2bits.PEN);
CloseI2C();
#endif // i2c_idle();
unsigned char i2c_eeprom_burstwrite(unsigned char i2caddr, unsigned int addr, unsigned char *data, unsigned int bytes)
{
- unsigned char page_hi;
- unsigned char page_lo;
- int b = bytes;
-
- while(b > 0){
- page_hi = addr >> 8;
- page_lo = addr & 0xff;
-// i2c_eeprom_write_1block(i2caddr, page_hi, page_lo, data);
- i2c_eeprom_bytewrite(i2caddr, addr, *data);
+ unsigned int b = bytes;
+ unsigned int bb;
+ unsigned char sts;
+
+ if((addr % I2C_ROM_PAGE_SIZE) != 0) {
+ bb = I2C_ROM_PAGE_SIZE - (addr % I2C_ROM_PAGE_SIZE);
+ if(b <= bb) bb = b;
+ sts = i2c_eeprom_write_1block(i2caddr, addr, data, bb);
+ b -= bb;
+ addr += bb;
+ data += bb;
+ }
+ if(sts == 0) return 0;
+
+ while(b >= I2C_ROM_PAGE_SIZE){
+ sts = i2c_eeprom_write_1block(i2caddr, addr, data, I2C_ROM_PAGE_SIZE);
// idle_time_ms(15);
+ if(sts == 0) return 0;
+ addr += I2C_ROM_PAGE_SIZE;
+ data += I2C_ROM_PAGE_SIZE;
+ b -= I2C_ROM_PAGE_SIZE;
+ }
- addr += 1;
- data += 1;
- b -= 1;
+ if(b != 0){
+ sts = i2c_eeprom_write_1block(i2caddr, addr, data, b);
}
+ return sts;
}
-static unsigned char i2c_eeprom_read_1block(unsigned char addr, unsigned char page_hi, unsigned char page_lo, unsigned char *data)
+static unsigned char i2c_eeprom_read_1block(unsigned char i2caddr, unsigned int addr, unsigned char *data, unsigned int size)
{
- unsigned char c;
unsigned char i;
- unsigned char *p = data;
+ unsigned char page_hi = addr >> 8;
+ unsigned char page_lo = addr & 0xff;
#ifdef __SDCC
i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
I2C_STOP();
i2c_close();
#else
+ if((size == 0) || (size > I2C_ROM_PAGE_SIZE)) return 0x00;
OpenI2C(MASTER, SLEW_ON);
SSPADD = 0x5;
StartI2C();
while(SSPCON2bits.SEN);
- WriteI2C(addr & 0xfe);
+ WriteI2C(i2caddr & 0xfe);
// delay1ktcy(8);
while(SSPCON2bits.SEN);
WriteI2C(page_hi);
IdleI2C();
StartI2C();
- WriteI2C(addr | 1);
- for(i = 0; i < I2C_ROM_PAGE_SIZE - 1 ;i++){
- if (!SSPCON2bits.ACKSTAT){
- SSPCON2bits.RCEN = 1;
- while(SSPCON2bits.RCEN);
- AckI2C();
+ WriteI2C(i2caddr | 1);
+
+ for(i = 0; i < size - 1 ;i++){
+ if (!SSPCON2bits.ACKSTAT){
+ SSPCON2bits.RCEN = 1;
+ while(SSPCON2bits.RCEN);
+ AckI2C();
// while (!SSPCON2bits.ACKEN);
- *data = SSPBUF;
- data++;
- }
+ *data = SSPBUF;
+ data++;
+ }
}
if (!SSPCON2bits.ACKSTAT){
while(SSPCON2bits.SEN);
WriteI2C(page_lo);
StopI2C();
+
IdleI2C();
StartI2C();
WriteI2C(i2caddr | 1);
+
if (!SSPCON2bits.ACKSTAT){
SSPCON2bits.RCEN = 1;
while(SSPCON2bits.RCEN);
unsigned char i2c_eeprom_burstread(unsigned char i2caddr, unsigned int addr, unsigned char *data, unsigned int bytes)
{
- unsigned char page_hi;
- unsigned char page_lo;
- int b = bytes;
-
- while(b > 0){
- page_hi = addr >> 8;
- page_lo = addr & 0xff;
-// *data = i2c_eeprom_byteread(i2caddr, addr);
- i2c_eeprom_read_1block(i2caddr, page_hi, page_lo, data);
- idle_time_ms(1);
+ unsigned char sts;
+ unsigned int b = bytes;
+ unsigned int bb;
+
+ if((addr % I2C_ROM_PAGE_SIZE) != 0) {
+ bb = I2C_ROM_PAGE_SIZE - (addr % I2C_ROM_PAGE_SIZE);
+ if(b <= bb) bb = b;
+ sts = i2c_eeprom_read_1block(i2caddr, addr, data, bb);
+ b -= bb;
+ addr += bb;
+ data += bb;
+ if(sts == 0) return 0;
+ }
+ while(b >= I2C_ROM_PAGE_SIZE){
+ sts = i2c_eeprom_read_1block(i2caddr, addr, data, I2C_ROM_PAGE_SIZE);
+// idle_time_ms(15);
+ if(sts == 0) return 0;
addr += I2C_ROM_PAGE_SIZE;
data += I2C_ROM_PAGE_SIZE;
b -= I2C_ROM_PAGE_SIZE;
}
- return 0xff;
+ if(b != 0){
+ sts = i2c_eeprom_read_1block(i2caddr, addr, data, b);
+ }
+ return sts;
}