Bom dia à todos.
Sou novo no fórum, logo, gostaria que tivessem paciência, caso minha dúvida ou erro seja trivial.
Adquiri há muitos anos um pic 16f15376. Comecei a tentar aprender a utilizá-lo e consegui progresso nos periféricos EUSART, NCO, PWM, converso AD, protocolo SPI.... mas infelizmente o protocolo i2c não foi possível.
Como estou bastante tempo tentando e sem sucesso, vim pedir a ajuda de vocês.
Criei a função abaixo, para que eu pudesse pesquisar no barramento qual é o endereço do dispositivo escravo (no caso, um display Oled ssd1306 128x32):
void testadress(void)
{ int adress=0, t=0;
char x;
I2C1_MESSAGE_STATUS status;
for (adress=0; adress<=0xFFFF ; adress++)
{ t=0;
printf ("Endereço: %d \n\r",adress);
I2C1_MasterWrite(x, 1, adress, &status);
/* while(status == I2C1_MESSAGE_PENDING)
{ if (t ==30)
{ t=0;
break;
}
printf ("pending \n\r");
t++;
}
*/
if (status == I2C1_MESSAGE_COMPLETE)
{ printf ("Endereço certo: %d \n",adress);
break;
}
if (adress == 0xFFFF )
printf ("erro de endereço! \n\r");
}
return;
}
A função já fornecida pelo mplab xpress (que estou tentando utilizar) é :
void I2C1_MasterWrite(
uint8_t *pdata,
uint8_t length,
uint16_t address,
I2C1_MESSAGE_STATUS *pflag)
{
static I2C1_TRANSACTION_REQUEST_BLOCK trBlock;
// check if there is space in the queue
if (i2c1_object.trStatus.s.full != true)
{
I2C1_MasterWriteTRBBuild(&trBlock, pdata, length, address);
I2C1_MasterTRBInsert(1, &trBlock, pflag);
}
else
{
*pflag = I2C1_MESSAGE_FAIL;
}
}
São várias funções, vou tentar anexar o código todo.
Desde já, agradeço qualquer ajuda que possa me fazer conseguir ter sucesso.