Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
06/09/08 23:41
Read: times


 
#155645 - Well that's not gonna happen....
Responding to: ???'s previous message
Worms, in a Keil file....<laughing>

Here's the source


main.c
#include "REG936.h"
#include "i2c.h"
#include "i2c_callback.h" 

void main (void)//main program
{

while(1)//Loop this section forever
   {    
	EA=1;
	i2c_isr();
	i2c_init(0x80, 0);
	i2c_master_getbyte(0x03);		
	i2c_transmit(0xEE);
	STO = 1;
	i2c_transmit(0xDD);
	STO = 1;
	i2c_transmit(0xCC);
	STO = 1;
	i2c_transfer_finished();  

   }
}



i2c.c

/***********************************************************************
MODULE:    I2C
VERSION:   1.03
CONTAINS:  Routines for controlling the I2C Peripheral on the Philips
           P89LPC936
COPYRIGHT: Embedded Systems Academy, Inc. - www.esacademy.com
LICENSE:   May be freely used in commercial and non-commercial code
           without royalties provided this copyright notice remains
           in this file and unaltered
WARNING:   IF THIS FILE IS REGENERATED BY CODE ARCHITECT ANY CHANGES
           MADE WILL BE LOST. WHERE POSSIBLE USE ONLY CODE ARCHITECT
           TO CHANGE THE CONTENTS OF THIS FILE
GENERATED: On "Jun 09 2008" at "11:54:01" by Code Architect 2.12
***********************************************************************/

// SFR description needs to be included
#include "reg936.h"
#include "i2c.h"
#include "i2c_callback.h"

// MODULE INTERNAL VARIABLES

// internal copy of slave address
static unsigned char mslaveaddress;
// I2C transfer status
static unsigned char mi2cstatus;
// current number of byte transferred
static unsigned int mbytenum;

// MODULE INTERNAL FUNCTIONS

