#include "P18F87J60.h"
#pragma config XINST = OFF
#pragma config WDT = OFF
//34719377 84154969
void Nop_longo(void);
void wren(void);
void wrsr(void);
void rdsr(void);
void delay_5ms(void);
void read_e2prom(unsigned char endereco_hi,unsigned char endereco_lo);
void write_e2prom(unsigned char endereco_hi,unsigned char endereco_lo,unsigned char dado);
unsigned char flag_ok,valor_e2prom,rxdata,n;
#define e2_cs PORTAbits.RA4 //saida 0
#define led PORTFbits.RF7 //0
void main (void)
{
ClrWdt();
TRISC = 0b00010000;
TRISA = 0b11100111;
TRISF = 0;
SSP1CON1 = 0X31;
SSP1STAT = 0X80;
PIE1 = 0;
ADCON1 = 0XFF;
PORTAbits.RA3 = 1;
PORTGbits.RG3 = 1;
TRISG = 0;
while(1)
{
e2_cs = 1;
write_e2prom(0,0,0x55);
read_e2prom(0,0);
if(flag_ok == 1)
{
flag_ok = 0;
while(valor_e2prom == 0x55)//PODE TIRAR
{led ^= 1;
PORTB ^=0b11111111;
delay_5ms();
delay_5ms();
delay_5ms();
delay_5ms();
delay_5ms();
delay_5ms();
delay_5ms();
delay_5ms();
delay_5ms();
delay_5ms();
delay_5ms();
}
}
}
}
void write_e2prom(unsigned char endereco_hi,unsigned char endereco_lo,unsigned char dado)
{
ClrWdt();
wren();
wrsr();
delay_5ms();
wren();
rdsr();
//escreve valores
e2_cs = 0; //
//libera spi para envio
SSP1BUF = 2; //COMANDO DE ESCRITA
Nop_longo();
while(SSP1STATbits.BF == 0){;}
rxdata = SSP1BUF; //LEIO BUFFER DE RETORNO SO PARA ESVAZIAR
//fim
SSP1BUF = endereco_hi; //endereco high
Nop_longo();
while(SSP1STATbits.BF == 0){;}
rxdata = SSP1BUF; //LEIO BUFFER DE RETORNO SO PARA ESVAZIAR
SSP1BUF = endereco_lo; //endereco high
Nop_longo();
while(SSP1STATbits.BF == 0){;}
rxdata = SSP1BUF; //LEIO BUFFER DE RETORNO SO PARA ESVAZIAR
SSP1BUF = dado; //dado
Nop_longo();
while(SSP1STATbits.BF == 0){;}
rxdata = SSP1BUF; //LEIO BUFFER DE RETORNO SO PARA ESVAZIAR
e2_cs = 1;
Nop_longo();
Nop_longo();
e2_cs = 0;
//
SSP1BUF = 0x05; //dado
Nop_longo();
while(SSP1STATbits.BF == 0){;}
rxdata = SSP1BUF; //LEIO BUFFER DE RETORNO SO PARA ESVAZIAR
for(n=0;n<20;n++)
{
Nop_longo();
}
e2_cs = 0;
rxdata = 1; //forca rotina
while(rxdata == 1)
{
e2_cs = 0;
SSP1BUF = 0x05; //dado
Nop_longo();
while(SSP1STATbits.BF == 0){;}
rxdata = SSP1BUF; //LEIO BUFFER DE RETORNO SO PARA ESVAZIAR
SSP1BUF = 0x05; //dado
Nop_longo();
while(SSP1STATbits.BF == 0){;}
rxdata = SSP1BUF; //LEIO BUFFER DE RETORNO SO PARA ESVAZIAR
e2_cs = 1;
rxdata &=0b00000001; //filtro o valor para ver se terminou
}
e2_cs = 1;
}
void read_e2prom(unsigned char endereco_hi,unsigned char endereco_lo)
{
ClrWdt();
e2_cs = 0;
SSP1BUF = 0x03; //comando leitura
Nop_longo();
while(SSP1STATbits.BF == 0){;}
rxdata = SSP1BUF; //LEIO BUFFER DE RETORNO SO PARA ESVAZIAR
SSP1BUF = endereco_hi; //
Nop_longo();
while(SSP1STATbits.BF == 0){;}
rxdata = SSP1BUF; //LEIO BUFFER DE RETORNO SO PARA ESVAZIAR
SSP1BUF = endereco_lo; //
Nop_longo();
while(SSP1STATbits.BF == 0){;}
rxdata = SSP1BUF; //LEIO BUFFER DE RETORNO SO PARA ESVAZIAR
SSP1BUF = endereco_lo; //pode ser qualquer valor so para ler 1 byte
Nop_longo();
while(SSP1STATbits.BF == 0){;}
valor_e2prom = SSP1BUF; //leio valor
flag_ok = 1;
e2_cs = 1;
}
void rdsr(void)
{
ClrWdt();
e2_cs = 0;
SSP1BUF = 0x05; //comando leitura
Nop_longo();
while(SSP1STATbits.BF == 0){;}
rxdata = SSP1BUF; //LEIO BUFFER DE RETORNO SO PARA ESVAZIAR
SSP1BUF = 0x05; //comando leitura
Nop_longo();
while(SSP1STATbits.BF == 0){;}
rxdata = SSP1BUF; //LEIO BUFFER DE RETORNO SO PARA ESVAZIAR
e2_cs = 1;
}
void delay_5ms(void)
{
unsigned int tempo;
for(tempo = 0; tempo < 5000;tempo++)
{
Nop_longo();
}
}
void wren(void)
{
ClrWdt();
e2_cs = 0;
SSP1BUF = 0x06; //comando enable
Nop_longo();
while(SSP1STATbits.BF == 0){;}
rxdata = SSP1BUF; //LEIO BUFFER DE RETORNO SO PARA ESVAZIAR
e2_cs = 1;
}
void wrsr(void)
{
e2_cs = 0;
ClrWdt();
SSP1BUF = 0x01; //comando enable
Nop_longo();
while(SSP1STATbits.BF == 0){;}
rxdata = SSP1BUF; //LEIO BUFFER DE RETORNO SO PARA ESVAZIAR
SSP1BUF = 0x0; //comando enable
Nop_longo();
while(SSP1STATbits.BF == 0){;}
rxdata = SSP1BUF; //LEIO BUFFER DE RETORNO SO PARA ESVAZIAR
e2_cs = 1;
}
void Nop_longo(void)
{
ClrWdt();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
Nop();
}
评论0