da
WALTERmwp » 8 mag 2015, 13:09
alle96, non so se nel frattempo hai risolto: se si, meglio, e ignora quanto riportato altrimenti, per darmi l'opportunità di provare ad interpretare il codice, dovresti rispondere a quanto segue:
ì) qual è il valore di "
adr" in questa assegnazione ?
- Codice: Seleziona tutto
I2C1 ->DR = adr;
(presumo come scritto dopo 0xEF)
ìì) perché dopo aver scritto "
0xD0" in DR esegui questa istruzione ?
- Codice: Seleziona tutto
/*ack disable*/
I2C1 ->CR1 &= ~I2C_CR1_ACK;
iii) hai letto, con attenzione quanto riportato a pag.22 del datasheet del sensore ?
Riesci a interpretare il diagramma dei temi riportato nella stessa ?
Prima abbiamo stabilito che nella trasmissione non specificavi l'indirizzo dello slave mentre ora bisogna stabilire se hai compreso il criterio indicato (sempre pag.22).
Se (il criterio) è valido anche per acquisire il contenuto del registro "
0xD0" allora devi:
1) inviare lo start bit,
2) inviare lo "
address write command" (ovvero "
0xEE") del sensore,
3) inviare il valore dell'indirizzo di memoria del quale intendi leggere il contenuto, cioè "
0xD0",
4) inviare, di nuovo, lo start bit (assume significato di "Restart"),
5) inviare lo "
address read command" (ovvero "
0xEF") del sensore,
6) ricevere (se arriva) dal sensore il byte che contiene il valore richiesto (forse potrebbe rispondere con un solo byte ma anche con due),
7) non inviare allo slave il bit di ACK (se ci si aspetta l'arrivo di un solo byte) e al successivo impulso dello SCL inviare il bit di STOP.
Per quanto riguarda (2) e (3), ovviamente, devi prevedere la ricezione del bit di ACK che il sensore ti deve inviare.
Saluti
W - U.H.F.