/***********************************************************************
DESC:    I2C interrupt service routine. handles the transfer and
         calls the relevent callback functions. Changes mi2cstatus
RETURNS: Nothing
************************************************************************/
void i2c_isr
  (
  void
  ) interrupt 6 using 1
{
  unsigned char status;

  status = I2STAT & 0xF8;

  switch(status)
  {
    case 0x08:
    case 0x10:
      I2DAT = mslaveaddress;
      STA = 0;
      STO = 0;
      mbytenum = 0;
      break;

    // MASTER TRANSMITTER
    // ACK for slave address + W
    case 0x18:
      I2DAT = i2c_master_getbyte(mbytenum);
      STA = 0;
      STO = 0;
      break;
    // no ACK for slave address + W
    case 0x20:
      // stop condition
      STA = 0;
      STO = 1;
      mi2cstatus = I2C_ERROR;
      i2c_transfer_finished();
      break;
    // ACK for data byte
    case 0x28:
      if (i2c_master_islasttxbyte(mbytenum))
      {
        // stop condition
        STA = 0;
        STO = 1;
        mi2cstatus = I2C_OK;
        i2c_transfer_finished();
      }
      else
      {
        mbytenum++;
        I2DAT = i2c_master_getbyte(mbytenum);
        STA = 0;
        STO = 0;
      } // if
      break;
    // no ACK for data byte
    case 0x30:
      // stop condition
      STA = 0;
      STO = 1;
      mi2cstatus = I2C_ERROR;
      i2c_transfer_finished();
      break;
    // arbitration lost
    case 0x38:
      // start condition - try again
      STA = 1;
      STO = 0;
      break;

    // MASTER RECEIVER
    // ACK for slave address + R
    case 0x40:
      STA = 0;
      STO = 0;
      if (i2c_master_islastrxbyte(mbytenum))
      {
        // return NACK for data byte
        AA = 0;
      }
      else
      {
        // return ACK for data byte
        AA = 1;
      } // if
      break;
    // no ACK for slave address + R
    case 0x48:
      STA = 0;
      // stop condition
      STO = 1;
      mi2cstatus = I2C_ERROR;
      i2c_transfer_finished();
      break;
    // ACK for data byte
    case 0x50:
      i2c_master_receivedbyte(mbytenum, I2DAT);
      mbytenum++;
      STA = 0;
      STO = 0;
      if (i2c_master_islastrxbyte(mbytenum))
      {
        // return NACK for next data byte
        AA = 0;
      }
      else
      {
        // return ACK for next data byte
        AA = 1;
      } // if
      break;
    // no ACK for data byte
    case 0x58:
      i2c_master_receivedbyte(mbytenum, I2DAT);
      STA = 0;
      // stop condition
      STO = 1;
      mi2cstatus = I2C_OK;
      i2c_transfer_finished();
      break;

    // SLAVE RECEIVER
    // slave address + W received
    // or general call address received
    // or lost arbitration, slave address + W received
    // or lost arbitration, general call address received
    case 0x60:
    case 0x68:
    case 0x70:
    case 0x78:
      STA = 0;
      STO = 0;
      mbytenum = 0;
      if (i2c_slave_islastrxbyte(mbytenum))
      {
        // we don't want to receive more bytes
        AA = 0;
      }
      else
      {
        // want to receive more bytes
        AA = 1;
      } // if
      break;
    // data byte received
    case 0x80:
    case 0x90:
      i2c_slave_receivedbyte(mbytenum, I2DAT);
      mbytenum++;
      STA = 0;
      STO = 0;
      if (i2c_slave_islastrxbyte(mbytenum))
      {
        // we don't want to receive more bytes
        AA = 0;
      }
      else
      {
        // want to receive more bytes
        AA = 1;
      } // if
      break;
    // data received, NACK returned
    case 0x88:
    case 0x98:
      i2c_slave_receivedbyte(mbytenum, I2DAT);
      mbytenum++;
      mi2cstatus = I2C_OK;
      STA = 0;
      STO = 0;
      // go back to slave mode waiting to be addressed
      AA = 1;
      i2c_transfer_finished();
      break;
    // stop condition received
    case 0xA0:
      mi2cstatus = I2C_OK;
      STA = 0;
      STO = 0;
      // go back to slave mode waiting to be addressed
      AA = 1;
      i2c_transfer_finished();
      break;

    // SLAVE TRANSMITTER
    // slave address + R received, ACK returned
    // arbitration lost, slave address + R received, ACK returned
    // data byte transmitted, ACK received
    case 0xA8:
    case 0xB0:
      mbytenum = 0;
    case 0xB8:
      I2DAT = i2c_slave_getbyte(mbytenum);
      STA = 0;
      STO = 0;
      if (i2c_slave_islasttxbyte(mbytenum))
      {
        // no more data bytes to transmit
        AA = 0;
      }
      else
      {
        // more data bytes to transmit
        AA = 1;
      } // if
      mbytenum++;
      break;
    // data byte transmitted, NACK received
    // last data byte transmitted, NACK received
    case 0xC0:
    case 0xC8:
      mi2cstatus = I2C_OK;
      STA = 0;
      STO = 0;
      // go back to slave move waiting to be addressed
      AA = 1;
      i2c_transfer_finished();
      break;

    // unknown state
    default:
      mi2cstatus = I2C_ERROR;
      STA = 0;
      STO = 0;
      // go back to slave mode waiting to be addressed
      AA = 1;
      i2c_transfer_finished();
      break;
  } // switch - status

  // clear interrupt flag
  SI = 0;
} // i2c_isr

// EXTERNAL INTERFACE FUNCTIONS

/***********************************************************************
DESC:    initializes the I2C peripheral and interrupt
         sets the device's I2C address and whether it will
         respond to the general call address
         Uses a data rate of 100kHz
RETURNS: Nothing
************************************************************************/
void i2c_init
  (
  unsigned char address,  // The 7-bit I2C address to use
  bit generalcall         // 1 = respond to general call, 0 = ignore
                          // general call
  )
{
  // set pins to open-drain
  P1M1 |= 0x0C;
  P1M2 |= 0x0C;
  EA = 1;

  // configure I2C address
  I2ADR = 0x00;
  I2ADR = address << 1;
  if (generalcall)
  {
    I2ADR |= 0x01;
  } // if

  // configure internal SCL generator
  I2SCLH = 0x1E;
  I2SCLL = 0x1E;

  // configure I2C interface
  // use internal SCL generator
  I2CON = 0x44;

  // set interrupt priority to 0
  IP1 &= ~0x01;
  IP1H &= ~0x01;

  // initial status
  mi2cstatus = I2C_IDLE;

  // enable interrupt
  EI2C = 1;
} // i2c_init

