Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

I2C1 STM32

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] I2C1 STM32

Messaggioda Foto Utentealle96 » 26 apr 2015, 7:49

Ciao a tutti,
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...
Avatar utente
Foto Utentealle96
15 4
 
Messaggi: 47
Iscritto il: 21 feb 2012, 16:21

0
voti

[2] Re: I2C1 STM32

Messaggioda Foto UtenteWALTERmwp » 27 apr 2015, 18:27

Ciao Foto Utentealle96 cosa significa ?
alle96 ha scritto:Il problema che ho notato è che il bit ADDR non viene mai settato
Mentre qui
alle96 ha scritto:per cui credo che la comunicazione non avvenga (lo start avviene però perfettamente).
cosa intendi affermando che lo "start avviene" ?
Hai dei riscontri o presumi ?
Come hai collegato la stm con il bmp180 (il sensore di pressione, presumo) ?

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[3] Re: I2C1 STM32

Messaggioda Foto Utentelelerelele » 28 apr 2015, 16:12

Ottimo sensore, mi sono fatto una cultura I2C su questo proprio qualche mese fa,sia pilotandolo con porta I2c che con porta normale RAx, risultato ottimo, molto rognoso effettuare la marea di calcoli senza float....

Hai la possibilità di leggere con oscilloscopio i segnali?
Altro problema riscontrato con il sensore, a volte si pianta la comunicazione, (più che altro mi è successo in fase di programmazione), e non risponde più, si deve interromperne l'alimentazione e riparte alla grande, in condizioni di funzionamento normale non mi è mai successo.

saluti.
Avatar utente
Foto Utentelelerelele
4.899 3 7 9
Master
Master
 
Messaggi: 5505
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[4] Re: I2C1 STM32

Messaggioda Foto UtenteWALTERmwp » 28 apr 2015, 16:27

alle96 ha scritto:Qualcuno riesce ad aiutarmi? purtroppo non dispongo di oscilloscopio per verifiche...

lelerelele ha scritto:Hai la possibilità di leggere con oscilloscopio i segnali?

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[5] Re: I2C1 STM32

Messaggioda Foto Utentelelerelele » 28 apr 2015, 16:32

WALTERmwp ha scritto:
alle96 ha scritto:Qualcuno riesce ad aiutarmi? purtroppo non dispongo di oscilloscopio per verifiche...

lelerelele ha scritto:Hai la possibilità di leggere con oscilloscopio i segnali?

Saluti


Oooopssss. ?%

Pardon.

Comunque io ho usato spesse volte un paio di led collegando il comune al + e due resistori serie da 4.7K al bus, è gia una buona partenza per verificare che almeno il bus parta da libero e poi arrivino i segnali.

saluti.
Avatar utente
Foto Utentelelerelele
4.899 3 7 9
Master
Master
 
Messaggi: 5505
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[6] Re: I2C1 STM32

Messaggioda Foto Utentealle96 » 30 apr 2015, 6:59

Dunque, il bit ADDR è un bit di un registro del STM32F4 che viene settato dal microcontrollore quando durante la comunicazione I2C il byte contenente l'adress viene inviato senza problemi. Questo bit con me non viene mai settato.

Il bit di Start ,invece, viene settato se lo start avviene senza problemi. Questo bit viene invece settato.
Ciò mi ha fatto pensare che la comunicazione non avvenga proprio nonostante lo start avvenga.
Più tardi provo a collegare il led come proposto sotto e posto se vi serve lo schema.

Per quanto riguarda il programma sembra giusto?
Avatar utente
Foto Utentealle96
15 4
 
Messaggi: 47
Iscritto il: 21 feb 2012, 16:21

0
voti

[7] Re: I2C1 STM32

Messaggioda Foto Utentelelerelele » 30 apr 2015, 14:14

