Reply by Alonso March 7, 20072007-03-07
I'm sorry, where is this mentioned?
After looking at the code further i notice that the program is stuck
at "while ((~I2CIFG)&ARDYIFG);" in the I2Croutines.c. What's funy
is that I put the oscilloscope probe on SCL and SDA and I see no
clock or data.

--- In m..., raza haider
wrote:
> Have u tried with the the following suggestion from Kazmi?
>
> "In TI document I2Croutines.c in the Funktion InitI2C u need to
set UCTLo.
>
> UCTL0 &= ~CHAR; "
>
> Alonso wrote:
> >
> > Hello,
> > I bought the Olimex EasyWeb2 Development board to learn the
msp430
> > and I'm just trying to get every peripheral on the board to work
one
> > at a time. I finally got to the eeprom, but am having many
> > problems. I have looked at the Olimex documentation and code
> > examples for this board but it has not been very helpful for
> > operating the eeprom using I2C. I found TI to have
documentation
> > (slaa208) on interfacing to eeprom using I2C and tried the code
with
> > a few modifications but still no luck. Below is the code from
TI
> > that I have modified to fit the Olimex EasyWeb2 Dev board.
> >
> > Thanks in advanced for any help,
> >
> > Regards,
> > Rocco
> >
> >
> > MAIN:
>
> //*****************************************************************
**
> > ***********/
> >
> > #include "msp430x16x.h"
> >
> > /*--- external functions of file "I2Croutines.c" ----------------
----
> > --------*/
> > extern void InitI2C(void);
> > extern void EEPROM_ByteWrite(unsigned int Address,unsigned char
> > Data);
> > extern unsigned char EEPROM_RandomRead(unsigned int Address);
> > extern unsigned char EEPROM_CurrentAddressRead(void);
> > extern void EEPROM_AckPolling(void);
> > void wait(void);
> >
> > /*---------------------------
----
> > --------*/
> > void main(void)
> > {
> > volatile unsigned char Data[6];
> >
> > WDTCTL = WDTPW+WDTHOLD; // disable Watchdog
> >
> > P1DIR = 0xFF; // termination of unused pins
> > P4DIR = 0x03;
> >
> >
> > InitI2C(); // Initialize I2C module
> > _EINT();
> >
> > EEPROM_ByteWrite(0x0000,0x12);
> > EEPROM_AckPolling(); // Wait for EEPROM write cycle
> > completion
> > EEPROM_ByteWrite(0x0001,0x34);
> > EEPROM_AckPolling(); // Wait for EEPROM write cycle
> > completion
> > EEPROM_ByteWrite(0x0002,0x56);
> > EEPROM_AckPolling(); // Wait for EEPROM write cycle
> > completion
> > EEPROM_ByteWrite(0x0003,0x78);
> > EEPROM_AckPolling(); // Wait for EEPROM write cycle
> > completion
> > EEPROM_ByteWrite(0x0004,0x9A);
> > EEPROM_AckPolling(); // Wait for EEPROM write cycle
> > completion
> > EEPROM_ByteWrite(0x0005,0xBC);
> > EEPROM_AckPolling(); // Wait for EEPROM write cycle
> > completion
> >
> > Data[0] = EEPROM_RandomRead(0x0000); // Read from address
0x0000
> > Data[1] = EEPROM_CurrentAddressRead(); // Read from address
0x0001
> > Data[2] = EEPROM_CurrentAddressRead(); // Read from address
0x0002
> > Data[3] = EEPROM_CurrentAddressRead(); // Read from address
0x0003
> > Data[4] = EEPROM_CurrentAddressRead(); // Read from address
0x0004
> > Data[5] = EEPROM_CurrentAddressRead(); // Read from address
0x0005
> >
> > while (1);
> > }
> >
> >
> > I2Croutines:
>
> //*****************************************************************
**
> > *********/
> > #include "msp430x16x.h"
> >
> > #define SlaveAddress 0x50;
> >
> > int PtrTransmit;
> > unsigned char I2CBuffer[3];
> >
> > /*---------------------------
----
> > --------*/
> > void InitI2C(void)
> > // Description:
> > // Initialization of the I2C Module
> > {
> > P4SEL = 0x03; // select module function for the used
I2C
> > pins
> > P4DIR &= ~0x03;
> >
> > // Recommended initialisation steps of I2C module as shown in
User
> > Guide:
> > U0CTL |= I2C+SYNC; // (1) Select I2C mode with SWRST=1
> > U0CTL &= ~I2CEN; // (2) disable the I2C module
> > // (3) Configure the I2C module with
> > I2CEN=0 :
> > // U0CTL default settings:
> > // 7-bit addressing, no DMA,
no
> > feedback
> > I2CTCTL = I2CTRX+I2CSSEL_2; // byte mode, repeat mode, clock
> > source = SMCLK,
> > // transmit mode
> > I2CSA = SlaveAddress; // define Slave Address
> > // In this case the Slave
Address
> > defines the
> > // control byte that is sent to
the
> > EEPROM.
> > I2COA = 0x01A5; // own address.
> > I2CPSC = 0x00; // I2C clock = clock source/1
> > I2CSCLH = 0x03; // SCL high period = 5*I2C clock
> > I2CSCLL = 0x03; // SCL low period = 5*I2C clock
> > U0CTL |= I2CEN; // (4) set I2CEN via software
> > }
> >
> > /*---------------------------
----
> > --------*/
> > void I2CWriteInit(void)
> > // Description:
> > // Initialization of the I2C Module for Write operation.
> > {
> > U0CTL |= MST; // define Master Mode
> > I2CTCTL |= I2CTRX; // I2CTRX=1 => Transmit Mode (R/W bit
= 0)
> > I2CIFG &= ~TXRDYIFG;
> > I2CIE = TXRDYIE; // enable Transmit ready interrupt
> > }
> >
> > /*---------------------------
----
> > --------*/
> > void I2CReadInit(void)
> > // Description:
> > // Initialization of the I2C Module for Read operation.
> > {
> > I2CTCTL &= ~I2CTRX; // I2CTRX=0 => Receive Mode (R/W bit 1)
> > I2CIE = RXRDYIE; // enable Receive ready interrupt
> > }
> >
> > /*---------------------------
----
> > --------*/
> > void EEPROM_ByteWrite(unsigned int Address, unsigned char Data)
> > // Description:
> > // Byte Write Operation. The communication via the I2C bus
with an
> > EEPROM
> > // (2465) is realized. A data byte is written into a user
defined
> > address.
> > {
> > unsigned char adr_hi;
> > unsigned char adr_lo;
> >
> > while (I2CDCTL&I2CBUSY); // wait until I2C module has finished
all
> > operations
> >
> > adr_hi = Address >> 8; // calculate high byte
> > adr_lo = Address & 0xFF; // and low byte of address
> >
> > I2CBuffer[2] = adr_hi; // store single bytes that have
to
> > be sent
> > I2CBuffer[1] = adr_lo; // in the I2CBuffer.
> > I2CBuffer[0] = Data;
> > PtrTransmit = 2; // set I2CBuffer Pointer
> >
> > I2CWriteInit();
> > I2CNDAT = 3; // 1 control byte + 3 bytes should be
> > transmitted
> > I2CTCTL |= I2CSTT+I2CSTP; // start and stop condition
generation
> > // => I2C communication is
started
> > }
> >
> > /*---------------------------
----
> > --------*/
> > unsigned char EEPROM_CurrentAddressRead(void)
> > // Description:
> > // Current Address Read Operation. Data is read from the
EEPROM.
> > The current
> > // address from the EEPROM is used.
> > {
> > while (I2CDCTL&I2CBUSY); // wait until I2C module has finished
all
> > operations
> > I2CReadInit();
> > U0CTL |= MST; // define Master Mode
> > I2CNDAT = 1; // 1 byte should be received
> > I2CIFG &= ~ARDYIFG; // clear Access ready interrupt
flag
> > I2CTCTL |= I2CSTT+I2CSTP; // start receiving and finally
generate
> > // re-start and stop
> > condition
> > while ((~I2CIFG)&ARDYIFG); // wait untill transmission is
finished
> > return I2CBuffer[0];
> > }
> >
> > /*---------------------------
----
> > --------*/
> > unsigned char EEPROM_RandomRead(unsigned int Address)
> > // Description:
> > // Random Read Operation. Data is read from the EEPROM. The
EEPROM
> > // address is defined with the parameter Address.
> > {
> > unsigned char adr_hi;
> > unsigned char adr_lo;
> >
> > while (I2CDCTL&I2CBUSY); // wait until I2C module has
finished
> > all operations
> >
> > adr_hi = Address >> 8; // calculate high byte
> > adr_lo = Address & 0xFF; // and low byte of address
> >
> > I2CBuffer[1] = adr_hi; // store single bytes that have
to
> > be sent
> > I2CBuffer[0] = adr_lo; // in the I2CBuffer.
> > PtrTransmit = 1; // set I2CBuffer Pointer
> >
> > I2CWriteInit();
> > I2CNDAT = 2; // 1 control byte + 2 bytes should be
> > transmitted
> > I2CIFG &= ~ARDYIFG; // clear Access ready interrupt flag
> > I2CTCTL |= I2CSTT; // start condition generation
> > // => I2C communication is started
> > while ((~I2CIFG)&ARDYIFG); // wait untill transmission is
finished
> > I2CReadInit();
> > I2CNDAT = 1; // 1 byte should be received
> >
> > I2CIFG &= ~ARDYIFG; // clear Access ready interrupt
flag
> > I2CTCTL |= I2CSTT+I2CSTP; // start receiving and finally
generate
> > // re-start and
stop
> > condition
> > while ((~I2CIFG)&ARDYIFG); // wait untill transmission is
finished
> > return I2CBuffer[0];
> > }
> >
> > /*---------------------------
----
> > --------*/
> > void EEPROM_AckPolling(void)
> > // Description:
> > // Acknowledge Polling. The EEPROM will not acknowledge if a
write
> > cycle is
> > // in progress. It can be used to determine when a write cycle
is
> > completed.
> > { unsigned int count;
> > while (I2CDCTL&I2CBUSY); // wait until I2C module has finished
all
> > operations
> > P1OUT ^= 0xFF;
> > count=0;
> > U0CTL &= ~I2CEN; // clear I2CEN bit => necessary to re-
> > configure I2C module
> > I2CTCTL |= I2CRM; // transmission is software controlled
> > U0CTL |= I2CEN; // enable I2C module
> > I2CIFG = NACKIFG; // set NACKIFG
> > while (NACKIFG & I2CIFG)
> > {
> > I2CIFG=0x00; // clear I2C interrupt flags
> > U0CTL |= MST; // define Master Mode
> > I2CTCTL |= I2CTRX; // I2CTRX=1 => Transmit Mode (R/W
bit > > 0)
> > I2CTCTL |= I2CSTT; // start condition is generated
> > while (I2CTCTL&I2CSTT); // wait till I2CSTT bit was cleared
> > I2CTCTL |= I2CSTP; // stop condition is generated after
> > slave address was sent
> > // => I2C communication is
started
> > while (I2CDCTL&I2CBUSY); // wait till stop bit is reset
> > count=count+1;
> > P1OUT ^= 0xFF;
> > }
> > U0CTL &= ~I2CEN; // clear I2CEN bit => necessary to re-
> > configure I2C module
> > I2CTCTL &= ~I2CRM; // transmission is by the I2C module
> > U0CTL |= I2CEN; // enable I2C module
> >
> > return;
> > }
> >
> > /*---------------------------
----
> > --------*/
> > /* Interrupt Service
> > Routines */
> > /* Note that the Compiler version is checked in the
following
> > code and */
> > /* depending of the Compiler Version the correct Interrupt
> > Service */
> > /* Routine definition is
> > used. */
> > #if __VER__ < 200
> > interrupt [USART0TX_VECTOR] void ISR_I2C(void)
> > #else
> > #pragma vector=USART0TX_VECTOR
> > __interrupt void ISR_I2C(void)
> > #endif
> >
> > // Description:
> > // Byte Write Operation. The communication via the I2C bus
with an
> > EEPROM
> > {
> > switch (I2CIV)
> > { case I2CIV_AL: /* I2C interrupt vector: Arbitration
lost
> > (ALIFG) */
> > break;
> > case I2CIV_NACK: /* I2C interrupt vector: No acknowledge
> > (NACKIFG) */
> > break;
> > case I2CIV_OA: /* I2C interrupt vector: Own address
(OAIFG)
> > */
> > break;
> > case I2CIV_ARDY: /* I2C interrupt vector: Access ready
> > (ARDYIFG) */
> > break;
> > case I2CIV_RXRDY: /* I2C interrupt vector: Receive ready
> > (RXRDYIFG) */
> > I2CBuffer[0]=I2CDRB; // store received
data
> > in buffer
> > break;
> > case I2CIV_TXRDY: /* I2C interrupt vector: Transmit ready
> > (TXRDYIFG) */
> > I2CDRB = I2CBuffer[PtrTransmit];
> > PtrTransmit = PtrTransmit-1;
> > if (PtrTransmit<0)
> > {
> > I2CIE &= ~TXRDYIE; // disable
> > interrupts
> > }
> > break;
> > case I2CIV_GC: /* I2C interrupt vector: General call
> > (GCIFG) */
> > break;
> > case I2CIV_STT: /* I2C interrupt vector: Start condition
> > (STTIFG) */
> > break;
> > }
> > }
> >
> >
> >
> >
> >
> > --
>
>

