Last active
May 13, 2020 19:10
-
-
Save tiagohm/5b1b376a2efd434d347355598cf41803 to your computer and use it in GitHub Desktop.
Memória EEPROM de 32Kb da Microchip.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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