sto provando ormai da un paio di giorni a far andare la comunicazione I2C sulla STM32F4discovery. Il problema che ho notato è che il bit ADDR non viene mai settato per cui credo che la comunicazione non avvenga (lo start avviene però perfettamente).
Questa è la configurazione dell'I2C1
- Codice: Seleziona tutto
void I2C_1_Init()
{
/*i2c1 set for sm mode. conn not enabled CR1 for start/stop/enable*/
/*I2C1 reset*/
RCC ->APB1RSTR |= RCC_APB1RSTR_I2C1RST;
RCC ->APB1RSTR &= 0x0000;
/*clock enabler*/
RCC ->APB1ENR |= RCC_APB1ENR_I2C1EN;
/*4mhz for 100KHz speed*/
I2C1 ->CR2 |= I2C_CR2_FREQ_3;
/*interrupt and buffer interrupt enabled*/
I2C1 ->CR2 |= I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN;
/*reset CCR*/
I2C1 ->CCR &= 0x0000;
/*CCR register speed*/
I2C1 ->CCR |= 0x0014;
/*TRISE*/
I2C1 ->TRISE |= 0x0005;
}
Questa è la configurazione delle linee per la comunicazione
- Codice: Seleziona tutto
void GPIO_I2C_Init()
{
/*PB6 SCL PB7 SDA*/
/*register reset*/
RCC ->AHB1RSTR |= RCC_AHB1RSTR_GPIOBRST;
RCC ->AHB1RSTR &= 0x0000;
/*clock enable*/
RCC ->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
/*AF mode*/
GPIOB ->MODER |= GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1;
/*speed*/
GPIOB ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6_1 | GPIO_OSPEEDER_OSPEEDR7_1;
/*open drain mode*/
GPIOB ->OTYPER |= GPIO_OTYPER_OT_6 | GPIO_OTYPER_OT_7;
/*pull-up enabled*/
GPIOB ->PUPDR |= GPIO_PUPDR_PUPDR6_0 | GPIO_PUPDR_PUPDR7_0;
/*I2C_1 connect*/
GPIOB ->AFR[0] = 0x44000000;
}
Mentre questa è la funzione per scrivere l'indirizzo
- Codice: Seleziona tutto
void I2C_1_ADRW(uint8_t adr)
{
uint16_t status;
/*wait for line*/
while((I2C1 ->SR2 & I2C_SR2_BUSY) == I2C_SR2_BUSY);
/*ack enabled*/
I2C1 ->CR1 |= I2C_CR1_ACK;
/*enable line*/
I2C1 ->CR1 |= 0x0001;
/*start event generation*/
I2C1 ->CR1 |= I2C_CR1_START;
/*check start bit generation*/
while(!(I2C1 ->SR1 & 0x0001));
/*write adress*/
I2C1 ->DR = adr;
/*wait for adress sent complete*/
while(!(I2C1 ->SR1 & 0x0002));
/*read status 4 clear*/
status = I2C1 ->SR1;
}
In questa comunicazione la STM32F4 svolge il ruolo del master mentre un sensore BMP180 è lo slave. Ho seguito il più possibile le specifiche indicate dal datasheet ma non funziona. Qualcuno riesce ad aiutarmi? purtroppo non dispongo di oscilloscopio per verifiche...

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)