Beginning Microcontrollers with the MSP430

Reply by raza haider February 19, 20072007-02-19
Have u tried with the the following suggestion from Kazmi?

"In TI document I2Croutines.c in the Funktion InitI2C u need to set UCTLo.

UCTL0 &= ~CHAR; "

Alonso wrote:
>
> Hello,
> I bought the Olimex EasyWeb2 Development board to learn the msp430
> and I'm just trying to get every peripheral on the board to work one
> at a time. I finally got to the eeprom, but am having many
> problems. I have looked at the Olimex documentation and code
> examples for this board but it has not been very helpful for
> operating the eeprom using I2C. I found TI to have documentation
> (slaa208) on interfacing to eeprom using I2C and tried the code with
> a few modifications but still no luck. Below is the code from TI
> that I have modified to fit the Olimex EasyWeb2 Dev board.
>
> Thanks in advanced for any help,
>
> Regards,
> Rocco
> MAIN:
> //*******************************************************************
> ***********/
>
> #include "msp430x16x.h"
>
> /*--- external functions of file "I2Croutines.c" --------------------
> --------*/
> extern void InitI2C(void);
> extern void EEPROM_ByteWrite(unsigned int Address,unsigned char
> Data);
> extern unsigned char EEPROM_RandomRead(unsigned int Address);
> extern unsigned char EEPROM_CurrentAddressRead(void);
> extern void EEPROM_AckPolling(void);
> void wait(void);
>
> /*-------------------------------
> --------*/
> void main(void)
> {
> volatile unsigned char Data[6];
>
> WDTCTL = WDTPW+WDTHOLD; // disable Watchdog
>
> P1DIR = 0xFF; // termination of unused pins
> P4DIR = 0x03;
> InitI2C(); // Initialize I2C module
> _EINT();
>
> EEPROM_ByteWrite(0x0000,0x12);
> EEPROM_AckPolling(); // Wait for EEPROM write cycle
> completion
> EEPROM_ByteWrite(0x0001,0x34);
> EEPROM_AckPolling(); // Wait for EEPROM write cycle
> completion
> EEPROM_ByteWrite(0x0002,0x56);
> EEPROM_AckPolling(); // Wait for EEPROM write cycle
> completion
> EEPROM_ByteWrite(0x0003,0x78);
> EEPROM_AckPolling(); // Wait for EEPROM write cycle
> completion
> EEPROM_ByteWrite(0x0004,0x9A);
> EEPROM_AckPolling(); // Wait for EEPROM write cycle
> completion
> EEPROM_ByteWrite(0x0005,0xBC);
> EEPROM_AckPolling(); // Wait for EEPROM write cycle
> completion
>
> Data[0] = EEPROM_RandomRead(0x0000); // Read from address 0x0000
> Data[1] = EEPROM_CurrentAddressRead(); // Read from address 0x0001
> Data[2] = EEPROM_CurrentAddressRead(); // Read from address 0x0002
> Data[3] = EEPROM_CurrentAddressRead(); // Read from address 0x0003
> Data[4] = EEPROM_CurrentAddressRead(); // Read from address 0x0004
> Data[5] = EEPROM_CurrentAddressRead(); // Read from address 0x0005
>
> while (1);
> }
> I2Croutines:
> //*******************************************************************
> *********/
> #include "msp430x16x.h"
>
> #define SlaveAddress 0x50;
>
> int PtrTransmit;
> unsigned char I2CBuffer[3];
>
> /*-------------------------------
> --------*/
> void InitI2C(void)
> // Description:
> // Initialization of the I2C Module
> {
> P4SEL = 0x03; // select module function for the used I2C
> pins
> P4DIR &= ~0x03;
>
> // Recommended initialisation steps of I2C module as shown in User
> Guide:
> U0CTL |= I2C+SYNC; // (1) Select I2C mode with SWRST=1
> U0CTL &= ~I2CEN; // (2) disable the I2C module
> // (3) Configure the I2C module with
> I2CEN=0 :
> // U0CTL default settings:
> // 7-bit addressing, no DMA, no
> feedback
> I2CTCTL = I2CTRX+I2CSSEL_2; // byte mode, repeat mode, clock
> source = SMCLK,
> // transmit mode
> I2CSA = SlaveAddress; // define Slave Address
> // In this case the Slave Address
> defines the
> // control byte that is sent to the
> EEPROM.
> I2COA = 0x01A5; // own address.
> I2CPSC = 0x00; // I2C clock = clock source/1
> I2CSCLH = 0x03; // SCL high period = 5*I2C clock
> I2CSCLL = 0x03; // SCL low period = 5*I2C clock
> U0CTL |= I2CEN; // (4) set I2CEN via software
> }
>
> /*-------------------------------
> --------*/
> void I2CWriteInit(void)
> // Description:
> // Initialization of the I2C Module for Write operation.
> {
> U0CTL |= MST; // define Master Mode
> I2CTCTL |= I2CTRX; // I2CTRX=1 => Transmit Mode (R/W bit = 0)
> I2CIFG &= ~TXRDYIFG;
> I2CIE = TXRDYIE; // enable Transmit ready interrupt
> }
>
> /*-------------------------------
> --------*/
> void I2CReadInit(void)
> // Description:
> // Initialization of the I2C Module for Read operation.
> {
> I2CTCTL &= ~I2CTRX; // I2CTRX=0 => Receive Mode (R/W bit = 1)
> I2CIE = RXRDYIE; // enable Receive ready interrupt
> }
>
> /*-------------------------------
> --------*/
> void EEPROM_ByteWrite(unsigned int Address, unsigned char Data)
> // Description:
> // Byte Write Operation. The communication via the I2C bus with an
> EEPROM
> // (2465) is realized. A data byte is written into a user defined
> address.
> {
> unsigned char adr_hi;
> unsigned char adr_lo;
>
> while (I2CDCTL&I2CBUSY); // wait until I2C module has finished all
> operations
>
> adr_hi = Address >> 8; // calculate high byte
> adr_lo = Address & 0xFF; // and low byte of address
>
> I2CBuffer[2] = adr_hi; // store single bytes that have to
> be sent
> I2CBuffer[1] = adr_lo; // in the I2CBuffer.
> I2CBuffer[0] = Data;
> PtrTransmit = 2; // set I2CBuffer Pointer
>
> I2CWriteInit();
> I2CNDAT = 3; // 1 control byte + 3 bytes should be
> transmitted
> I2CTCTL |= I2CSTT+I2CSTP; // start and stop condition generation
> // => I2C communication is started
> }
>
> /*-------------------------------
> --------*/
> unsigned char EEPROM_CurrentAddressRead(void)
> // Description:
> // Current Address Read Operation. Data is read from the EEPROM.
> The current
> // address from the EEPROM is used.
> {
> while (I2CDCTL&I2CBUSY); // wait until I2C module has finished all
> operations
> I2CReadInit();
> U0CTL |= MST; // define Master Mode
> I2CNDAT = 1; // 1 byte should be received
> I2CIFG &= ~ARDYIFG; // clear Access ready interrupt flag
> I2CTCTL |= I2CSTT+I2CSTP; // start receiving and finally generate
> // re-start and stop
> condition
> while ((~I2CIFG)&ARDYIFG); // wait untill transmission is finished
> return I2CBuffer[0];
> }
>
> /*-------------------------------
> --------*/
> unsigned char EEPROM_RandomRead(unsigned int Address)
> // Description:
> // Random Read Operation. Data is read from the EEPROM. The EEPROM
> // address is defined with the parameter Address.
> {
> unsigned char adr_hi;
> unsigned char adr_lo;
>
> while (I2CDCTL&I2CBUSY); // wait until I2C module has finished
> all operations
>
> adr_hi = Address >> 8; // calculate high byte
> adr_lo = Address & 0xFF; // and low byte of address
>
> I2CBuffer[1] = adr_hi; // store single bytes that have to
> be sent
> I2CBuffer[0] = adr_lo; // in the I2CBuffer.
> PtrTransmit = 1; // set I2CBuffer Pointer
>
> I2CWriteInit();
> I2CNDAT = 2; // 1 control byte + 2 bytes should be
> transmitted
> I2CIFG &= ~ARDYIFG; // clear Access ready interrupt flag
> I2CTCTL |= I2CSTT; // start condition generation
> // => I2C communication is started
> while ((~I2CIFG)&ARDYIFG); // wait untill transmission is finished
> I2CReadInit();
> I2CNDAT = 1; // 1 byte should be received
>
> I2CIFG &= ~ARDYIFG; // clear Access ready interrupt flag
> I2CTCTL |= I2CSTT+I2CSTP; // start receiving and finally generate
> // re-start and stop
> condition
> while ((~I2CIFG)&ARDYIFG); // wait untill transmission is finished
> return I2CBuffer[0];
> }
>
> /*-------------------------------
> --------*/
> void EEPROM_AckPolling(void)
> // Description:
> // Acknowledge Polling. The EEPROM will not acknowledge if a write
> cycle is
> // in progress. It can be used to determine when a write cycle is
> completed.
> { unsigned int count;
> while (I2CDCTL&I2CBUSY); // wait until I2C module has finished all
> operations
> P1OUT ^= 0xFF;
> count=0;
> U0CTL &= ~I2CEN; // clear I2CEN bit => necessary to re-
> configure I2C module
> I2CTCTL |= I2CRM; // transmission is software controlled
> U0CTL |= I2CEN; // enable I2C module
> I2CIFG = NACKIFG; // set NACKIFG
> while (NACKIFG & I2CIFG)
> {
> I2CIFG=0x00; // clear I2C interrupt flags
> U0CTL |= MST; // define Master Mode
> I2CTCTL |= I2CTRX; // I2CTRX=1 => Transmit Mode (R/W bit > 0)
> I2CTCTL |= I2CSTT; // start condition is generated
> while (I2CTCTL&I2CSTT); // wait till I2CSTT bit was cleared
> I2CTCTL |= I2CSTP; // stop condition is generated after
> slave address was sent
> // => I2C communication is started
> while (I2CDCTL&I2CBUSY); // wait till stop bit is reset
> count=count+1;
> P1OUT ^= 0xFF;
> }
> U0CTL &= ~I2CEN; // clear I2CEN bit => necessary to re-
> configure I2C module
> I2CTCTL &= ~I2CRM; // transmission is by the I2C module
> U0CTL |= I2CEN; // enable I2C module
>
> return;
> }
>
> /*-------------------------------
> --------*/
> /* Interrupt Service
> Routines */
> /* Note that the Compiler version is checked in the following
> code and */
> /* depending of the Compiler Version the correct Interrupt
> Service */
> /* Routine definition is
> used. */
> #if __VER__ < 200
> interrupt [USART0TX_VECTOR] void ISR_I2C(void)
> #else
> #pragma vector=USART0TX_VECTOR
> __interrupt void ISR_I2C(void)
> #endif
>
> // Description:
> // Byte Write Operation. The communication via the I2C bus with an
> EEPROM
> {
> switch (I2CIV)
> { case I2CIV_AL: /* I2C interrupt vector: Arbitration lost
> (ALIFG) */
> break;
> case I2CIV_NACK: /* I2C interrupt vector: No acknowledge
> (NACKIFG) */
> break;
> case I2CIV_OA: /* I2C interrupt vector: Own address (OAIFG)
> */
> break;
> case I2CIV_ARDY: /* I2C interrupt vector: Access ready
> (ARDYIFG) */
> break;
> case I2CIV_RXRDY: /* I2C interrupt vector: Receive ready
> (RXRDYIFG) */
> I2CBuffer[0]=I2CDRB; // store received data
> in buffer
> break;
> case I2CIV_TXRDY: /* I2C interrupt vector: Transmit ready
> (TXRDYIFG) */
> I2CDRB = I2CBuffer[PtrTransmit];
> PtrTransmit = PtrTransmit-1;
> if (PtrTransmit<0)
> {
> I2CIE &= ~TXRDYIE; // disable
> interrupts
> }
> break;
> case I2CIV_GC: /* I2C interrupt vector: General call
> (GCIFG) */
> break;
> case I2CIV_STT: /* I2C interrupt vector: Start condition
> (STTIFG) */
> break;
> }
> }

