Página 1 de 1

ATmega simulando memória 24Cxx

MensagemEnviado: 30 Mai 2023 16:04
por longo.251272
Boa tarde pessoal,

Estou tentando simular uma EEPROM 24C512 com o ATmega168 que tem eeprom interna e comunicação twi configurado como i2c escravo.
Usei a biblioteca deste exemplo https://github.com/thegouger/avr-i2c-slave/blob/master/main.c

Estou conseguindo enviar e receber os dados sem problema, porém não estou conseguindo identificar quando o comando é read ou write.

Read
Capturar1.JPG


Write
Capturar.JPG


A única diferença conforme as figuras acima é que no Read ocorre dois start's antes do stop bit. Alguém tem alguma ideia de como posso identificar quando o mestre está lendo um dado ou escrevendo um dado ?

Obrigado pela atenção de todos

Re: ATmega simulando memória 24Cxx

MensagemEnviado: 01 Jun 2023 17:42
por brasilma
Olá Longo,

Veja se isto ajuda: https://learn.sparkfun.com/tutorials/re ... eproms/all

Abraços

Re: ATmega simulando memória 24Cxx

MensagemEnviado: 01 Jun 2023 19:23
por cfreund
https://ww1.microchip.com/downloads/en/ ... oc1116.pdf

Na página 10, temos:
Código: Selecionar todos
Read operations are initiated the same way as write operations with the exception that
the Read/Write select bit in the device address word is set to “1”. There are three read
operations: current address read, random address read and sequential read.


Na figura 7, diz como deve ser codificado o endereço do dispositivo. Os 7 bits mais significantes são o endereçamento e o LSB (bit 0) diz se é leitura ou escrita. Esse bit, quando em nível alto, indica leitura.

Na página 11, temos os exemplos do protocolo de comunicação.

Re: ATmega simulando memória 24Cxx

MensagemEnviado: 01 Jun 2023 21:58
por tcpipchip

Re: ATmega simulando memória 24Cxx

MensagemEnviado: 02 Jun 2023 09:01
por longo.251272
Obrigado pelo retorno de todos.

A intenção era substituir a 24C512 pelo ATMEGA sem precisar alterar o rotina de o micro controlador que estava acessando ela.
Mas como ficou um pouco confuso trabalhando com a biblioteca acima para fazer uma rotina para identificar o comando Read recebido pelo ATMEGA e fazer a leitura da EEPROM e pra retornar o dado pro I2C resolvi acrescentar um dado a mais entre o "Device Address" e o "First Word Address" indicando se é leitura ou escrita, assim funcionou sem problema.

Agradeço a atenção
Longo

Re: ATmega simulando memória 24Cxx

MensagemEnviado: 02 Jun 2023 10:52
por cfreund
Tá, mas você viu que o bit que indica se é leitura ou escrita está dentro dos 8 bits do "Device Address"? rs

Re: ATmega simulando memória 24Cxx

MensagemEnviado: 02 Jun 2023 13:26
por longo.251272
Vi sim, porém a biblioteca não me disponibiliza esse byte.

Rotinas que estou usando,
Código: Selecionar todos
void I2C_Iniciar( void )
{
   // set received/requested callbacks
   I2C_setCallbacks( I2C_Received, I2C_Transmit );

   // init I2C
   I2C_init( I2C_ADDR );
}
void I2C_Received( uint8_t received_data )
{
   I2C_RxPosBuffer ++;
   I2C_RxBuffer[ I2C_RxPosBuffer ] = received_data;
}
void I2C_Transmit( void )
{
   I2C_transmitByte( I2C_TxData );
}


A I2C_Received me retorna os dados recebidos após o "Device Adrdress". Talvez uma opção seria alterar a biblioteca.