Estou com alguns problemas referentes a comunicação i2c com uma memória eeprom 24lc512.
Se alguém puder me ajudar, ficaria grato.
Irei postar as duas funções que eu fiz, mas que não estão funcionando. Creio que esqueci algum detalhe, além de que, nunca trabalhei com comunicação i2c.
- Código: Selecionar todos
/*
*****************************************************************************
** EEPROM EXTERNA
**
*****************************************************************************
*/
#include "eeprom_externa.h"
#include <plib.h>
#include "Main.h"
/*
**===========================================================================
** void I2C_EEPROM_write(unsigned short endereco, unsigned char dado)
**
** Escreve um byte na memoria 24LC512
**===========================================================================
*/
void I2C_EEPROM_write(unsigned short endereco, unsigned char dado)
{
unsigned char endereco_high;
unsigned char endereco_low;
endereco_high = endereco >> 8;
endereco_low = endereco;
// RestartI2C2();//reseta barramento
StartI2C2();//envia Start
IdleI2C2();//aguarda até completar
MasterWriteI2C2(endereco_high);//envia endereço parte high
IdleI2C2();//aguarda até completar
MasterWriteI2C2(endereco_low);//envia endereço parte low
IdleI2C2();//aguarda até completar
MasterWriteI2C2(dado);//envia dado
IdleI2C2();//aguarda até completar
StopI2C1();//envia stop
IdleI2C1();//aguarda até completar
DelayMs(10);//DELAY DE 10ms
}
/*
**===========================================================================
** void I2C_EEPROM_W_write(unsigned short endereco, unsigned short dado)
**
** Escreve uma Word na memoria 24LC512
**===========================================================================
*/
void I2C_EEPROM_W_write(unsigned short endereco, unsigned short dado)
{
unsigned char dado_high;
unsigned char dado_low;
dado_high = dado >> 8;
dado_low = dado;
I2C_EEPROM_write(endereco,dado_low);
I2C_EEPROM_write(endereco+1,dado_high);
}
/*
**===========================================================================
** unsigned char I2C_EEPROM_read(unsigned short endereco)
**
** Lê um byte na memoria 24LC512
**===========================================================================
*/
unsigned char I2C_EEPROM_read(unsigned short endereco)
{
unsigned char endereco_high;
unsigned char endereco_low;
unsigned char dado;
endereco_high = endereco >> 8;
endereco_low = endereco;
//RestartI2C2();//reseta barramento
StartI2C2();//envia Start
IdleI2C2();//aguarda até completar
MasterWriteI2C2(endereco_high);//ENVIA END. PARTE ALTA
IdleI2C2();//aguarda até completar
MasterWriteI2C2(endereco_low);//ENVIA END. PARTE BAIXA
IdleI2C2();//AGUARDA END. PARTE BAIXA
RestartI2C2();//ENVIA RESTART
IdleI2C2();//AGUARDA RESTART
while (!DataRdyI2C2());
dado=MasterReadI2C2();
IdleI2C2();
StopI2C1();//envia stop
return(dado); //RETORNA DADO
}
/*
**===========================================================================
** unsigned short I2C_EEPROM_W_read(unsigned short endereco)
**
** Lê uma word na memoria 24LC512
**===========================================================================
*/
unsigned short I2C_EEPROM_W_read(unsigned short endereco)
{
return((I2C_EEPROM_read(endereco+1)*256)+I2C_EEPROM_read(endereco)); //RETORNA DADO
}
Como podem perceber estou utilizando as macros prontas da "plib" do PIC32.
Grato por qualquer tipo de ajuda.