/***********************************************************************
DESC:    attempts to start an I2C transmission as a master to a
         device with a specific address. If successful then
         master callback functions will be called to handle the
         data for the transfer
RETURNS: I2C_BUSYTX if I2C is already busy transmitting data
         I2C_BUSYRX if I2C is already busy receiving data
         I2C_OK if transmission started
NOTES:   Can check if I2C busy by ANDing returned value with
         I2C_BUSY

unsigned char i2c_transmit  (unsigned char address)

************************************************************************/
unsigned char i2c_transmit
  (
  unsigned char address    // address of device to transmit to
  )
{
  // if already busy then return current status
  if (mi2cstatus & I2C_BUSY) return mi2cstatus;

  // now we are busy performing a transfer
  mi2cstatus = I2C_BUSYTX;

  // store slave address + W for use in ISR
  mslaveaddress = address << 1;

  // transmit start condition
  STA = 1;

  // transmission started
  return I2C_OK;
} // i2c_transmit

/***********************************************************************
DESC:    attempts to start an I2C reception as a master from a
         device with a specific address. If successful then
         master callback functions will be called to handle the
         data for the transfer
RETURNS: I2C_BUSYTX if I2C is already busy transmitting data
         I2C_BUSYRX if I2C is already busy receiving data
         I2C_OK if reception started
NOTES:   Can check if I2C busy by ANDing returned value with
         I2C_BUSY
************************************************************************/
unsigned char i2c_receive
  (
  unsigned char address    // address of device to receive from
  )
{
  // if already busy then return current status
  if (mi2cstatus & I2C_BUSY) return mi2cstatus;

  // now we are busy performing a transfer
  mi2cstatus = I2C_BUSYRX;

  // store slave address + R for use in ISR
  mslaveaddress = (address << 1) | 0x01;

  // transmit start condition
  STA = 1;

  // reception started
  return I2C_OK;
} // i2c_receive

/***********************************************************************
DESC:    returns the current status of the I2C peripheral.
         allows polling to be used to determine if a transfer
         has been completed
RETURNS: I2C_BUSYTX if I2C is already busy transmitting data
         I2C_BUSYRX if I2C is already busy receiving data
         I2C_OK if no transfer in progress and last transfer
         was successful
         I2C_ERROR if no transfer in progress and last transfer
         encountered an error
         I2C_IDLE if no transfer in progress
NOTES:   Can check if I2C busy by ANDing returned value with
         I2C_BUSY. Example:
         i2c_transmit(0x00);
         while (i2c_getstatus() & I2C_BUSY);
         if (i2c_getstatus() == I2C_OK)
         ...
************************************************************************/
unsigned char i2c_getstatus
  (
  void
  )
{
  // wait until any interrupt completed
  while(SI);

  // return status
  return mi2cstatus;
} // i2c_getstatus



i2c.h

/***********************************************************************
MODULE:    I2C
VERSION:   1.03
CONTAINS:  Routines for controlling the I2C Peripheral on the Philips
           P89LPC936
COPYRIGHT: Embedded Systems Academy, Inc. - www.esacademy.com
LICENSE:   May be freely used in commercial and non-commercial code
           without royalties provided this copyright notice remains
           in this file and unaltered
WARNING:   IF THIS FILE IS REGENERATED BY CODE ARCHITECT ANY CHANGES
           MADE WILL BE LOST. WHERE POSSIBLE USE ONLY CODE ARCHITECT
           TO CHANGE THE CONTENTS OF THIS FILE
GENERATED: On "Jun 09 2008" at "11:54:01" by Code Architect 2.12
***********************************************************************/

#ifndef _I2CH_
#define _I2CH_

