Come correttamente inizializzazione STM32 I2C?
-
25-10-2019 - |
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.
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.