PicManía by RedRaven |
Búsqueda personalizada
|
PROYECTOS : AUX Quad-EEPROM I2C |
||
512 Kbytes de EEPROM con cuatro 24AA1025 |
|
Circuito auxiliar de Memoria EEPROM 1024 Kbits x 4 : 8 = 512 Kbytes |
Descripción
del Proyecto: |
|
|
|
|
|
Implementación
y consideraciones Hardware: |
|
|
|
|
|
Las distintas funciones de cada uno de los pines puede verse en la siguiente tabla extraída del Datasheet del 24AA1025: |
|
|
|
Esquema: |
|
|
|
|
|
|
|
Circuito impreso: |
|
|
Fotografías: |
No disponibles aún. |
Recursos: |
Driver y Software: |
|
|
|
|
|
|
1ª.- Escribir un byte (data) en una dirección de memoria (memAddress): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Que nos devuelve 1, 2, 3 ó 4 dependiendo de si memAddress es mayor 0x00000 y menor que 0x1FFFF, ó es mayor que 0x20000 y menor que 0x3FFFF ... etc. etc. |
|
|
|
|
int32 memAbsoluteAddress2menRelativeAddress(int8 deviceOrder,int32 memAddress); |
Que nos va a ajustar memAddress a la dirección relativa dentro de cada uno de los Chip, haciendo que cada una de ellas comienze realmente en 0x00000. |
int1 menRelative2BankSelect(int32 memRelativeAddress); |
|
|
|
Driver: 24aa1025x4.c | ||
/////////////////////////////////////////////////////////////////////////////// // // 4 x EEPROM 24AA1025 Driver with absolute memory addressing // /////////////////////////////////////////////////////////////////////////////// #define EEDEBUG // device hardware address int8 const deviceAddress1 = 0b00000011; // #3 int8 const deviceAddress2 = 0b00000010; // #2 int8 const deviceAddress3 = 0b00000001; // #1 int8 const deviceAddress4 = 0b00000000; // #0 // baseAddress = 8 bits which mean ... // // Fixed (4 bits) -> 1010 // EE internal Block (1 bit) -> 0 for 0000/FFFF, 1 for 10000/1FFFF // Dev Hard Address (2 bits) -> 00 or 01 or 10 or 11 // R/W (1 bit) -> 0 -> Write / 1 -> Read int8 const baseAddress24AA1025 = 0b10100000; // Aux Functions ////////////////////////////////////////////////////////////// int1 menRelative2BankSelect(int32 memRelativeAddress){ int1 returnBit=0; if(memRelativeAddress>(int32) 0xffff) returnBit = 1; return returnBit; } int32 memAbsoluteAddress2menRelativeAddress(int8 deviceOrder, int32 memAddress){ int32 returnInt32 = 0; switch(deviceOrder){ case 1: returnInt32 = memAddress; break; case 2: returnInt32 = memAddress - 0x20000; break; case 3: returnInt32 = memAddress - 0x40000; break; case 4: returnInt32 = memAddress - 0x60000; break; } return returnInt32; } int8 memAbsoluteAddress2deviceOrder(int32 memAddress){ int8 returnByte=0; if((memAddress>0x05ffff)&&(memAddress<0x080000)) returnByte=4; if((memAddress>0x03ffff)&&(memAddress<0x060000)) returnByte=3; if((memAddress>0x01ffff)&&(memAddress<0x040000)) returnByte=2; if( (memAddress<0x020000)) returnByte=1; return returnByte; } int8 memAbsoluteAddress2deviceAddress(int32 memAddress){ int8 deviceOrder=0, returnByte=0; deviceOrder = memAbsoluteAddress2deviceOrder(memAddress); switch(deviceOrder){ case 0: returnByte = 0xff; break; case 1: returnByte = deviceAddress1; break; case 2: returnByte = deviceAddress2; break; case 3: returnByte = deviceAddress3; break; case 4: returnByte = deviceAddress4; break; } return returnByte; } // Main Functions ///////////////////////////////////////////////////////////// void writeByte24AA1025(int32 memAddress, int8 data){ int8 baseAddress; int8 deviceAddress; int8 deviceOrder=0; int32 memRelativeAddress; int8 bank=0; deviceAddress = memAbsoluteAddress2deviceAddress(memAddress); deviceOrder = memAbsoluteAddress2deviceOrder(memAddress); memRelativeAddress = memAbsoluteAddress2menRelativeAddress(deviceOrder, memAddress); bank = menRelative2BankSelect(memRelativeAddress); baseAddress = baseAddress24AA1025 + (bank<<3) + (deviceAddress<<1); #ifdef EEDEBUG printf("\r\n\nAbsolute Address: %LX Relative Address: %Lx Device: %u Bank: %u\r\n",memAddress,memRelativeAddress,deviceOrder,bank); #endif i2c_start(); i2c_write(baseAddress); i2c_write(memRelativeAddress>>8); i2c_write(memRelativeAddress); i2c_write(data); i2c_stop(); delay_ms(5); } int8 readByte24AA1025(int32 memAddress){ int8 returnByte=0; int8 baseAddress; int8 deviceAddress; int8 deviceOrder=0; int32 memRelativeAddress; int8 bank=0; deviceAddress = memAbsoluteAddress2deviceAddress(memAddress); deviceOrder = memAbsoluteAddress2deviceOrder(memAddress); memRelativeAddress = memAbsoluteAddress2menRelativeAddress(deviceOrder, memAddress); bank = menRelative2BankSelect(memRelativeAddress); baseAddress = baseAddress24AA1025 + (bank<<3) + (deviceAddress<<1); #ifdef EEDEBUG printf("\r\n\nAbsolute Address: %LX Relative Address: %Lx Device: %u Bank: %u\r\n",memAddress,memRelativeAddress,deviceOrder,bank); #endif i2c_start(); i2c_write(baseAddress); i2c_write(memRelativeAddress>>8); i2c_write(memRelativeAddress); i2c_start(); i2c_write(baseAddress|1); returnByte = i2c_read(0); i2c_stop(); return returnByte; } /////////////////////////////////////////////////////////////////////////////// |
||
|
Como os dije mas arriba el siguiente programa es una adaptación del programa de ejemplo ex_extee.c de la gente de CCS C que podéis encontrar en el directorio examples de la instalación de dicho compilador. |
test_eeprom_24aa1025x4.c | ||
/////////////////////////////////////////////////////////////////////////////// // // eeprom_24aa1025x1.c // // based upon ex_extee.c example by CCS // and "Microchip 24AA512 512k I2C EEPROM driver" by UFAnders // in http://www.ccsinfo.com/forum/ // // by RedPic from http://picmania.garcia-cuervo.net // // October 2006 // /////////////////////////////////////////////////////////////////////////////// #include <18F4550.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) #use i2c(master, sda=PIN_B0, scl=PIN_B1) #include <input.c> #include <24aa1025x4.c> const char Version[]="1.0.F\0"; /////////////////////////////////////////////////////////////////////////////// // // Main // /////////////////////////////////////////////////////////////////////////////// void main() { BYTE value, cmd; int32 address; int8 device; delay_ms(300); printf("\r\n\n"); printf("[RRBOARD2] EEPROM Total Commander %s\r\n",version); printf("based on 24AA1025 Microchip Hardware\r\n"); printf("\xa9 10.2006 by RedPic\r\n\n"); do{ do{ printf("\r\nDo you Read or Write? : "); cmd=getc(); cmd=toupper(cmd); putc(cmd); }while ((cmd!='R') && (cmd!='W')); printf("\n\rGive me EEPROM internal absolute Address (24 bits) in hex : "); address = gethex(); address = (address<<8)+gethex(); address = (address<<8)+gethex(); device = memAbsoluteAddress2deviceAddress(address); if(cmd=='R') printf("\r\nReturn Value (8 bits) in hex is : %X\r\n",readByte24AA1025(address)); if(cmd=='W') { printf("\r\nEnter new value (8 bits) in hex : "); value = gethex(); printf("\n\r"); writeByte24AA1025(address, value ); } }while(TRUE); } |
||
|
Funcionando: |
|
|
|
|
PCB's en PDF Listos para imprimir. |
Esta página se modificó el 27/12/2008
|