// possible states for the I2C peripheral
#define I2C_IDLE   0x00
#define I2C_BUSY   0x01
#define I2C_BUSYTX 0x03
#define I2C_BUSYRX 0x05
#define I2C_OK     0x02
#define I2C_ERROR  0x04

/***********************************************************************
DESC:    initializes the I2C peripheral and interrupt
         sets the device's I2C address and whether it will
         respond to the general call address
         Uses a data rate of 100kHz
RETURNS: Nothing
************************************************************************/
extern void i2c_init
  (
  unsigned char address,  // The 7-bit I2C address to use
  bit generalcall         // 1 = respond to general call, 0 = ignore
                          // general call
  );

/***********************************************************************
DESC:    attempts to start an I2C transmission as a master to a
         device with a specific address. If successful then
         master callback functions will be called to handle the
         data for the transfer
RETURNS: I2C_BUSYTX if I2C is already busy transmitting data
         I2C_BUSYRX if I2C is already busy receiving data
         I2C_OK if transmission started
NOTES:   Can check if I2C busy by ANDing returned value with
         I2C_BUSY
************************************************************************/
extern unsigned char i2c_transmit
  (
  unsigned char address    // address of device to transmit to
  );

/***********************************************************************
DESC:    attempts to start an I2C reception as a master from a
         device with a specific address. If successful then
         master callback functions will be called to handle the
         data for the transfer
RETURNS: I2C_BUSYTX if I2C is already busy transmitting data
         I2C_BUSYRX if I2C is already busy receiving data
         I2C_OK if reception started
NOTES:   Can check if I2C busy by ANDing returned value with
         I2C_BUSY
************************************************************************/
extern unsigned char i2c_receive
  (
  unsigned char address    // address of device to receive from
  );

/***********************************************************************
DESC:    returns the current status of the I2C peripheral.
         allows polling to be used to determine if a transfer
         has been completed
RETURNS: I2C_BUSYTX if I2C is already busy transmitting data
         I2C_BUSYRX if I2C is already busy receiving data
         I2C_OK if no transfer in progress and last transfer
         was successful
         I2C_ERROR if no transfer in progress and last transfer
         encountered an error
         I2C_IDLE if no transfer in progress
NOTES:   Can check if I2C busy by ANDing returned value with
         I2C_BUSY. Example:
         i2c_transmit(0x00);
         while (i2c_getstatus() & I2C_BUSY);
         if (i2c_getstatus() == I2C_OK)
         ...
************************************************************************/
extern unsigned char i2c_getstatus
  (
  void
  );

#endif // _IC2H_



i2c.callback.c

/***********************************************************************
MODULE:    I2C Callback
VERSION:   1.03
CONTAINS:  Routines for controlling the I2C Peripheral on the Philips
           P89LPC936
COPYRIGHT: Embedded Systems Academy, Inc. - www.esacademy.com
LICENSE:   May be freely used in commercial and non-commercial code
           without royalties provided this copyright notice remains
           in this file and unaltered
WARNING:   IF THIS FILE IS REGENERATED BY CODE ARCHITECT ANY CHANGES
           MADE WILL BE LOST. WHERE POSSIBLE USE ONLY CODE ARCHITECT
           TO CHANGE THE CONTENTS OF THIS FILE
GENERATED: On "Jun 09 2008" at "11:54:02" by Code Architect 2.12
***********************************************************************/
#include "REG936.h"
#include "i2c.h"
#include "i2c_callback.h"

// MASTER CALLBACK FUNCTIONS

/***********************************************************************
DESC:    gets the next byte to be transmitted when operating as
         a master
RETURNS: byte to transmit
************************************************************************/
unsigned char i2c_master_getbyte
  (
  unsigned int bytenum    // number of the byte in this transfer
                          // (0 = first byte)
  )
{
  // insert code here
  
  


  return 0x00;
} // i2c_master_getbyte

/***********************************************************************
DESC:    processes the bytes received when operating as a master
RETURNS: Nothing
************************************************************************/
void i2c_master_receivedbyte
  (
  unsigned int bytenum,    // number of the byte in this transfer
                           // (0 = first byte)
  unsigned char value      // value of byte received
  )
{
  // insert code here

} // i2c_master_receivedbyte

