Pregunta

Quiero obtener datos del acelerómetro ADXL345, pero parece que lo conecto incorrectamente.

SCL- PC6 (con resistencia de 10k)

SDA-PC7 (con resistencia de 10k)

Sdo- gnd

CS - VCC

GND - GND

3.3V - VCC

Aquí está mi código para initalizar:

void I2CG_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    I2C_InitTypeDef  I2C_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
        // I2CG clock enable
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2CG, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_APB1Periph_I2CG, ENABLE);
    // GPIOB clock enable
    // I2CG SCL and SDA configuration
    GPIO_InitStructure.GPIO_Pin = SCL|SDA;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    // Enable I2CG reset state
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2CG, ENABLE);
       // Release I2CG from reset state
       RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2CG, DISABLE);
    I2C_DeInit(I2C1);
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_16_9;
    I2C_InitStructure.I2C_OwnAddress1 =  1;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = ClockSpeed;


    I2C_Init(I2CG, &I2C_InitStructure);
    I2C_Cmd(I2CG, ENABLE);
    I2C_AcknowledgeConfig(I2CG, ENABLE);
}

En un ejemplo que vi

GPIO_PinAFConfig(GPIOC,SCLSource,GPIO_AF_I2CG);

GPIO_PinAFConfig(GPIOC,SDASource,GPIO_AF_I2CG);

Pero no tengo esta API disponible.

Por favor, ayúdame. Probé muchas soluciones y también intenté conectarme a través de SPI, pero no hay éxito :( Por favor, ayude con I2C.

¿Fue útil?

Solución

SCL- PC6 (con resistencia de 10k)

SDA-PC7 (con resistencia de 10k)

SCL y SDA deben conectarse directamente. Debe usar resistencias pull-up como en este esquema: http://en.wikipedia.org/wiki/file:i2c.svg

Su código de inicialización se ve bien, ¿tal vez el cableado de hardware está mal?

Otros consejos

Me doy cuenta de que esta es una publicación antigua, pero vale la pena señalarlo. No debería usar los indicadores APB para configurar el bus AHB. Verifique el manual de programadores RM0008 (suponiendo que esté utilizando un dispositivo STM32F10X) para obtener la configuración apropiada.

Yo tenía el mismo problema que tú. Se generó la condición de inicio, pero el bit i2cx_sr1.sb no se establece. Pensé que tenía que habilitar la función alternativa I2C, pero también tuve que deshabilitar todas las demás funciones en el pin. En mi caso era la función UART3 en conflicto con I2C.

Hay un código de muestra y notas de aplicación para el STM32 por alguien que afirma haber hecho que I2C funcione aquí:

http://www.stm32challenge.com/node/143

Tal vez trate de hacer que algo se conozca como un EEPROM en serie que funcione antes de probar el acelerómetro desconocido. Una vez que esté seguro de que el final del microcontrolador funciona, puede conectar el acelerómetro y ver lo que obtiene.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top