Función de pin alternativa de Infineon XMC4200 para I2C usando XMClib

0

Ya que no puedo publicar más en el foro XMC de infineon, intentaré encontrar ayuda en este foro.

Estoy trabajando en mi primer código I2C con el kit hexagonal XMC4200. Estoy usando Dave4 con el XMCLib. Estoy intentando usar I2C con un PCA9865, la dirección estándar es 0x40 (probé esto con un código de escáner I2C). El problema que tengo ahora: no hay ACK que regresa del PCA9865. Mi primera pregunta es: De acuerdo con la hoja de datos de XMC, una dirección I2C debe desplazarse 1 posición a la izquierda (para el bit de lectura de lectura) o estoy equivocado en este caso? Si esto es correcto, debería usar la dirección 0x80, ¿verdad? Mi segunda pregunta: Como no tengo alcance, no puedo verificar si realmente hay una señal I2C proveniente de los pines que estoy usando. No estoy muy seguro de la función / pines alternativos con los que elijo trabajar. Publicaré mi código (solo I2C) a continuación, ¿alguien podría verificar si esto es correcto para el XMC4200? ¡Gracias a todos!

#include <xmc_i2c.h>
#define PIN_SDA P0_4
#define PIN_SCL P0_5

    /*I2C settings*/

XMC_USIC_CH_t *i2c = XMC_I2C1_CH0;
XMC_I2C_CH_CONFIG_t i2c_cfg =
{
        .baudrate = 100000U,
};

    /* I2C init*/
XMC_I2C_CH_Init(i2c, &i2c_cfg);
XMC_I2C_CH_SetInputSource(i2c, XMC_I2C_CH_INPUT_SDA, USIC1_C0_DX0_P0_4); /*eerst USIC1_C0_DX0_P0_4*/
XMC_I2C_CH_SetInputSource(i2c, XMC_I2C_CH_INPUT_SCL, USIC1_C0_DX0_P0_5); /*eerst USIC1_C0_DX0_P0_5*/
XMC_I2C_CH_Start(i2c);


    /*config pins I2C*/
XMC_GPIO_CONFIG_t   config_SDA;
config_SDA.mode = XMC_GPIO_MODE_OUTPUT_OPEN_DRAIN_ALT2;
config_SDA.output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM;
config_SDA.output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH;
XMC_GPIO_Init(PIN_SDA, &config_SDA);

XMC_GPIO_CONFIG_t   config_SCL;
config_SCL.mode = XMC_GPIO_MODE_OUTPUT_OPEN_DRAIN_ALT2;
config_SCL.output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM;
config_SCL.output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH;
XMC_GPIO_Init(PIN_SCL, &config_SCL);

    /*I2C COMMUNICATION*/
/*Address(addr) should reserve an additional bit at the LSB for read/write indication. For example, address 0x05 should be provided as 0x0a.*/
#define PCA9865_ADDRES (0x40)

XMC_I2C_CH_MasterStart(i2c, PCA9865_ADDRES, XMC_I2C_CH_CMD_WRITE);
while((XMC_I2C_CH_GetStatusFlag(i2c) & XMC_I2C_CH_STATUS_FLAG_ACK_RECEIVED) == 0U)
{
    /*wait for ack*/
}

XMC_I2C_CH_ClearStatusFlag(i2c, XMC_I2C_CH_STATUS_FLAG_ACK_RECEIVED);
    
pregunta reyntjensm

0 respuestas

Lea otras preguntas en las etiquetas