Hi TI experts!
I was trying to establish a communication trough I2C protocol between my MSP430F5659 uP (MASTER) and 24LC16 EEPROM by Microchip.
My master has to write some data in the EEPROM and then all I want to do is to read these data previously written.
From what I can see on my scope it seems that the master and the slave are well linked and recognize each other (the slave ACKs when I send its address) but I notice some strange things:
- as mentioned in 24LC16 EEPROM datasheet I have to send first the CONTROL BYTE (4 bits for device code, 3 bits for the blocks address and the R/W bit). If I write the control byte following this pattern I have to send 1010 000 0 --> device code, block 0, write operation but, if I do that the slave doesn't sent the ACK. So I tried to invert the address and if I send 0101 0000 the slave recognizes its address and sends the ACK. Why is this happen?
- I read both MSP430F5659 and 24LC16 datasheets about reading operation but, even if I'm pretty sure to follow what these datasheets suggest to do, I'm not able to read my EEPROM at the desired address. I'm a bit confused about where I have to put the specific memory address from which I want to read data.
So, to give you a better understanding of what I 'm talking about, I attach my I2C dedicated code.
Any advice and help would be really appreciated.
Kind Regards,
Luigi
//---------------- ROUTINE DI I2CBUS -------------- //BUFFER_I2C_TX DS 32 // BUFFER DI TRASMISSIONE SU I2CBUS //BUFFER_I2C_RX DS 32 // BUFFER DI RICEZIONE SU I2CBUS #define I2SPEED_380KHZ 32 // INDIRIZZO DEL DISPOSITIVO + MODALIT� SCRITTURA #define I2SPEED_100KHZ 153 // INDIRIZZO DEL DISPOSITIVO + MODALIT� SCRITTURA #define I2SPEED_78KHZ 200 // INDIRIZZO DEL DISPOSITIVO + MODALIT� SCRITTURA // comunicazione i2c #define DRV10983_ADDRESS 01010010B // INDIRIZZO DEL DISPOSITIVO + MODALIT� SCRITTURA #define SCRIVI_SPEED_CONTROL_1 0 // INDIRIZZO DELLO CONTROLLO DI VELOCIT� 1 #define SCRIVI_SPEED_CONTROL_2 1 // INDIRIZZO DELLO CONTROLLO DI VELOCIT� 1 #define SCRIVI_SPEED_OVERIDE 10000001B #define ADDRESS_EEPROM_CONTROL 03H // INDIRIZZO EEPROM CONTROL #define ENABLE_SIDATA 01000000B // 40 SIDATA PE ENABLE SCRITTURA REGISTRI #define MotorSpeed1 011H #define MotorSpeed2 012H #define MotorPeriod1 013H #define MotorPeriod2 014H //#define SCRIVI_DRV10983 10100100B // INDIRIZZO DEL DISPOSITIVO + MODALIT� SCRITTURA //#define LEGGI_DRV10983 10100101B // INDIRIZZO DEL DISPOSITIVO + MODALIT� SCRITTURA #define SCRIVI_DRV10983 01010010B // SBAGLIATO #define LEGGI_DRV10983 01010011B // SLAGLIATO #define LEGGI_SPEED_2 012H // LEGGE LA VELOCIT� REGISTRO 2 #define LEGGI_SUPPLY_VOLTAGE 019H // #define R_W_BIT 00000001B // IL BIT 0 HA LA FUNZIONE DI READ / WRITE BIT READ = 1 ; WRITE=0 //#define READ_EEPROM 10100001B // indirizzo eeprom e codice di lettura //#define WRITE_EEPROM 10100000B // indirizzo eeprom e codice di SCRITTURA #define ADDRESS_DEFAULT 00000010B // indirizzo eeprom e codice di SCRITTURA #define WRITE_EEPROM 01010000B // SBAGLIATI #define READ_EEPROM 01010001B // indirizzo eeprom e codice di lettura VAI_I2C JSR ANALOGICHE MOV.W #13,BYTE_NUMBER // number of write byte MOV.W #WRITE_EEPROM,SLAVE_ADDRESS // slave address MOV.W #I2SPEED_100KHZ,I2C_SPEED // PRESCALER JSR INIZIALIZZA_I2C // inizialization of i2cbus MOV.W #0,INDIRIZZO_DATI // index of pointer reading into the slave MOV.B #20,BUFFER_I2C_TX MOV.B #21,BUFFER_I2C_TX+1 // some test writing byte MOV.B #22,BUFFER_I2C_TX+2 MOV.B #23,BUFFER_I2C_TX+3 MOV.B #24,BUFFER_I2C_TX+4 MOV.B #25,BUFFER_I2C_TX+5 MOV.B #26,BUFFER_I2C_TX+6 MOV.B #27,BUFFER_I2C_TX+7 MOV.B #28,BUFFER_I2C_TX+8 MOV.B #29,BUFFER_I2C_TX+9 MOV.B #30,BUFFER_I2C_TX+10 JSR SCRIVI_I2CBUS // go to writing op on i2c bus JSR DELAY_200mS MOV.W #13,BYTE_NUMBER // number of reading byte MOV.W #READ_EEPROM,SLAVE_ADDRESS // slave address MOV.W #I2SPEED_100KHZ,I2C_SPEED // PRESCALER JSR INIZIALIZZA_I2C // VA AD INIZZAILIZZARE LA I2CBUS MOV.W #0,INDIRIZZO_DATI // index of pointer reading into the slave JSR LEGGI_I2CBUS JSR DELAY_200mS SALTA VAI_I2C // macro Br INIZIALIZZA_I2C: BSET_W UCSWRST,UCB0CTLW0 // BLOCCA LA I2C E PERMETTE I SETTAGGI BSET_W (UCMODE_3+UCMST+UCSYNC),UCB0CTLW0 // sincronizzato al timer b usync gi� settato MOV.W I2C_SPEED,UCB0BRW BSET_W UCASTP_2,UCB0CTLW1 // GENERAZIONE AUTOMATICA DEL BIT DI STOP MOV.W BYTE_NUMBER,UCB0TBCNT // NUMERO DI BYTE DA RICEVERE MOV.W SLAVE_ADDRESS,UCB0I2CSA // INDIRIZZO DEL DISPOSITIVO SLAVE BCLR_W UCSWRST,UCB0CTLW0 // SBLOCCA LA TRASMISSIONE RTS // ***************** write on the slave SCRIVI_I2CBUS: BSET_W UCTR,UCB0CTLW0 // TRANSMIT MODE NOP BSET_W UCTXSTT,UCB0CTLW0 // START BIT WAIT_TRASM0: NOP BRSET_W UCTXSTT,UCB0CTLW0,WAIT_TRASM0 WAIT_TRASM: NOP BRCLR_W UCTXIFG0,UCB0IFG,WAIT_TRASM MOV.W INDIRIZZO_DATI,UCB0TXBUF // index of pointer reading into the slave PUSH.W R4 PUSH.W R5 PUSH.W R6 MOV.W #BUFFER_I2C_TX,R5 ADD.W BYTE_NUMBER,R5 MOV.W #BUFFER_I2C_TX,R4 WAIT_TRASM1: NOP BRSET_W UCNACKIFG,UCB0IFG,END_COUNTER // SE NON RICEVE L'ACK INVIA STOP_CONDITION BRSET_W UCBCNTIFG,UCB0IFG,END_COUNTER // SE ARRIVA ALLA FINE DELLA TRASMISSIONE BRCLR_W UCTXIFG0,UCB0IFG,WAIT_TRASM1 NOP MOV.B 0(R4),R6 MOV.W R6,UCB0TXBUF // NEXT SENDING INC.W R4 CMP.W R5,R4 JLO WAIT_TRASM1 JEQ WAIT_TRASM1 SALTA END_COUNTER //*********** QUI VA A LEGGERE IL DISPOSITIVO ********************* LEGGI_I2CBUS: BSET_W UCTR,UCB0CTLW0 // TRANSMIT MODE NOP BSET_W UCTXSTT,UCB0CTLW0 // START BIT WAIT_RECEIVE: NOP WAIT_TRASM_01: NOP BRSET_W UCTXSTT,UCB0CTLW0,WAIT_RECEIVE // WAIT FOR START BIT END BRCLR_W UCTXIFG0,UCB0IFG,WAIT_TRASM_01 // WAIT FOR BUFFER FREE MOV.W INDIRIZZO_DATI,UCB0TXBUF // index of pointer reading into the slave PUSH.W R4 PUSH.W R5 PUSH.W R6 MOV.W #BUFFER_I2C_RX,R5 ADD.W BYTE_NUMBER,R5 MOV.W #BUFFER_I2C_RX,R4 WAIT_TRASM_0: NOP BRCLR_W UCTXIFG0,UCB0IFG,WAIT_TRASM_0 BCLR_W UCTR,UCB0CTLW0 // RECIEVE MODE SETTING NOP NOP BSET_W UCTXSTT,UCB0CTLW0 // START BIT FOR RECEIVING WAIT_RECEIVE_ST: NOP BRSET_W UCTXSTT,UCB0CTLW0,WAIT_RECEIVE_ST // FINCH� LO START BIT NON � A ZERO WAIT_RECEIVE_1: NOP BRSET_W UCBCNTIFG,UCB0IFG,END_COUNTER BRCLR_W UCRXIFG0,UCB0IFG,WAIT_RECEIVE_1 NOP MOV.W UCB0RXBUF,R6 // NECT RECEIVING BYTE MOV.B R6,0(R4) INC.W R4 CMP.W R5,R4 JLO WAIT_RECEIVE_1 JEQ WAIT_RECEIVE_1 END_COUNTER: POP.W R6 POP.W R5 POP.W R4 BSET_W UCTXSTP,UCB0CTLW0 // FORCE A STOP BIT RTS