I2C - dsPIC

  • Taglia
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
9 Anni 11 Mesi fa #1 da Taglia
I2C - dsPIC è stato creato da Taglia
Ciao a tutti, eccomi di nuovo.

Sto cercando di far comunicare il mio dsPIC con una eeprom esterna(24LC512) attraverso il protocollo I2C, ma purtroppo sto sbagliando qualcosa!! :(

Il codice è scritto in mplab xc16.
Sotto metto il codice...
Code:
void Open_I2C(void) { OpenI2C((I2C_ON & I2C_IDLE_CON & I2C_CLK_HLD & I2C_IPMI_DIS & I2C_7BIT_ADD & I2C_SLW_EN & I2C_SM_DIS & I2C_GCALL_DIS & I2C_STR_DIS & I2C_NACK & I2C_ACK_DIS & I2C_RCV_DIS & I2C_STOP_DIS & I2C_RESTART_DIS & I2C_START_DIS), 0x2E); IdleI2C(); } void WriteByte(unsigned char AddressIC, unsigned int AddressRegister, unsigned char DataByte) { unsigned char i,j; i = AddressRegister >>8; j = AddressRegister; StartI2C(); //scrivo l'indirizzo della eeprom MasterWriteI2C(AddressIC); AckI2C(); MasterWriteI2C(i); AckI2C(); MasterWriteI2C(j); AckI2C(); MasterWriteI2C(DataByte); AckI2C(); StopI2C(); IdleI2C(); return; } unsigned char ReadByte(unsigned char AddressIC, unsigned int AddressRegister) { unsigned char i,j; unsigned char var=1; i = AddressRegister >>8; j = AddressRegister; StartI2C(); //scrivo l'indirizzo della eeprom MasterWriteI2C(AddressIC); AckI2C(); MasterWriteI2C(i); AckI2C(); MasterWriteI2C(j); AckI2C(); RestartI2C(); //StartI2C(); MasterWriteI2C(AddressIC+1); AckI2C(); var = MasterReadI2C(); //AckI2C(); NotAckI2C(); StopI2C(); IdleI2C(); return var; } int main(int argc, char** argv) { unsigned char temp = 0; init_porte(); DisableIntMI2C; Retroilluminazione=1; Open_I2C(); HomeLCD; ClearLCD(); //12345678901234567890 WriteStringLCD(0,0,"------esempio-------"); __delay_ms(500); WriteStringLCD(0,1,"--valore-salvato:---"); __delay_ms(500); WriteByte(0xA2,0x10,5); //__delay_ms(500); temp = ReadByte(0xA2,0x10); lcd_gotoxy(1,3); WriteCharLCD(48+(temp/10)%10); WriteCharLCD(48+temp%10); while(1) { } }

Grazie!!!

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • alfa75
  • Platino Utente
  • Platino Utente
Di più
9 Anni 11 Mesi fa #2 da alfa75
Risposta da alfa75 al topic I2C - dsPIC
Ciao taglia
puoi darci qualche notizia in piu?
che genere di problemi ti sta dando...compliazione o altro?

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Taglia
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
9 Anni 11 Mesi fa #3 da Taglia
Risposta da Taglia al topic I2C - dsPIC
Ciao alfa75,

In teoria il programma è semplicissimo, scrivo 5 nella cella 0x10 della eeprom, successivamente vado a leggerla e visualizzare il contenuto a display, dovrei trovare 5, invece trovo sempre "00".

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • alfa75
  • Platino Utente
  • Platino Utente
Di più
9 Anni 11 Mesi fa - 9 Anni 11 Mesi fa #4 da alfa75
Risposta da alfa75 al topic I2C - dsPIC
Allora..
ho dato un occhiata piu approfondita
se non vado errato dopo la funzione StartI2C() devi attendere la fine della sequenza di start tramite il flag I2CCONbits.SEN prima di poter continuare

ho trovato questo esempio se può essere d'aiuto
Code:
#include<i2c.h> void main(void ) { unsigned int config2, config1; unsigned char *wrptr; unsigned char tx_data[] = {'M','I','C','R','O',’C’,'H','I','P','\0'}; wrptr = tx_data; /* Baud rate is set for 100 kHz */ config2 = 0x11; /* Configure I2C for 7 bit address mode */ config1 = (I2C_ON & I2C_IDLE_CON & I2C_CLK_HLD & I2C_IPMI_DIS & I2C_7BIT_ADD & I2C_SLW_DIS & I2C_SM_DIS & I2C_GCALL_DIS & I2C_STR_DIS & I2C_NACK & I2C_ACK_DIS & I2C_RCV_DIS & I2C_STOP_DIS & I2C_RESTART_DIS & I2C_START_DIS); OpenI2C(config1,config2); IdleI2C(); StartI2C(); /* Wait till Start sequence is completed */ while(I2CCONbits.SEN); /* Clear interrupt flag */ IFS0bits.MI2CIF = 0; /* Write Slave address and set master for transmission */ MasterWriteI2C(0xE); /* Wait till address is transmitted */ while(I2CSTATbits.TBF); // 8 clock cycles while(!IFS0bits.MI2CIF); // Wait for 9th clock cycle IFS0bits.MI2CIF = 0; // Clear interrupt flag while(I2CSTATbits.ACKSTAT); /* Transmit string of data */ MasterputsI2C(wrptr); StopI2C(); /* Wait till stop sequence is completed */ while(I2CCONbits.PEN); CloseI2C(); }
Ultima Modifica 9 Anni 11 Mesi fa da alfa75.

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Taglia
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
9 Anni 11 Mesi fa - 9 Anni 11 Mesi fa #5 da Taglia
Risposta da Taglia al topic I2C - dsPIC
Ciao,
lo avevo notato infatti, ho inserito IdleI2C(); dopo lo start...in teoria fa la stessa funzione di quello che mi avevi suggerito.
Ora leggo il numero 255, che non è quello che ho scritto!!!
Sembra che il micro legga in una cella diversa da quella che gli dico di leggere o che salvi in una diversa!!
Ultima Modifica 9 Anni 11 Mesi fa da Taglia.

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.