#define DEVICE 0x50
#define MBFSIZE 78
#include "i2cEEPROM.h"
char Dlm[] = ",";
char SBuf[20];
static uint8_t BlkNum = 0;
static uint16_t CrtAdr = 0;
static uint8_t DBuf[MBFSIZE];
static uint8_t SqMode = 0;
static char lstCmd;
uint8_t I2C_Mem_Read(uint16_t adr){
uint8_t bf[2];
bf[0] = adr >> 8;
bf[1] = (uint8_t)adr;
#if I2C == 1
I2C1_WriteNBytes(DEVICE + BlkNum,bf,2);
I2C1_ReadNBytes(DEVICE + BlkNum,bf,1);
#elif I2C == 2
I2C2_WriteNBytes(DEVICE + BlkNum,bf,2);
I2C2_ReadNBytes(DEVICE + BlkNum,bf,1);
#else
I2C_WriteNBytes(DEVICE + BlkNum,bf,2);
I2C_ReadNBytes(DEVICE + BlkNum,bf,1);
#endif
return bf[0];
}
void I2C_Mem_Write(uint16_t adr, uint8_t dt){
uint8_t bf[3];
bf[0] = adr >> 8;
bf[1] = (uint8_t)adr;
bf[2] = dt;
#if I2C == 1
I2C1_WriteNBytes(DEVICE + BlkNum,bf,3);
#elif I2C == 2
I2C2_WriteNBytes(DEVICE + BlkNum,bf,3);
#else
I2C_WriteNBytes(DEVICE + BlkNum,bf,3);
#endif __delay_ms(5);
}
void I2C_Mem_NRead(uint16_t adr, uint8_t *ary, uint8_t n){
uint8_t bf[2];
bf[0] = adr >> 8;
bf[1] = (uint8_t) adr;
if(n > MBFSIZE) n = MBFSIZE;
#if I2C == 1
I2C1_WriteNBytes(DEVICE+BlkNum,bf,2);
I2C1_ReadNBytes(DEVICE+BlkNum,ary,n);
#elif I2C == 2
I2C2_WriteNBytes(DEVICE+BlkNum,bf,2);
I2C2_ReadNBytes(DEVICE+BlkNum,ary,n);
#else
I2C_WriteNBytes(DEVICE+BlkNum,bf,2);
I2C_ReadNBytes(DEVICE+BlkNum,ary,n);
#endif
}
void I2C_Mem_NWrite(uint16_t adr, uint8_t *ary, uint8_t n){
uint8_t bf[MBFSIZE + 2];
bf[0] = adr >> 8;
bf[1] = (uint8_t) adr;
if(n > MBFSIZE) n = MBFSIZE;
memcpy(bf+2,ary,n);
#if I2C == 1
I2C1_WriteNBytes(DEVICE+BlkNum,bf,n+2);
#elif I2C == 2
I2C2_WriteNBytes(DEVICE+BlkNum,bf,n+2);
#else
I2C_WriteNBytes(DEVICE+BlkNum,bf,n+2);
#endif __delay_ms(5);
}
void prt_PBf(){
uint8_t i;
for(i = 0; i < 64; i++){
#ifdef VBA
if(i % 16 == 0) printf("\r");
#else
if(i % 16 == 0) printf("\n\r");
#endif
printf(" %02X",DBuf[i]);
}
puts("\r");
}
int32_t my_xtoi(char *str){
uint32_t dec;
dec = strtoul(str,NULL,16);
return (int32_t)dec;
}
uint16_t i2cRom_cmd_W(char *str){
char *pt;
uint8_t last;
int32_t res = 0;
uint8_t dt = 0;
uint16_t cnt = 0;
lstCmd = str[0];
if(strlen(str)==1){
SqMode = 1;
#ifndef VBA
puts("SqMode ON\n\r");
#endif
return 0;
}
last = (uint8_t)strlen(str)-1;
if(str[last] == ','){
SqMode = 1;
#ifndef VBA
puts("SqMode ON\n\r");
#endif
str[last]='\0';
}
if(str[1]!=','){
pt = strtok(str+1,Dlm);
if(pt != NULL){
res = my_xtoi(pt);
CrtAdr = (uint16_t)res;
}
pt = strtok(NULL,Dlm);
}else{
pt = strtok(str+1,Dlm);
}
do{
if(pt != NULL){
res = my_xtoi(pt);
if(res < 0) return cnt;
dt = (uint8_t)res;
if(lstCmd=='W'){
I2C_Mem_Write(CrtAdr,dt);
}else if(lstCmd == 'S'){
DBuf[CrtAdr & 0x3F]= dt;
}
sprintf(SBuf,"%d:%04X < %02X",BlkNum,CrtAdr,dt);
#ifdef VBA
printf("%s\r",SBuf);
#else
printf("%s\n\r",SBuf);
#endif
LCD_cursor(1,1); LCD_str(SBuf);
CrtAdr++; cnt++;
pt = strtok(NULL,Dlm);
}
}while(pt != NULL);
return cnt;
}
uint16_t i2cRom_cmd_R(char *str){
char *pt;
uint16_t n = 1;
int32_t res = 0;
uint8_t dt;
uint16_t cnt = 0;
uint8_t i;
lstCmd = str[0];
if(strlen(str) > 1){
if(str[1]==','){
pt = strtok(str+2,Dlm);
if(pt != NULL){
res = my_xtoi(pt);
n = (uint16_t)res;
}
}else{
pt = strtok(str+1,Dlm);
if(pt != NULL){
res = my_xtoi(pt);
CrtAdr = (uint16_t)res;
}
pt = strtok(NULL,Dlm);
if(pt != NULL){
res = my_xtoi(pt);
n = (uint16_t)res;
}
}
}
for(i = 0; i < n;i++ ){
dt = I2C_Mem_Read(CrtAdr);
sprintf(SBuf,"%d:%04X > %02X",BlkNum,CrtAdr,dt);
#ifdef VBA
printf("%s\r",SBuf);
#else
printf("%s\n\r",SBuf);
#endif
LCD_cursor(1,1); LCD_str(SBuf);
CrtAdr++; cnt++;
}
SqMode = 0;
return cnt;
}
uint16_t i2cRom_cmd_WSQ(char *str){
char *pt;
uint8_t dt;
int32_t res;
uint16_t cnt = 0;
pt = strtok(str,Dlm);
while(pt != NULL){
res = my_xtoi(pt);
dt = (uint8_t)res;
if(lstCmd == 'W'){
I2C_Mem_Write(CrtAdr,dt);
}else if(lstCmd=='S'){
DBuf[CrtAdr & 0x3F]= dt;
}
#ifdef VBA
printf("%d:%04X < %02X\r",BlkNum,CrtAdr,dt);
#else
printf("%d:%04X < %02X\n\r",BlkNum,CrtAdr,dt);
#endif
CrtAdr++; cnt++;
pt = strtok(NULL,Dlm);
}
return cnt;
}
int i2cRom_cmd_M(char *str){
char *pt;
uint8_t b;
lstCmd = str[0];
if(str[1] != 'B') return -1;
pt = strtok(str+2,Dlm);
if(pt==NULL) return -1;
b = atoi(pt) & 0x01;
#ifdef VBA
printf("Bank %d selected\r",b);
#else
printf("Bank %d selected\n\r",b);
#endif
BlkNum = b * 4;
CrtAdr = 0;
SqMode = 0;
return b;
}
void i2cRom_cmd_Q(char *str){
lstCmd = str[0];
SqMode = 0;
#ifndef VBA
puts("SqMode OFF\r");
#endif
}
int i2cRom_cmd_U(char *str){
char *pt;
int32_t res;
uint16_t ad;
lstCmd = str[0];
pt = strtok(str+1,Dlm);
if(pt != NULL){
res = my_xtoi(pt);
CrtAdr = (uint16_t)res;
}
ad = CrtAdr & 0xFFC0;
I2C_Mem_NRead(ad,DBuf,64);
printf("%d:%04X - %04X",BlkNum,ad,ad+63);
prt_PBf();
SqMode = 0;
return 0;
}
int i2cRom_cmd_P(char *str){
char *pt;
int32_t res;
uint16_t ad;
lstCmd = str[0];
if(strlen(str)==1){
printf("PageBuffer");
prt_PBf();
return 0;
}
if(str[1]=='R'){
i2cRom_cmd_U(str+1);
return 0;
}
if(str[1] != 'W') return -1;
pt = strtok(str+2,Dlm);
if(pt != NULL){
res = my_xtoi(pt);
CrtAdr = (uint16_t)res;
}
ad = CrtAdr & 0xFFC0;
I2C_Mem_NWrite(ad,DBuf,64);
#ifdef VBA
printf("Page Write %d:%04X - %04X\r",BlkNum,ad,ad+63);
#else
printf("Page Write %d:%04X - %04X\n\r",BlkNum,ad,ad+63);
#endif
SqMode = 0;
return 0;
}
uint8_t i2cRom_SqMode(){
return SqMode;
}
|