Domanda

Voglio ottenere i dati da ADXL345 accelerometro, ma sembra che mi collego in modo errato.

Scl PC6 (con 10k resistenza)

SDA- PC7 (con 10k resistenza)

SDO- GND

CS - VCC

GND - GND

3.3v - VCC

Ecco il mio codice per inizializzare:

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);
}

In un esempio ho visto

GPIO_PinAFConfig(GPIOC,SCLSource,GPIO_AF_I2CG);

GPIO_PinAFConfig(GPIOC,SDASource,GPIO_AF_I2CG);

Ma io non ho questa API disponibili.

Please help me. Ho provato molte soluzioni e anche provato a connettersi tramite SPI, ma senza successo :( Si prega di aiuto con I2C.

È stato utile?

Soluzione

Scl PC6 (con 10k resistenza)

SDA- PC7 (con 10k resistenza)

SCL e SDA devono essere collegati direttamente. Si dovrebbe usare resistori pull-up come su questo schema: http://en.wikipedia.org /wiki/File:I2C.svg

Il codice di inizializzazione sembra ok, quindi forse il cablaggio hardware è sbagliato?

Altri suggerimenti

Mi rendo conto che questo è un vecchio post, ma ne vale la pena sottolineare. Non si dovrebbe essere utilizzando bandiere APB per configurare il bus AHB. Controllare il manuale di RM0008 programmatori (supponendo che si sta utilizzando un dispositivo STM32F10x) per le impostazioni appropriate.

Ho avuto lo stesso problema come voi. La condizione di avvio è stata generata ma il bit I2Cx_SR1.SB non viene impostato. Ho pensato che ho dovuto abilitare la funzione alternativa I2C, ma ho dovuto disattivare tutte le altre funzioni nel perno troppo. Nel mio caso è stato funzione UART3 conflitto con I2C.

C'è codice e app note di esempio per l'STM32 da qualcuno che sostiene di aver ottenuto I2C a lavorare qui:

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

Forse cercare di ottenere qualcosa di noto come un lavoro EEPROM seriale prima di provare l'accelerometro sconosciuta. Una volta che si è sicuri alla fine microcontrollore funziona è possibile collegare l'accelerometro e vedere quello che si ottiene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top