2014-06-06 16 views
5

Attualmente sto cercando di ottenere una coppia di stm32l152 (kit di rilevamento) per comunicare tramite I2C. (Non sto usando la libreria periferica standard fornita da STM come voglio provare a realizzare l'i2c me ..)Configurazione delle porte di uscita STM32 per I2C

La mia configurazione è come segue:

  • modalità di indirizzamento a 7 bit (nessun doppio indirizzo, solo OAR1)

  • velocità 100kHz

  • ACK abilitata (slave)

  • dis ACK abili (su maestro, dal momento che solo 1 byte che vengono trasmessi tra master/slave in qualsiasi momento)

  • sia master/slave, utilizzando GPIOB (PB10) come SCL e GPIOB (PB11) come SDA

Ecco la parte strana: quando configuro i 2 pin GPIOB come push-pull (senza pullup/down), sono in grado di vedere il mio master inviare il bit di start, il byte di indirizzo .. sull'oscilloscopio.

Ma il mio schiavo non sta restituendo un riconoscimento. lo so per certo perché il master non ha asserito il bit ADDR in SR1, non vedo ack sull'oscilloscopio e anche lo slave non è entrato in interrupt (ho abilitato l'interrupt di evento I2C sullo slave).

su uno sguardo ravvicinato alla forma d'onda sull'oscilloscopio, ho realizzato che il segnale (sia SCL, SDA) non andava completamente a 0Volt per la logica bassa, sono invece a 1 volt. sto indovinando questo forse perché lo schiavo non può leggere il byte di indirizzo dal padrone e quindi non ha rinviato l'ack.

Così configuro i 2 pin GPIO come open-drain (senza pullup/down) .. ma ora il mio master non può inviare il bit di start .. passo il codice e ho visto che il bit SB del master in SR1 è impostato quando imposto il bit START .. ma non vedo alcuna risposta sui segnali SDA e SCL sull'oscilloscopio (entrambi sono alti a 3V).

(ho estratto sia SCL che SDA a 3v utilizzando 10kohms su ciascuna linea).

risposta

5

ok, penso di aver trovato la risposta .. Ho cercato la libreria delle periferiche standard fornita da STM e ho seguito la loro sequenza di configurazione. Prima di allora, stavo usando la sequenza sbagliata di configurazione delle porte GPIO ...

La sequenza testata di lavorare è:

  1. Abilita I2C e GPIO orologi.

  2. Configurare l'AF desiderato delle porte. (AF4 per i2c in stm32).

  3. Configurazione GPIO:

    3a. imposta i GPIO come AF.

    3b. imposta la velocità della porta.

    3c. impostare il tipo di porta (open-drain).

    3d. impostato su nessun pull-up/pull-down.

  4. Configura i2c. (registra CR2, CCR, CR1, OAR1, ...).

precedenza, ero facendo passo 3 prima del passo 2, e non v'è alcuna uscita dalle porte quando si genera il bit START.

Spero che questo aiuti chi ha lo stesso problema.

+0

Si dovrebbe accettare la risposta se ciò ha funzionato. –

Problemi correlati