--
Reply by Alonso February 15, 20072007-02-15
Hello,
I bought the Olimex EasyWeb2 Development board to learn the msp430
and I'm just trying to get every peripheral on the board to work one
at a time. I finally got to the eeprom, but am having many
problems. I have looked at the Olimex documentation and code
examples for this board but it has not been very helpful for
operating the eeprom using I2C. I found TI to have documentation
(slaa208) on interfacing to eeprom using I2C and tried the code with
a few modifications but still no luck. Below is the code from TI
that I have modified to fit the Olimex EasyWeb2 Dev board.

Thanks in advanced for any help,

Regards,
Rocco
MAIN:
//*******************************************************************
***********/

#include "msp430x16x.h"

/*--- external functions of file "I2Croutines.c" --------------------
--------*/
extern void InitI2C(void);
extern void EEPROM_ByteWrite(unsigned int Address,unsigned char
Data);
extern unsigned char EEPROM_RandomRead(unsigned int Address);
extern unsigned char EEPROM_CurrentAddressRead(void);
extern void EEPROM_AckPolling(void);
void wait(void);

/*-------------------------------
--------*/
void main(void)
{
volatile unsigned char Data[6];

WDTCTL = WDTPW+WDTHOLD; // disable Watchdog

P1DIR = 0xFF; // termination of unused pins
P4DIR = 0x03;
InitI2C(); // Initialize I2C module
_EINT();

EEPROM_ByteWrite(0x0000,0x12);
EEPROM_AckPolling(); // Wait for EEPROM write cycle
completion
EEPROM_ByteWrite(0x0001,0x34);
EEPROM_AckPolling(); // Wait for EEPROM write cycle
completion
EEPROM_ByteWrite(0x0002,0x56);
EEPROM_AckPolling(); // Wait for EEPROM write cycle
completion
EEPROM_ByteWrite(0x0003,0x78);
EEPROM_AckPolling(); // Wait for EEPROM write cycle
completion
EEPROM_ByteWrite(0x0004,0x9A);
EEPROM_AckPolling(); // Wait for EEPROM write cycle
completion
EEPROM_ByteWrite(0x0005,0xBC);
EEPROM_AckPolling(); // Wait for EEPROM write cycle
completion

Data[0] = EEPROM_RandomRead(0x0000); // Read from address 0x0000
Data[1] = EEPROM_CurrentAddressRead(); // Read from address 0x0001
Data[2] = EEPROM_CurrentAddressRead(); // Read from address 0x0002
Data[3] = EEPROM_CurrentAddressRead(); // Read from address 0x0003
Data[4] = EEPROM_CurrentAddressRead(); // Read from address 0x0004
Data[5] = EEPROM_CurrentAddressRead(); // Read from address 0x0005

while (1);
}
I2Croutines:
//*******************************************************************
*********/
#include "msp430x16x.h"