non conosco quel micro, comunque ammesso che hai settato correttamente la porta, la frequenza della stessa, l'hardware abbia i pullup....lo standard I2C prevede che il master invii lo start, poi la stringa con il codice componente e l'ultima cifra indica se vai in scrittura od in lettura......, dopo di che lo slave deve inviare l'ACK per indicare che ha ricevuto, ed è qua che ho avuto i problemi maggiori.
Penso che se ricevi l'OK per lo start, indica solamente che il bus era libero ed hai inviato lo start, il resto è da vedere.....

saluti.
Avatar utente
Foto Utentelelerelele
4.899 3 7 9
Master
Master
 
Messaggi: 5505
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[8] Re: I2C1 STM32

Messaggioda Foto UtenteWALTERmwp » 1 mag 2015, 3:28

Foto Utentealle96 ti sono chiare le caratteristiche di funzionamento del bus I2C ?
alle96 ha scritto:Il bit di Start ,invece, viene settato se lo start avviene senza problemi.
per l'applicazione del bit di start si tratta solo di effettuare un cambiamento di stato della linea dati (SDA) da alto(High) a basso(Low) e non hai cominciato ancora a trasmettere nulla.

Considera che ad ogni byte che il master trasmette, lo slave "risponde" con un bit di acknowledge (ACK), sempre sulla linea SDA; il master naturalmente si aspetta questo.

Se diamo per scontato che le sintassi delle configurazioni sono corrette ci dovresti scrivere, almeno, in quale punto pensi che il tuo codice della funzione "I2C_1_ADRW" si blocca o non risponde all'aspettativa.
E' qui che ti fermi ?
Codice: Seleziona tutto
/*wait for adress sent complete*/
while(!(I2C1 ->SR1 & 0x0002));

In alternativa, riporta altre informazioni.
Non sappiamo che strumenti di diagnostica/debug puoi impiegare: puoi fare ad esempio un semplice trace ?

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[9] Re: I2C1 STM32

Messaggioda Foto Utentealle96 » 4 mag 2015, 14:07

Chiedo scusa per il ritardo nella risposta ma non trovavo tempo per scrivere.
Foto UtenteWALTERmwp si mi blocco in quel punto.
Per il debug io posso fare il classico debug e il trace sinceramente non so cosa sia dal momento che a scuola non l'abbiamo mai visto, se mi puoi chiarire cosa sia magari te lo riesco a dire. Grazie per la collaborazione O_/
Avatar utente
Foto Utentealle96
15 4
 
Messaggi: 47
Iscritto il: 21 feb 2012, 16:21

0
voti

[10] Re: I2C1 STM32

Messaggioda Foto UtenteWALTERmwp » 4 mag 2015, 15:21

alle96 ha scritto:Chiedo scusa
di nulla.
Con "trace" intendo(si intende) più semplicemente generare una "traccia" ovvero tutta una serie di informazioni (generate direttamente o indirettamente) che possono essere di aiuto per provare a interpretare quello che succede, o che non succede (dipende dai punti di vista); per questo, per esempio, anche delle "printf" possono costituire un "trace".

Vi siete messi a lavorare su un "chippottino" di tutto rispetto: non lo conosco e non conosco la scheda che comunque intendo acquistare.
Sono andato a vedere il datasheet e, come immaginavo, nella descrizione del registro/bit in causa trovi questa nota: "Note: ADDR is not set after a NACK reception".
Ma ti precisa che il bit viene messo a 1 se il master (l'ST) riceve l'ACK.
Ora, nel Post [8] avevo riportato delle indicazioni, senza cognizione dell'hardware, ma mi pare trovino fondamento.

Riscrivo, non ho verificato l'impostazione (configurazione) che presumo corretta quindi, per quanto sopra, mi pare che il sensore non risponda (presupposto un coretto interfacciamento).
Allora può darsi che semplicemente non invii l'indirizzo corretto: lui non "si" riconosce e non gestisce l'ACK sulla SDA.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti