Skip to content

Instantly share code, notes, and snippets.

@tiagohm
Last active May 13, 2020 19:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tiagohm/5b1b376a2efd434d347355598cf41803 to your computer and use it in GitHub Desktop.
Save tiagohm/5b1b376a2efd434d347355598cf41803 to your computer and use it in GitHub Desktop.
Memória EEPROM de 32Kb da Microchip.
/*
25XX320 - Memoria EEPROM SPI 32Kb
Autor: Tiago Melo
Blog: Microcontrolandos
Compilador: MikroC PRO PIC
Bibliotecas: Soft_SPI
*/
// Pinos do 25AA320.
sbit SoftSpi_SDI at RB2_bit;
sbit SoftSpi_SDO at RB1_bit;
sbit SoftSpi_CLK at RB0_bit;
sbit E25XX320_CS at RB3_bit;
sbit SoftSpi_SDI_Direction at TRISB2_bit;
sbit SoftSpi_SDO_Direction at TRISB1_bit;
sbit SoftSpi_CLK_Direction at TRISB0_bit;
sbit E25XX320_CS_Direction at TRISB3_bit;
// Comandos.
#define E25XX320_CMD_READ 0b00000011
#define E25XX320_CMD_WRITE 0b00000010
#define E25XX320_CMD_WRDI 0b00000100
#define E25XX320_CMD_WREN 0b00000110
#define E25XX320_CMD_RDSR 0b00000101
#define E25XX320_CMD_WRSR 0b00000001
typedef union {
char WIP : 1; // Write-In-Process - Indica se há um escrita ocorrendo.
char WEL : 1; // Write Enable Latch - Indica se é permitido a escrita na memória.
char BP : 2; // Block Protection - Protege um bloco de memória contra escrita.
char : 3;
char WPEN : 1; // Write-Protect Enable - Habilia a proteção da memória.
} E25XX320_Status;
void E25XX320_Init() {
E25XX320_CS_Direction = 0; // Pino de saída.
E25XX320_CS = 1;
}
//Protege ou desprotege contra escrita.
void E25XX320_Write_Enable(char enable) {
E25XX320_CS = 0;
Soft_SPI_Write(enable ? E25XX320_CMD_WREN : E25XX320_CMD_WRDI);
E25XX320_CS = 1;
}
//Realiza a leitura de 1 byte de um determinado endereço.
char E25XX320_Read(unsigned address) {
char byte;
// Habilitamos a comunicação.
E25XX320_CS = 0;
// Enviamos o comando de leitura.
Soft_SPI_Write(E25XX320_CMD_READ);
// Enviamos os 2 bytes de endereço.
Soft_SPI_Write(((char*)&address)[1]); // MSB.
Soft_SPI_Write(((char*)&address)[0]); // LSB.
// Lê o byte.
byte = Soft_SPI_Read(0);
// Encerra a comunicação.
E25XX320_CS = 1;
return byte;
}
void E25XX320_Write(unsigned address, char value) {
// Habilitamos a escrita.
E25XX320_Write_Enable(1);
// Habilitamos a comunicação.
E25XX320_CS = 0;
// Enviamos o comando de escrita.
Soft_SPI_Write(E25XX320_CMD_WRITE);
// Enviamos os 2 bytes de endereço.
Soft_SPI_Write(((char*)&address)[1]); // MSB.
Soft_SPI_Write(((char*)&address)[0]); // LSB.
// Enviamos o valor.
Soft_SPI_Write(value);
// Encerra a comunicação.
E25XX320_CS = 1;
// Aguarda o fim do ciclo de escrita.
Delay_ms(5);
// Desabilitamos a escrita.
E25XX320_Write_Enable(0);
}
// Escreve 32 bytes em uma determinada página.
void E25XX320_Page_Write(unsigned page, char * bytes) {
char length = 32;
char address = page << 6; // O endereço é: página * 32 bytes.
// Habilitamos a escrita.
E25XX320_Write_Enable(1);
// Habilitamos a comunicação.
E25XX320_CS = 0;
// Enviamos o comando de escrita.
Soft_SPI_Write(E25XX320_CMD_WRITE);
// Enviamos os 2 bytes de endereço.
Soft_SPI_Write(((char*)&address)[1]); // MSB.
Soft_SPI_Write(((char*)&address)[0]); // LSB.
// Enviamos os 32 bytes.
while(length--) Soft_SPI_Write(*bytes++);
// Encerra a comunicação.
E25XX320_CS = 1;
// Aguarda o fim do ciclo de escrita.
Delay_ms(5);
// Desabilitamos a escrita.
E25XX320_Write_Enable(0);
}
E25XX320_Status E25XX320_Get_Status() {
E25XX320_Status status;
// Habilitamos a comunicação.
E25XX320_CS = 0;
// Enviamos o comando de leitura do status.
Soft_SPI_Write(E25XX320_CMD_RDSR);
// Lê 1 byte do status.
*((char*)&status) = Soft_SPI_Read(0);
// Encerra a comunicação.
E25XX320_CS = 1;
return status;
}
void E25XX320_Set_Status(E25XX320_Status status) {
// Habilitamos a escrita.
E25XX320_Write_Enable(1);
// Habilitamos a comunicação.
E25XX320_CS = 0;
// Enviamos o comando de escrita no status.
Soft_SPI_Write(E25XX320_CMD_WRSR);
// Escreve 1 byte no status.
Soft_SPI_Write(*(char*)&status);
// Encerra a comunicação.
E25XX320_CS = 1;
// Aguarda o fim do ciclo de escrita.
Delay_ms(5);
}
void main() {
char byte;
Soft_SPI_Init();
E25XX320_Init();
// Escreve o valor 45 no endereço 4095.
E25XX320_Write(4095, 45);
// Realiza a leitura do endereço 4095.
byte = E25XX320_Read(4095);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment