#include "i2c_eeprom.h"
-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();
StartI2C();
- // while (SSPCON2bits.SEN);
+ while(SSPCON2bits.SEN);
+
WriteI2C(i2caddr & 0xfe);
-// while(SSPCON2bits.SEN);
+ while(SSPCON2bits.ACKSTAT);
+
WriteI2C(page_hi);
-// while(SSPCON2bits.SEN);
+ while(SSPCON2bits.ACKSTAT);
+
WriteI2C(page_lo);
+ while(SSPCON2bits.ACKSTAT);
-// IdleI2C();
- for(i = 0; i < 32; i++){
- WriteI2C(*p);
- IdleI2C();
- p++;
+ if(!SSPCON2bits.ACKSTAT){
+ for(i = 0; i < size ; i++){
+ if(SSPCON1bits.SSPM3) {
+ WriteI2C(*p);
+ while(SSPCON2bits.ACKSTAT);
+ IdleI2C();
+ p++;
+ }
+ }
}
StopI2C();
+ while (SSPCON2bits.PEN);
+ idle_time_ms(2);
do {
StartI2C();
WriteI2C(i2caddr & 0xfe);
idle_time_ms(1);
} while(SSPCON2bits.ACKSTAT);
-// StopI2C();
-// while (SSPCON2bits.PEN);
+ StopI2C();
+ while (SSPCON2bits.PEN);
+
CloseI2C();
#endif // i2c_idle();
return 0xff;
OpenI2C(MASTER, SLEW_ON);
SSPADD = 5; // 100KHz
IdleI2C();
-// StartI2C();
-// do {
-// idle_time_ms(1);
- StartI2C();
- while(SSPCON2bits.SEN);
- WriteI2C(i2caddr & 0xfe);
- while(SSPCON2bits.ACKSTAT);
-// WriteI2C(i2caddr & 0xfe);
+ StartI2C();
+ while(SSPCON2bits.SEN);
+
+ WriteI2C(i2caddr & 0xfe);
+ while(SSPCON2bits.ACKSTAT);
+
WriteI2C(page_hi);
while(SSPCON2bits.ACKSTAT);
+
WriteI2C(page_lo);
while(SSPCON2bits.ACKSTAT);
+
WriteI2C(data);
while(SSPCON2bits.ACKSTAT);
+
StopI2C();
while(SSPCON2bits.PEN);
- // idle_time_ms(1);
+ do {
+ StartI2C();
+ WriteI2C(i2caddr & 0xfe);
+ idle_time_ms(1);
+ } while(SSPCON2bits.ACKSTAT);
+ StopI2C();
+ while (SSPCON2bits.PEN);
CloseI2C();
#endif // i2c_idle();
return 0xff;
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);
- idle_time_ms(15);
-
- addr += 1;
- data += 1;
- b -= 1;
+ 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);
+ if(sts == 0) return 0;
+ b -= bb;
+ addr += bb;
+ data += bb;
+ }
+
+ 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;
}
+
+ 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);
// delay100tcy(2);
I2C_START();
i2c_writechar(addr | 0x01);
- for(i = 0; i < 64; i++){
+ for(i = 0; i < I2C_ROM_PAGE_SIZE - 1 ; i++){
*p = i2c_readchar();
p++;
I2C_ACK();
}
+ *p = i2c_readchar();
+ I2C_NACK();
I2C_STOP();
i2c_close();
#else
+ if((size == 0) || (size > I2C_ROM_PAGE_SIZE)) return 0x00;
OpenI2C(MASTER, SLEW_ON);
SSPADD = 0x5;
StartI2C();
- WriteI2C(addr & 0xfe);
+ while(SSPCON2bits.SEN);
+ WriteI2C(i2caddr & 0xfe);
// delay1ktcy(8);
+ while(SSPCON2bits.SEN);
WriteI2C(page_hi);
+ while(SSPCON2bits.SEN);
WriteI2C(page_lo);
+ // delay1ktcy(8);
+ StopI2C();
+
IdleI2C();
- RestartI2C();
- WriteI2C(addr | 0x01);
-// IdleI2C();
- for(i = 0; i < 32; i++){
- if(!SSPCON2bits.ACKSTAT){
- SSPCON2bits.RCEN = 1;
- while(SSPCON2bits.RCEN);
- NotAckI2C();
- while (SSPCON2bits.ACKEN);
- StopI2C();
- while (SSPCON2bits.PEN);
- }
- *p = SSPBUF;
- p++;
- if(i < 31) AckI2C();
+ StartI2C();
+ 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++;
+ }
}
- NotAckI2C();
-// IdleI2C();
- StopI2C();
+
+ if (!SSPCON2bits.ACKSTAT){
+ SSPCON2bits.RCEN = 1;
+ while(SSPCON2bits.RCEN);
+ NotAckI2C();
+ while (SSPCON2bits.ACKEN);
+ StopI2C();
+ while (SSPCON2bits.PEN);
+ }
+ *data = SSPBUF;
+
CloseI2C();
#endif
// CLOSEASMASTER();
StartI2C();
while(SSPCON2bits.SEN);
WriteI2C(i2caddr);
- // delay1ktcy(8);
while(SSPCON2bits.SEN);
WriteI2C(page_hi);
while(SSPCON2bits.SEN);
WriteI2C(page_lo);
- // delay1ktcy(8);
StopI2C();
+
IdleI2C();
StartI2C();
WriteI2C(i2caddr | 1);
+
if (!SSPCON2bits.ACKSTAT){
SSPCON2bits.RCEN = 1;
while(SSPCON2bits.RCEN);
while (SSPCON2bits.PEN);
}
c = SSPBUF;
- // delay1ktcy(8);
- // delay1ktcy(8);
CloseI2C();
#endif
// CLOSEASMASTER();
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;
- addr += 1;
- data += 1;
- b -= 1;
+ 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;
}
- return 0xff;
+ 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;
+ }
+
+ if(b != 0){
+ sts = i2c_eeprom_read_1block(i2caddr, addr, data, b);
+ }
+ return sts;
}