From 49a4c4477b5f46fcac5d7af0d3fa279d8daf4116 Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Mon, 26 Aug 2013 22:01:41 +0900 Subject: [PATCH] [I2C_ROM] Block Write/Block Read even unaligned address and size. --- i2c_eeprom.c | 123 +++++++++++++++++++++++++++++++++--------------------- menu_memoryfreq.c | 4 +- 2 files changed, 78 insertions(+), 49 deletions(-) diff --git a/i2c_eeprom.c b/i2c_eeprom.c index e1cd425..9046628 100644 --- a/i2c_eeprom.c +++ b/i2c_eeprom.c @@ -31,10 +31,12 @@ #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); @@ -48,6 +50,7 @@ static unsigned char i2c_eeprom_write_1block(unsigned char i2caddr, unsigned cha I2C_STOP(); i2c_close(); #else + if((size == 0) || (size > I2C_ROM_PAGE_SIZE)) return 0x00; OpenI2C(MASTER, SLEW_ON); SSPADD = 0x5; IdleI2C(); @@ -64,25 +67,25 @@ static unsigned char i2c_eeprom_write_1block(unsigned char i2caddr, unsigned cha 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(); @@ -140,29 +143,41 @@ unsigned char i2c_eeprom_bytewrite(unsigned char i2caddr, unsigned int addr, uns 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); @@ -184,11 +199,12 @@ static unsigned char i2c_eeprom_read_1block(unsigned char addr, unsigned char pa 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); @@ -199,16 +215,17 @@ static unsigned char i2c_eeprom_read_1block(unsigned char addr, unsigned char pa 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){ @@ -261,9 +278,11 @@ unsigned char i2c_eeprom_byteread(unsigned char i2caddr, unsigned int addr) while(SSPCON2bits.SEN); WriteI2C(page_lo); StopI2C(); + IdleI2C(); StartI2C(); WriteI2C(i2caddr | 1); + if (!SSPCON2bits.ACKSTAT){ SSPCON2bits.RCEN = 1; while(SSPCON2bits.RCEN); @@ -282,21 +301,31 @@ unsigned char i2c_eeprom_byteread(unsigned char i2caddr, unsigned int addr) 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; } diff --git a/menu_memoryfreq.c b/menu_memoryfreq.c index 0cadf42..af5f527 100644 --- a/menu_memoryfreq.c +++ b/menu_memoryfreq.c @@ -184,14 +184,14 @@ void on_updown_userfreq(void) } call_freqbank(setup.memorynum); break; - case charcode_8: // Up CH FAST + case charcode_8: // Up CH MID setup.memorynum += USER_MEMORY_NUM; if(setup.memorynum >= (USER_MEMORY_NUM * USER_MEMORY_BANKS)) { setup.memorynum = setup.memorynum - USER_MEMORY_NUM * USER_MEMORY_BANKS; } call_freqbank(setup.memorynum); break; - case charcode_2: // Down CH FAST + case charcode_2: // Down CH MID if(setup.memorynum < USER_MEMORY_NUM) { setup.memorynum = (USER_MEMORY_NUM * USER_MEMORY_BANKS) - USER_MEMORY_NUM + setup.memorynum; } else { -- 2.11.0