PROBLEMA:
Considerando um bloco de 100 bytes por exemplo, quando começo a escrever a partir da memória ZERO (0x0000), os dados são salvos corretamente. Quando mando escrever a partir de qualquer outra memória maior que zero, os dados ficam desorganizados ou a ordem pula uma sequência.. enfim, fica bagunçado!
A função é essa abaixo. Alguém tem ideia de onde pode estar o problema?
- Código: Selecionar todos
/*==============================================================================
function : signed char writeBlock_24C64
Descrição : Escreve um bloco de dados a partir de um endereço de memória
Parâmetros: deviceAddr : Endereço do dispositivo no barramento I2C
dataAddr : Endereço da memória a ser escrita
blockLength: Número de caracteres a serem escritos
*datBlock : Ponteiro para o bloco de dados a ser escrito na memória.
Retorno: ERROR_MEMORY_OVERFLOW: Estouro de memória
ERROR_UNKNOW : Erro de escrita
SUCCESS_EXEC : Memórias escritas com sucesso
--------------------------------------------------------------------------------
EXEMPLO DE USO:
char i= 0;
char txt[100];
char ler[100];
char val[4];
writeBlock_24C64(0xA2, 0x0F0F, sizeof(txt), txt);
readBlock_24C64(0xA2, 0x0F0F, sizeof(ler), ler);
for (i = 0; i < sizeof(ler); i++ ) {
ByteToStr(ler[i], val);
UART1_Write_Text(val);
}
==============================================================================*/
signed char writeBlock_24C64(char deviceAddr, unsigned int dataAddr, unsigned int blockLength, char *datBlock) {
char aux;
unsigned int i, count;
// Testa se o o espaço disponível para gravar dados é suficiente
// e se existe pelo menos 1 byte a ser salvo na memória
if ((blockLength >= (MEMORY_LENGTH_24C64 - dataAddr)) || (blockLength <= 0)) return ERROR_MEMORY_OVERFLOW;
// Inicia o primeiro bloco
I2C1_Start();
if (I2C1_Wr(deviceAddr)) return ERROR_UNKNOW;
aux = (dataAddr >> 8) & 0x1F;
if (I2C1_Wr(aux)) return ERROR_UNKNOW;
aux = dataAddr & 0x00FF;
if (I2C1_Wr(aux)) return ERROR_UNKNOW;
i = 0;
count = 1;
while (i < blockLength) {
// Escreve o dado propriamente e avança para o próximo caracter
if (I2C1_Wr(*datBlock)) return ERROR_UNKNOW;
datBlock++;
i++;
// Verifica a quebra de pagina de memória
if (i / (count * PAGE_BLOCK_WIDTH_24C64)) {
// Finaliza a escrita do bloco corrente
I2C1_Stop();
count++;
delay_ms(10);
// Restarta o próximo bloco de dados para escrita
I2C1_Start();
if (I2C1_Wr(deviceAddr)) return ERROR_UNKNOW;
aux = ((dataAddr + i) >> 8) & 0x1F;
if (I2C1_Wr(aux)) return ERROR_UNKNOW;
aux = (dataAddr + i) & 0x00FF;
if (I2C1_Wr(aux)) return ERROR_UNKNOW;
}
}
I2C1_Stop();
delay_ms(10);
return SUCCESS_EXEC;
}