PIC: EEPROM I2C
Neste post, irei falar sobre como trabalhar com memórias externas.
Utilizarei a memória Eeprom 24C32A.
Esta memória possui as seguintes características:
- Comunicação via protocolo I2C;
- Possui uma memória de 32K(4096 x 8);
- Vida útil de mais de 1000000 de ciclos de escrita;
- Data Protect;
- Pode-se conectar até 8 memórias no mesmo barramento.
CONTROL BYTE é formado pelo SLAVE ADDRESS(1010), pelo DEVICE SELECT(A2, A1, A0) e um comando (Escrita = 0, Leitura = 1).
Veja que o DEVICE SELECT é definido ligando os pinos A2, A1 e A0 da memória.
O pino WP quando no nível alto, projete a memória contra a gravação.
DOWNLOAD:
Projeto: I2C_Eeprom.zip
BIBLIOTECA:
- #define Lo(param) ((char *)¶m)[0]
- #define Hi(param) ((char *)¶m)[1]
- void Eeprom_24C32A_WriteByte(char DEVICE, unsigned address, char wData)
- {
- I2C1_Start();// Envia um sinal de Start
- I2C1_Wr(0xA0 | (DEVICE << 1));//Envia o endereço, device e comando de escrita
- I2C1_Wr(Hi(address)); //envia o byte mais significativo do endereço
- I2C1_Wr(Lo(address)); //envia o byte menos significativo do endereço
- I2C1_Wr(wData); //envia o dado a ser gravado
- I2C1_Stop(); //sinal de stop
- Delay_ms(5); //tempo de uma gravação
- }
- char Eeprom_24C32A_ReadByte(char DEVICE, unsigned address)
- {
- char rData;
- I2C1_Start();
- I2C1_Wr(0xA0 | (DEVICE << 1));
- I2C1_Wr(Hi(address));
- I2C1_Wr(Lo(Address));
- I2C1_Repeated_Start();
- I2C1_Wr(0xA1 | (DEVICE << 1));//Envia o endereço, device e comando de leitura
- rData = I2C1_Rd(0);
- I2C1_Stop();
- return rData;
- }
- void Eeprom_24C32A_WriteString(char DEVICE, unsigned address, char *wData)
- {
- while(*wData != 0)
- {
- Eeprom_24C32A_WriteByte(DEVICE, address++, *(wData++));
- }
- }
- void Eeprom_24C32A_ReadString(char DEVICE, unsigned address, char *rData, char Size)
- {
- char i;
- while(i < Size)
- {
- rData[i++] = Eeprom_24C32A_ReadByte(DEVICE, address++);
- }
- }
- char Eeprom_24C32A_Connected(char DEVICE)
- {
- char ack;
- I2C1_Start();
- ack = I2C1_Wr(0xA0 | (DEVICE << 1));//retorna 0 se nao houver erro
- I2C1_Stop();
- return !ack;
- }
EXEMPLO
- char nome[16];
- void main()
- {
- I2C1_Init(100000);//inicia modulo i2c
- UART1_Init(9600);
- delay_ms(10);
- Eeprom_24C32A_WriteByte(0, 0, 0x05);//escreve o valor 0x05 no endereço 0 do dispositivo 0
- Eeprom_24C32A_WriteByte(1, 0, 0x01);//escreve o valor 0x01 no endereço 0 do dispositivo 1
- Eeprom_24C32A_WriteString(0, 1, "TiagoHenrique");//escreve uma string a partir do endereço 1
- Eeprom_24C32A_ReadString(0, 1, nome, 13);//faz a leitura de 13 caracter a partir do endereço 1
- Uart1_write_text(nome);
- }
Material da Pagina: http://microcontrolandos.blogspot.com.br/
0 comentários:
Postar um comentário