Autor Tema: 16f15376 periférico i2c mplab xpress  (Leído 2944 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Rmanzoli

  • PIC10
  • *
  • Mensajes: 3
16f15376 periférico i2c mplab xpress
« en: 15 de Octubre de 2019, 10:24:03 »
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. 
« Última modificación: 15 de Octubre de 2019, 11:19:55 por Rmanzoli »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:16f15376 periférico i2c mplab xpress
« Respuesta #1 en: 15 de Octubre de 2019, 22:47:53 »
Citar
I2C1_MasterWrite(x, 1, adress, &status);

Código: C
  1. I2C1_MasterWrite(&x, 1, adress, &status);

Por que es un char, si fuera un array [] no habria problemas.

Y x son los datos a enviar, si tu I2C necesita : Direccion, Comando, Datos. Ejemplo:

Direccion Registro OLED: 0x0004
Comando: 0x12
Datos: 0x38, 0x41, 0x43

Código: C
  1. uint8_t data[] = {0x00,0x04,0x12,0x38,0x41,0x43};
  2. I2C1_MESSAGE_STATUS status;
  3. uint16_t address_slave_oled = 0x0013;
  4.  
  5. I2C1_MasterWrite(data, 6, address_slave_oled, &status);
« Última modificación: 15 de Octubre de 2019, 23:00:22 por KILLERJC »

Desconectado Rmanzoli

  • PIC10
  • *
  • Mensajes: 3
Re:16f15376 periférico i2c mplab xpress
« Respuesta #2 en: 03 de Noviembre de 2019, 04:13:16 »
Olá amigo. Obrigado pela resposta.
Realmente o endereçamento estava para 8 bits ...e o programa necessitava um de 16 bits.
Realizei essa alteração, mas infelizmente o dispositivo (é como se o módulo I2C não ligasse) não gerou as ondas quadras nas saídas selecionadas.

Desconectado Rmanzoli

  • PIC10
  • *
  • Mensajes: 3
Re:16f15376 periférico i2c mplab xpress
« Respuesta #3 en: 15 de Noviembre de 2019, 10:50:29 »
Mais alguém pode me ajudar ?
Toda ajuda é bem vinda!!


 

anything