#define SlaveAddress 0x50;

int PtrTransmit;
unsigned char I2CBuffer[3];

/*-------------------------------
--------*/
void InitI2C(void)
// Description:
// Initialization of the I2C Module
{
P4SEL = 0x03; // select module function for the used I2C
pins
P4DIR &= ~0x03;

// Recommended initialisation steps of I2C module as shown in User
Guide:
U0CTL |= I2C+SYNC; // (1) Select I2C mode with SWRST=1
U0CTL &= ~I2CEN; // (2) disable the I2C module
// (3) Configure the I2C module with
I2CEN=0 :
// U0CTL default settings:
// 7-bit addressing, no DMA, no
feedback
I2CTCTL = I2CTRX+I2CSSEL_2; // byte mode, repeat mode, clock
source = SMCLK,
// transmit mode
I2CSA = SlaveAddress; // define Slave Address
// In this case the Slave Address
defines the
// control byte that is sent to the
EEPROM.
I2COA = 0x01A5; // own address.
I2CPSC = 0x00; // I2C clock = clock source/1
I2CSCLH = 0x03; // SCL high period = 5*I2C clock
I2CSCLL = 0x03; // SCL low period = 5*I2C clock
U0CTL |= I2CEN; // (4) set I2CEN via software
}

/*-------------------------------
--------*/
void I2CWriteInit(void)
// Description:
// Initialization of the I2C Module for Write operation.
{
U0CTL |= MST; // define Master Mode
I2CTCTL |= I2CTRX; // I2CTRX=1 => Transmit Mode (R/W bit = 0)
I2CIFG &= ~TXRDYIFG;
I2CIE = TXRDYIE; // enable Transmit ready interrupt
}

