domingo, 16 de junho de 2013

PIC: EEPROM I2C

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.
Para fazer a escrita ou leitura é necessário seguir esta sequência:


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:
  1. #define Lo(param) ((char *)&param)[0]
  2. #define Hi(param) ((char *)&param)[1]
  3. void Eeprom_24C32A_WriteByte(char DEVICE, unsigned address, char wData)
  4. {
  5. I2C1_Start();// Envia um sinal de Start
  6. I2C1_Wr(0xA0 | (DEVICE << 1));//Envia o endereço, device e comando de escrita
  7. I2C1_Wr(Hi(address)); //envia o byte mais significativo do endereço
  8. I2C1_Wr(Lo(address)); //envia o byte menos significativo do endereço
  9. I2C1_Wr(wData); //envia o dado a ser gravado
  10. I2C1_Stop(); //sinal de stop
  11. Delay_ms(5); //tempo de uma gravação
  12. }
  13. char Eeprom_24C32A_ReadByte(char DEVICE, unsigned address)
  14. {
  15. char rData;
  16. I2C1_Start();
  17. I2C1_Wr(0xA0 | (DEVICE << 1));
  18. I2C1_Wr(Hi(address));
  19. I2C1_Wr(Lo(Address));
  20. I2C1_Repeated_Start();
  21. I2C1_Wr(0xA1 | (DEVICE << 1));//Envia o endereço, device e comando de leitura
  22. rData = I2C1_Rd(0);
  23. I2C1_Stop();
  24. return rData;
  25. }
  26. void Eeprom_24C32A_WriteString(char DEVICE, unsigned address, char *wData)
  27. {
  28. while(*wData != 0)
  29. {
  30. Eeprom_24C32A_WriteByte(DEVICE, address++, *(wData++));
  31. }
  32. }
  33. void Eeprom_24C32A_ReadString(char DEVICE, unsigned address, char *rData, char Size)
  34. {
  35. char i;
  36. while(i < Size)
  37. {
  38. rData[i++] = Eeprom_24C32A_ReadByte(DEVICE, address++);
  39. }
  40. }
  41. char Eeprom_24C32A_Connected(char DEVICE)
  42. {
  43. char ack;
  44. I2C1_Start();
  45. ack = I2C1_Wr(0xA0 | (DEVICE << 1));//retorna 0 se nao houver erro
  46. I2C1_Stop();
  47. return !ack;
  48. }

EXEMPLO

  1. char nome[16];
  2. void main()
  3. {
  4. I2C1_Init(100000);//inicia modulo i2c
  5. UART1_Init(9600);
  6. delay_ms(10);
  7. Eeprom_24C32A_WriteByte(0, 0, 0x05);//escreve o valor 0x05 no endereço 0 do dispositivo 0
  8. Eeprom_24C32A_WriteByte(1, 0, 0x01);//escreve o valor 0x01 no endereço 0 do dispositivo 1
  9. Eeprom_24C32A_WriteString(0, 1, "TiagoHenrique");//escreve uma string a partir do endereço 1
  10. Eeprom_24C32A_ReadString(0, 1, nome, 13);//faz a leitura de 13 caracter a partir do endereço 1
  11. Uart1_write_text(nome);
  12. }
Material da Pagina: http://microcontrolandos.blogspot.com.br/

0 comentários:

Postar um comentário