Gast
#1051348
Hallo ihr Profis ... ich beschäftige mich nun ein paar Tage mit dem MSP430F4794 und einem I2C EEPROM (M24C32). Ich glaube das schreiben (Byteweise) funktioniert. Wenn ich aber die Bytes wieder lesen will, habe ich eine Verschiebung drin so... Meine Frage ist eigentlich : hat schon jemand I2C Routinen für I2C EEproms die er mir schicken könnte ? oder Code Schnipsel o.ä. hier sind mal meine Anfänge : unsigned char EEPROM_ByteWrite(unsigned int address,unsigned char data) { while (UCB0STAT&UCBBUSY); // wait until I2C module has finished all operations I2CBuffer[0] = ((unsigned char)*((unsigned char*)&address + 1)); // calculate high byte I2CBuffer[1] = ((unsigned char)*((unsigned char*)&address + 0)); // calculate low byte I2CBuffer[2] = data; I2C_WRITECNT = 3; // set I2CBuffer Pointer IFG2 &= ~(UCB0TXIFG | UCB0RXIFG); // clear Access ready interrupt flag IE2 &= ~ (UCB0RXIE | UCB0TXIE); // RX / TX Interrupt sperren P3DIR |= BIT0;P3OUT&=~BIT0; UCB0CTL1 |= UCTR ; // Repeated start condition generation + R/W UCB0CTL1 |= UCTXSTT; // Repeated start condition generation + R/W while (!(IFG2 & UCB0TXIFG)); // wait until I2C module has finished all operations IFG2 &= ~UCB0TXIFG; unsigned char i; for (i=0;i<I2C_WRITECNT;i++) { UCB0TXBUF = I2CBuffer[i]; while (!(IFG2 & UCB0TXIFG)); // warten bis Byte gesendet wurde IFG2 &= ~UCB0TXIFG; } UCB0CTL1 |= UCTXSTP; // Stop condition while (UCB0CTL1 & UCTXSTP); // Loop until I2C STT is sent P3OUT |=BIT0; DelayMsI2C(12); // (10ms warten laut Datenblatt !) return 1; } unsigned char EEPROM_RandomRead(unsigned int Address) { unsigned char rec=0; while (UCB0STAT&UCBBUSY); // wait until I2C module has finished all operations I2CBuffer[0] = ((unsigned char)*((unsigned char*)&Address + 1)); // calculate high byte I2CBuffer[1] = ((unsigned char)*((unsigned char*)&Address + 0)); // calculate low byte I2C_WRITECNT = 2; // set I2CBuffer Pointer IFG2 &= ~(UCB0TXIFG | UCB0RXIFG); // clear Access ready interrupt flag IE2 &= ~ (UCB0RXIE | UCB0TXIE); // RX / TX Interrupt sperren UCB0CTL1 |= UCTR | UCTXSTT; // Start while (!(IFG2 & UCB0TXIFG)); // warten bis Start Byte gesendet wurde UCB0TXBUF = ((unsigned char)*((unsigned char*)&Address + 1)); while (!(IFG2 & UCB0TXIFG)); // warten bis Byte gesendet wurde IFG2 &= ~UCB0TXIFG; UCB0TXBUF = ((unsigned char)*((unsigned char*)&Address + 0)); while (!(IFG2 & UCB0TXIFG)); // warten bis Byte gesendet wurde IFG2 &= ~UCB0TXIFG; rec = UCB0RXBUF; UCB0CTL1 &= ~UCTR; // R/W löschen UCB0CTL1 |= UCTXSTT; // start condition generation while (UCB0CTL1 & UCTXSTT); // warten bis Byte gesendet wurde IFG2 &= ~UCB0RXIFG; rec = UCB0RXBUF; UCB0CTL1 |= UCTXSTP; // Stop condition while (UCB0CTL1 & UCTXSTP); // Loop until I2C STT is sent DelayMsI2C(1); // warten laut Datenblatt !!! return rec; } wenn ich zuerst 16 Bytes schreibe von 0 bis 15 und dort den Wert 0 bis 15 rein schreibe bekomme ich dann beim lesen auf Addr 0 und 1 eine 0 und ab Addr2 dann 1..15 . Ich hoffe ihr könnst verstehen was ich meine ... Wäre super wenn jemand schon tiefer in diesem Tham drin wäre und helfen könnte. Ich danke euch auf jedenfall schon mal im Voraus. Gruß Royw