/***********************************************************************
DESC:    determines if a byte will be the last one to be
         transmitted when operating as a master
         called before i2c_master_getbyte for each byte
RETURNS: return 1 if the byte will be the last one to transmit
         return 0 if the byte will not be the last one to transmit
************************************************************************/
unsigned char i2c_master_islasttxbyte
  (
  unsigned int bytenum    // number of the byte in this transfer
                          // (0 = first byte)
  )
{
  // insert code here

  return 0;
} // i2c_master_islasttxbyte

/***********************************************************************
DESC:    determines if a byte will be the last one to be
         received when operating as a master
         called before i2c_master_receivedbyte for each byte
RETURNS: return 1 if the byte will be the last one to receive
         return 0 if the byte will not be the last one to receive
************************************************************************/
unsigned char i2c_master_islastrxbyte
  (
  unsigned int bytenum    // number of the byte in this transfer
                          // (0 = first byte)
  )
{
  // insert code here

  return 0;
} // i2c_master_islastrxbyte

// SLAVE CALLBACK FUNCTIONS

/***********************************************************************
DESC:    gets the next byte to be transmitted when operating as
         a slave
RETURNS: byte to transmit
************************************************************************/
unsigned char i2c_slave_getbyte
  (
  unsigned int bytenum    // number of the byte in this transfer
                          // (0 = first byte)
  )
{
  // insert code here

  return 0x00;
} // i2c_slave_getbyte

/***********************************************************************
DESC:    processes the bytes received when operating as a slave
RETURNS: Nothing
************************************************************************/
void i2c_slave_receivedbyte
  (
  unsigned int bytenum,    // number of the byte in this transfer
                           // (0 = first byte)
  unsigned char value      // value of byte received
  )
{
  // insert code here

} // i2c_slave_receivedbyte

/***********************************************************************
DESC:    determines if a byte will be the last one to be
         transmitted when operating as a slave
         called after i2c_slave_getbyte for each byte
RETURNS: return 1 if the byte will be the last one to transmit
         return 0 if the byte will not be the last one to transmit
************************************************************************/
unsigned char i2c_slave_islasttxbyte
  (
  unsigned int bytenum    // number of the byte in this transfer
                          // (0 = first byte)
  )
{
  // insert code here

  return 0;
} // i2c_slave_islasttxbyte

/***********************************************************************
DESC:    determines if a byte will be the last one to be
         received when operating as a slave
         called before i2c_slave_receivedbyte for each byte
RETURNS: return 1 if the byte will be the last one to receive
         return 0 if the byte will not be the last one to receive
************************************************************************/
unsigned char i2c_slave_islastrxbyte
  (
  unsigned int bytenum    // number of the byte in this transfer
                          // (0 = first byte)
  )
{
  // insert code here

  return 0;
} // i2c_slave_islastrxbyte

/***********************************************************************
DESC:    called when an I2C transfer is finished
         mi2cstatus may be read to determine if the transfer was
         successful (I2C_OK) or failed (I2C_ERROR)
RETURNS: Nothing
************************************************************************/
void i2c_transfer_finished
  (
  void
  )
{
  // insert code here

} // i2c_transfer_finished



i2c_callback.h

/***********************************************************************
MODULE:    I2C Callback
VERSION:   1.03
CONTAINS:  Routines for controlling the I2C Peripheral on the Philips
           P89LPC936
COPYRIGHT: Embedded Systems Academy, Inc. - www.esacademy.com
LICENSE:   May be freely used in commercial and non-commercial code
           without royalties provided this copyright notice remains
           in this file and unaltered
WARNING:   IF THIS FILE IS REGENERATED BY CODE ARCHITECT ANY CHANGES
           MADE WILL BE LOST. WHERE POSSIBLE USE ONLY CODE ARCHITECT
           TO CHANGE THE CONTENTS OF THIS FILE
GENERATED: On "Jun 09 2008" at "11:54:02" by Code Architect 2.12
***********************************************************************/

#ifndef _I2CCALLBACKH_
#define _I2CCALLBACKH_

