por madimbu_souza » 28 Abr 2009 01:51
Para quem quiser utilisar a rotina para leitura e escrita eeprom 24c04.
#define EEPROM_id 0xA0 //adress da eeprom no barrmento 1010
#define EEPROM_address 0 // adres jampeado no caso 00
#define read 1
#define write 0
#define end_low 0
#define end_high 2
char dado_1;
unsigned contador=0;
void Delay(void);
void i2c_init(void);
void EEPROM_bytewrite(unsigned char endereco, unsigned char dado,unsigned char end_L_H);
unsigned char EEPROM_byteread(unsigned char endereco,unsigned char end_L_H);
void i2c_init(void)
{
IICF =0x40; // configura o clock da I2C (aprox. 100kHz) mentira.uahuah
SOPT2_IICPS=1;//pins ptbd6 e ptbd 7
IICC =0x80; // habilita modulo interface I2C
}
void EEPROM_bytewrite(unsigned char endereco, unsigned char dado,unsigned char end_L_H)
{
unsigned char temp;
// envia o campo de endereçamento
do
{
// ativa a transmissão e o modo mestre
// envia condição START
IICC = 0xb0;
// envia o campo de endereçamento (escrita) e o bloco a ser gravado o dado.
IICD =EEPROM_id + EEPROM_address + end_L_H + write;
// aguarda um tempo
for (temp=5;temp;temp--);
// verifica se a transmissão foi completada
while (!IICS_TCF);
// verifica se a EEPROM emitiu ACK
if (IICS_RXAK)
{
// se não emitiu, o mestre envia um STOP
IICC = 0x80;
for (temp=5;temp;temp--);
}
} while (IICS_RXAK); // se não recebeu ACK, repete o envio do endereço
IICD =endereco;// envia o endereço do dado a ser gravado
while (!IICS_TCF); // aguarda a transferência
while(IICS_RXAK); //aguarda receber ack
IICD = dado; // escreve o dado a ser programado
for (temp=5;temp;temp--); //aguarda um tempo
while (!IICS_TCF); // aguarda a transferência
while(IICS_RXAK); //aguarda sinal ack
Delay();
Delay();
Delay();
// sai do modo mestre. Isto provoca a emissão de uma condição STOP
// a memória interpreta o STOP como sinal para iniciar a gravação
IICC = 0x80; //condiçao de stop
Delay();
}
unsigned char EEPROM_byteread(unsigned char endereco,unsigned char end_L_H)
{
unsigned char temp;
unsigned char dado;
do
{
// ativa a transmissão e o modo mestre
// envia condição START
IICC = 0xb0;
// envia o campo de endereçamento (escrita) e o bloco a ser gravado o dado.
IICD =EEPROM_id + EEPROM_address + end_L_H + write;
// aguarda um tempo
for (temp=5;temp;temp--);
// verifica se a transmissão foi completada
while (!IICS_TCF);
// verifica se a EEPROM emitiu ACK
if (IICS_RXAK)
{
// se não emitiu, o mestre envia um STOP
IICC = 0x80;
for (temp=5;temp;temp--);
}
} while (IICS_RXAK); // se não recebeu ACK, repete o envio do endereço
Delay();
IICD = endereco; // envia o endereço a ser lido
while (!IICS_TCF); // aguarda a transferência
while(IICS_RXAK); //aguarda receber ack
for (temp=255;temp;temp--); // aguarda um tempo *****
//Delay();
//Delay();
// Delay();
IICC_RSTA=1; //envia um novo start (repete start)
// envia o campo de endereçamento (leitura)
IICD = EEPROM_id + EEPROM_address + end_L_H + read;
//for (temp=5;temp;temp--); // aguarda um tempo
while (!IICS_TCF); // aguarda a transferência
for (temp=255;temp;temp--); // aguarda um tempo *****
IICC_TX=0; //MODO DE RECEPÇAO
dado=IICD; //le o iicd para iniciar uma recepçao;
//for (temp=5;temp;temp--); // aguarda um tempo
while (!IICS_TCF); // aguarda a transferência
IICC_TXAK=1; //envia um nack
while (!IICS_TCF); // aguarda a transferência
dado=IICD; //le o iicd
while (!IICS_TCF); // aguarda a transferência
IICC_TX=1; //MODO DE RECEPÇAO
IICC_TXAK=1; //envia um nack
IICC=0x80; //desliga comunicaçao
for(temp=50;temp;temp--);// aguarda um tempo
return(dado);
}
void Delay(void)
{
MTIMSC_TOF=0; //apaga o flag mtim
MTIMCLK_PS=0b0001; //seleciona prescaler
MTIMMOD = 0x00; // Fixa que o Registrador de comparação estará com valor 0
// para que o contador funcione em contagem direta (livre).
MTIMSC_TRST = 1; // Provoca um reset no contador.
MTIMSC_TSTP = 0; // Retira o contador do estado de stop.
while (MTIMCNT < 50 )
{
// Não há necessidade de uma declaração, o que se deseja é um loop
// para gerar uma base de tempo que será o delay calculado. Este loop
// apenas irá testar o limite do conteúdo do módulo contador MTIMCNT.
}
MTIMSC_TSTP = 1; // Faz um stop no contador.
MTIMSC_TRST = 1; // Zera-se o contador por motivo de segurança.
}