/*-------------------------------
--------*/
void I2CReadInit(void)
// Description:
// Initialization of the I2C Module for Read operation.
{
I2CTCTL &= ~I2CTRX; // I2CTRX=0 => Receive Mode (R/W bit = 1)
I2CIE = RXRDYIE; // enable Receive ready interrupt
}

/*-------------------------------
--------*/
void EEPROM_ByteWrite(unsigned int Address, unsigned char Data)
// Description:
// Byte Write Operation. The communication via the I2C bus with an
EEPROM
// (2465) is realized. A data byte is written into a user defined
address.
{
unsigned char adr_hi;
unsigned char adr_lo;

while (I2CDCTL&I2CBUSY); // wait until I2C module has finished all
operations

adr_hi = Address >> 8; // calculate high byte
adr_lo = Address & 0xFF; // and low byte of address

I2CBuffer[2] = adr_hi; // store single bytes that have to
be sent
I2CBuffer[1] = adr_lo; // in the I2CBuffer.
I2CBuffer[0] = Data;
PtrTransmit = 2; // set I2CBuffer Pointer

I2CWriteInit();
I2CNDAT = 3; // 1 control byte + 3 bytes should be
transmitted
I2CTCTL |= I2CSTT+I2CSTP; // start and stop condition generation
// => I2C communication is started
}

/*-------------------------------
--------*/
unsigned char EEPROM_CurrentAddressRead(void)
// Description:
// Current Address Read Operation. Data is read from the EEPROM.
The current
// address from the EEPROM is used.
{
while (I2CDCTL&I2CBUSY); // wait until I2C module has finished all
operations
I2CReadInit();
U0CTL |= MST; // define Master Mode
I2CNDAT = 1; // 1 byte should be received
I2CIFG &= ~ARDYIFG; // clear Access ready interrupt flag
I2CTCTL |= I2CSTT+I2CSTP; // start receiving and finally generate
// re-start and stop
condition
while ((~I2CIFG)&ARDYIFG); // wait untill transmission is finished
return I2CBuffer[0];
}

/*-------------------------------
--------*/
unsigned char EEPROM_RandomRead(unsigned int Address)
// Description:
// Random Read Operation. Data is read from the EEPROM. The EEPROM
// address is defined with the parameter Address.
{
unsigned char adr_hi;
unsigned char adr_lo;

while (I2CDCTL&I2CBUSY); // wait until I2C module has finished
all operations

adr_hi = Address >> 8; // calculate high byte
adr_lo = Address & 0xFF; // and low byte of address

I2CBuffer[1] = adr_hi; // store single bytes that have to
be sent
I2CBuffer[0] = adr_lo; // in the I2CBuffer.
PtrTransmit = 1; // set I2CBuffer Pointer

I2CWriteInit();
I2CNDAT = 2; // 1 control byte + 2 bytes should be
transmitted
I2CIFG &= ~ARDYIFG; // clear Access ready interrupt flag
I2CTCTL |= I2CSTT; // start condition generation
// => I2C communication is started
while ((~I2CIFG)&ARDYIFG); // wait untill transmission is finished
I2CReadInit();
I2CNDAT = 1; // 1 byte should be received

I2CIFG &= ~ARDYIFG; // clear Access ready interrupt flag
I2CTCTL |= I2CSTT+I2CSTP; // start receiving and finally generate
// re-start and stop
condition
while ((~I2CIFG)&ARDYIFG); // wait untill transmission is finished
return I2CBuffer[0];
}

/*-------------------------------
--------*/
void EEPROM_AckPolling(void)
// Description:
// Acknowledge Polling. The EEPROM will not acknowledge if a write
cycle is
// in progress. It can be used to determine when a write cycle is
completed.
{ unsigned int count;
while (I2CDCTL&I2CBUSY); // wait until I2C module has finished all
operations
P1OUT ^= 0xFF;
count=0;
U0CTL &= ~I2CEN; // clear I2CEN bit => necessary to re-
configure I2C module
I2CTCTL |= I2CRM; // transmission is software controlled
U0CTL |= I2CEN; // enable I2C module
I2CIFG = NACKIFG; // set NACKIFG
while (NACKIFG & I2CIFG)
{
I2CIFG=0x00; // clear I2C interrupt flags
U0CTL |= MST; // define Master Mode
I2CTCTL |= I2CTRX; // I2CTRX=1 => Transmit Mode (R/W bit 0)
I2CTCTL |= I2CSTT; // start condition is generated
while (I2CTCTL&I2CSTT); // wait till I2CSTT bit was cleared
I2CTCTL |= I2CSTP; // stop condition is generated after
slave address was sent
// => I2C communication is started
while (I2CDCTL&I2CBUSY); // wait till stop bit is reset
count=count+1;
P1OUT ^= 0xFF;
}
U0CTL &= ~I2CEN; // clear I2CEN bit => necessary to re-
configure I2C module
I2CTCTL &= ~I2CRM; // transmission is by the I2C module
U0CTL |= I2CEN; // enable I2C module

return;
}

/*-------------------------------
--------*/
/* Interrupt Service
Routines */
/* Note that the Compiler version is checked in the following
code and */
/* depending of the Compiler Version the correct Interrupt
Service */
/* Routine definition is
used. */
#if __VER__ < 200
interrupt [USART0TX_VECTOR] void ISR_I2C(void)
#else
#pragma vector=USART0TX_VECTOR
__interrupt void ISR_I2C(void)
#endif

// Description:
// Byte Write Operation. The communication via the I2C bus with an
EEPROM
{
switch (I2CIV)
{ case I2CIV_AL: /* I2C interrupt vector: Arbitration lost
(ALIFG) */
break;
case I2CIV_NACK: /* I2C interrupt vector: No acknowledge
(NACKIFG) */
break;
case I2CIV_OA: /* I2C interrupt vector: Own address (OAIFG)
*/
break;
case I2CIV_ARDY: /* I2C interrupt vector: Access ready
(ARDYIFG) */
break;
case I2CIV_RXRDY: /* I2C interrupt vector: Receive ready
(RXRDYIFG) */
I2CBuffer[0]=I2CDRB; // store received data
in buffer
break;
case I2CIV_TXRDY: /* I2C interrupt vector: Transmit ready
(TXRDYIFG) */
I2CDRB = I2CBuffer[PtrTransmit];
PtrTransmit = PtrTransmit-1;
if (PtrTransmit<0)
{
I2CIE &= ~TXRDYIE; // disable
interrupts
}
break;
case I2CIV_GC: /* I2C interrupt vector: General call
(GCIFG) */
break;
case I2CIV_STT: /* I2C interrupt vector: Start condition
(STTIFG) */
break;
}
}