/***********************************************************************
DESC:    gets the next byte to be transmitted when operating as
         a master
RETURNS: byte to transmit
************************************************************************/
extern unsigned char i2c_master_getbyte
  (
  unsigned int bytenum    // number of the byte in this transfer
                          // (0 = first byte)
  );

/***********************************************************************
DESC:    processes the bytes received when operating as a master
RETURNS: Nothing
************************************************************************/
extern void i2c_master_receivedbyte
  (
  unsigned int bytenum,    // number of the byte in this transfer
                           // (0 = first byte)
  unsigned char value      // value of byte received
  );

/***********************************************************************
DESC:    determines if a byte will be the last one to be
         transmitted when operating as a master
         called before i2c_master_getbyte for each byte
RETURNS: return 1 if the byte will be the last one to transmit
         return 0 if the byte will not be the last one to transmit
************************************************************************/
extern unsigned char i2c_master_islasttxbyte
  (
  unsigned int bytenum    // number of the byte in this transfer
                          // (0 = first byte)
  );

/***********************************************************************
DESC:    determines if a byte will be the last one to be
         received when operating as a master
         called before i2c_master_receivedbyte for each byte
RETURNS: return 1 if the byte will be the last one to receive
         return 0 if the byte will not be the last one to receive
************************************************************************/
extern unsigned char i2c_master_islastrxbyte
  (
  unsigned int bytenum    // number of the byte in this transfer
                          // (0 = first byte)
  );

/***********************************************************************
DESC:    gets the next byte to be transmitted when operating as
         a slave
RETURNS: byte to transmit
************************************************************************/
extern unsigned char i2c_slave_getbyte
  (
  unsigned int bytenum    // number of the byte in this transfer
                          // (0 = first byte)
  );

/***********************************************************************
DESC:    processes the bytes received when operating as a slave
RETURNS: Nothing
************************************************************************/
extern void i2c_slave_receivedbyte
  (
  unsigned int bytenum,    // number of the byte in this transfer
                           // (0 = first byte)
  unsigned char value      // value of byte received
  );

/***********************************************************************
DESC:    determines if a byte will be the last one to be
         transmitted when operating as a slave
         called after i2c_slave_getbyte for each byte
RETURNS: return 1 if the byte will be the last one to transmit
         return 0 if the byte will not be the last one to transmit
************************************************************************/
extern unsigned char i2c_slave_islasttxbyte
  (
  unsigned int bytenum    // number of the byte in this transfer
                          // (0 = first byte)
  );

/***********************************************************************
DESC:    determines if a byte will be the last one to be
         received when operating as a slave
         called before i2c_slave_receivedbyte for each byte
RETURNS: return 1 if the byte will be the last one to receive
         return 0 if the byte will not be the last one to receive
************************************************************************/
extern unsigned char i2c_slave_islastrxbyte
  (
  unsigned int bytenum    // number of the byte in this transfer
                          // (0 = first byte)
  );

/***********************************************************************
DESC:    called when an I2C transfer is finished
         mi2cstatus may be read to determine if the transfer was
         successful (I2C_OK) or failed (I2C_ERROR)
RETURNS: Nothing
************************************************************************/
extern void i2c_transfer_finished
  (
  void
  );

#endif // _I2CCALLBACKH_




List of 14 messages in thread
TopicAuthorDate
Hardware I2C on 8051 NXP....I'm stuck            01/01/70 00:00      
   divide and conquer            01/01/70 00:00      
      where would I find that?            01/01/70 00:00      
         what is a "tut file" ??            01/01/70 00:00      
            FIle is in the link in first post            01/01/70 00:00      
               I would NEVER NEVER NEVER .....            01/01/70 00:00      
                  Well that's not gonna happen....            01/01/70 00:00      
                     looks to me as staright CodeArchitect            01/01/70 00:00      
                     accidential double, ignore            01/01/70 00:00      
                     Programming is not guesswork            01/01/70 00:00      
                        blunt is fine.....and I'll say it again.            01/01/70 00:00      
                           Forum posts and reality...            01/01/70 00:00      
                           you will break a leg            01/01/70 00:00      
                           does it have to be C?            01/01/70 00:00      

Back to Subject List