Hoje mostro como acessar uma memoria I2C 24Cxx com I2C por software muito útil quando se quer ler essas memorias em microcontroladores que não tenham esse dispositivo por hardware.
[sections] [section title=”Acessando uma memoria 24Cxx com I2C por software”]

#define SDA PORTC.RC4
#define SCL PORTC.RC3
#define TRIS_SDA TRISC.RC4
#define TRIS_SCL TRISC.RC3
#define TRUE 1
#define FALSE 0

#define WRITE_ADDRESS 0xA0
#define READ_ADDRESS 0xA1

// Função que escreve na memória 24C04
void Escrita_EEPROM(unsigned char ucEndereco,unsigned char ucValor)
{
I2C_PIN_Start(); // Start no barramento i2c
I2C_PIN_Wr(WRITE_ADDRESS); // Endereço da memória no hardware do kit (w = 0)
I2C_PIN_Wr(ucEndereco); // Endereço da eeprom onde será salvo o dado
I2C_PIN_Wr(ucValor); // Escreve valor da variável ‘ucValor’ na 24c04
I2C_PIN_Stop(); // Finaliza a comunicação I2C
}
// Função que faz a leitura da memória 24C04
unsigned char Leitura_EEPROM(unsigned char ucEndereco)
{
unsigned char ucLeitura; // Temporário para leitura da memória 24C04.

I2C_PIN_Start(); // start no barramento i2c
I2C_PIN_Wr(WRITE_ADDRESS); // endereço da memória no hardware do kit (w = 0)
I2C_PIN_Wr(ucEndereco); // endereço da eeprom onde será lido o byte
I2C_PIN_Repeated_Start(); // re-start no barramento
I2C_PIN_Wr(READ_ADDRESS); // endereço da memória no hardware do kit (w = 1)
I2C_PIN_Rd(&ucLeitura); // Lê o byte
I2C_PIN_Stop(); // finaliza a comunicação I2C
return(ucLeitura); // Retorna Valor da leitura.
}

void I2C_PIN_delay(void)
{
byte delay;
for(delay=0;delay<20;delay++);
}

byte I2C_PIN_Wr(byte x)
{
int i;
i=0x80;
do
{
SCL=0;
TRIS_SDA =0; /* SDA OUTPUT */
I2C_PIN_delay();
if (x&i)
SDA=1;
else
SDA=0;
I2C_PIN_delay();
SCL=1;
I2C_PIN_delay();
i>>=1;
}while(i!=0);
if (ack()) return(FALSE); /* Test Acknowledge */
}
/******************************************************************************/
byte ack(void)
{
SCL=0; /* Acknowledge */
I2C_PIN_delay();
TRIS_SDA=1; /* SDA Input */
I2C_PIN_delay();
SCL=1;
I2C_PIN_delay(); /* Test Acknowledge */
return(SDA);
}

void I2C_PIN_Rd(byte *x)
{
int i;
TRIS_SDA=1; /* SDA INPUT */
*x=0;
i=0x80;
do
{
SCL=0;
I2C_PIN_delay();
SCL=1;
I2C_PIN_delay();
if (SDA)
*x=(*x)|i;
i>>=1;
}while(i!=0);
}
/******************************************************************************/
void I2C_PIN_Start(void)
{
TRIS_SDA=0;
TRIS_SCL=0;
SDA = 0;
I2C_PIN_delay();
SCL = 1;
I2C_PIN_delay();
SDA = 1;
I2C_PIN_delay(); /* Stop condition */
SDA=0;
I2C_PIN_delay(); /* Start Condition */
}

void I2C_PIN_Stop(void)
{
SCL=0; /* Stop condition */
I2C_PIN_delay();
SDA=0;
TRIS_SDA=0; /* SDA OUTPUT */
I2C_PIN_delay();
SCL=1;
I2C_PIN_delay();
SDA=1;
}

/******************************************************************************/
void MasterAck(void)
{
SCL=0; /* Acknowledge */
I2C_PIN_delay();
SDA=0;
TRIS_SDA=0; /* SDA Output */
I2C_PIN_delay();
SCL=1;
I2C_PIN_delay();
SCL=0;
}

/******************************************************************************/
void I2C_PIN_Repeated_Start(void)
{
SCL = 0;
I2C_PIN_delay();
TRIS_SDA=0;
TRIS_SCL=0;
I2C_PIN_delay();
SDA = 1;
I2C_PIN_delay();
SCL = 1;
I2C_PIN_delay();
SDA = 0; /* Restart now! */
}

[/section] [/sections]
Obrigado e até o próximo post.

DATEK Tecnologia Eletrônica
[LINGUAGEM C] Acessando uma memoria 24Cxx com I2C por software
Tags:             

Deixe uma resposta

%d blogueiros gostam disto: