⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 EEPROM 24LC08 accessed via IIC on a HCS12
💻 C
字号:
/*
Travis Lytle
IIC protocol interfaced with a 24LC08 EEPROM chip
datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/ds-22084A.pdf


HCS12		24LC08
			A0-A2	--GND
			WP		--GND
SCL---------SCL
SCA---------SDA

*/

#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#include <stdio.h>

typedef unsigned char UINT8;

void openIIC(void), sendSlaveID(UINT8),eeAckPoll(void);
UINT8 EErandRead(UINT8),EEbyteWrite(UINT8, UINT8), EEpageWrite(UINT8, UINT8, UINT8 *ptr);

char getString(char *);
void putString(char *);

UINT8 ID = 0xA0;
UINT8 ID2;
int ch, length, i,data, page, temp, memaddr;

unsigned char datastr[16];

void main(void) {
  
  TERMIO_Init();
  openIIC();
  
  while(1){
  
    //clear buffer
  for(i=0;i<26;i++){
    datastr[i] = 0;
  }
  
  eeAckPoll();
  printf("\n\r\n\r24LC08 EEPROM  Page:%u\n\r", page);
  putString("=============\n\r");
  putString("0:Erase EEPROM\n\r");
  putString("1:Read byte\n\r");
  putString("2:Write byte\n\r");
  putString("3:Read Page\n\r");
  putString("4:Write Page\n\r");  
  putString("5:Change Page\n\r");
  
  ch = TERMIO_GetChar();
  ch -= 0x30;


  

    if(ch == 0) {                     //Erase EEPROM
      
      memaddr = 0x00;
      putString("\n\rErasing...");
      
      for(i=0; i<256; i++){
        eeAckPoll();
        EEbyteWrite(memaddr, 0xFF);
        memaddr += 1;
      }
    }

    if(ch == 1) {                     //Read Byte
      putString("\n\rAddress to Read:");
      scanf("%i", &memaddr);
      
      temp = EErandRead(memaddr);
        
      printf("\n\r\n\r %x", temp);
    }

    if(ch == 2) {                     //Write Byte
      putString("\n\rAddress to Write:");
      scanf("%x", &memaddr);

      putString("\n\rData to Write:");
      scanf("%i", &data);

      EEbyteWrite(memaddr, data);
    }

    if(ch == 3) {                    //Read Page
      
      length =0;
      memaddr = 0;
      
      putString("\n\rAddress to start Read:");
      scanf("%x", &memaddr);
      putString("\n\rLength of data:");      
      scanf("%i", &length);      
      
      printf("\n\r\n\r");
               
      for(i=0; i<length; i++){
        temp = EErandRead(memaddr);
        memaddr +=1;
        printf(" %c", temp); 
      }
    }
    
    if(ch == 4) {                     //Write Page
    
      length = 0;
      memaddr = 0;
      
      putString("\n\rAddress to start Write:");
      scanf("%x", &memaddr);
      putString("\n\rLength of data:");      
      scanf("%i", &length);
      putString("\n\rData (limit of 16 characters):");      
    
      if(length > 16)
        length = 16;
      
      getString(datastr);
      
      EEpageWrite(memaddr, length, datastr);
    }

    if(ch == 5){
      putString("\n\rPage selection (0x00, 0x02, 0x04, or 0x06):");
      scanf("%x", &page);
    }


  }
}//main



void openIIC(){
 
  IBFD = 0x47;								/*setup iic baud rate */
  IBCR = 0x80;
}

void sendSlaveID(UINT8 cx){
  
  while(IBSR & IBSR_IBB_MASK);					/* wait until iic bus is idle */
  IBCR |= IBCR_TX_RX_MASK + IBCR_MS_SL_MASK;	/* generate a start condition */
  
  IBDR = cx;									/* send out the slave address with the R/W bit */
  while(!(IBSR & IBSR_IBIF_MASK));				/* wait for address transmission to complete */
  IBSR = IBSR_IBIF_MASK;						/* clear IBIF flag */
}

UINT8 EErandRead(UINT8 addr){

  UINT8 dummy;
  sendSlaveID(ID);

  if(IBSR & IBSR_RXAK_MASK)
    return -1;
  
  IBDR = addr;									/* send out EEPROM address */
  while(!(IBSR & IBSR_IBIF_MASK));				/* wait until the address is shifted out */
  IBSR = IBSR_IBIF_MASK;						/* clear IBIF flag */

  if(IBSR & IBSR_RXAK_MASK)
    return -1;
  
  IBCR |= IBCR_RSTA_MASK;						/* gemerate restart condition */
  
  ID2 = ID | 0x01;								/* prepare to read */
  ID2 = ID2 | page;
  IBDR = ID2;
  
     
  while(!(IBSR & IBSR_IBIF_MASK));
  IBSR=IBSR_IBIF_MASK;
 
  if(IBSR & IBSR_RXAK_MASK)
    return -1;
  
  IBCR |= IBCR_TXAK_MASK;						/* prepare to send NACK */
  IBCR &= ~IBCR_TX_RX_MASK;						/* preform reception */
  dummy = IBDR;									/* dumm read to trigger nine clock pulses */
 
  while(!(IBSR & IBSR_IBIF_MASK));				/* wait for data to shift in */
  IBSR = IBSR_IBIF_MASK;
  IBCR &= ~IBCR_MS_SL_MASK;						/* gemerate a stop condition */
  return IBDR;
}

UINT8 EEbyteWrite(UINT8 addr, UINT8 data){
  
  ID2 = ID | page;
  sendSlaveID(ID2);
  if(IBSR & IBSR_RXAK_MASK)						/* err if EEPROM does not respond */
    return -1;
  
  IBDR = addr;									/* send out address of the location to be written */
  while(!(IBSR & IBSR_IBIF_MASK));
  IBSR = IBSR_IBIF_MASK;						/* clear the IBIF flag */
  
  if(IBSR & IBSR_RXAK_MASK)						/* error if EEPROM does not respond */
    return -1;
  
  IBDR = data;									/* send out the data byte */
  while(!(IBSR & IBSR_IBIF_MASK));
  IBSR = IBSR_IBIF_MASK;						/*clear the IBIF flag */
  
  if(IBSR & IBSR_RXAK_MASK)						/* error if EEPROM does not respond */
    return -1;
  
  IBCR &= ~IBCR_MS_SL_MASK;						/* gemerate a stop condition */
  return 0;										/* normal write code */
}

UINT8 EEpageWrite(UINT8 addr, UINT8 ByteCnt, UINT8 *ptr){

  ID2 = ID | page;
  sendSlaveID(ID2);  								/* send out EEPROM ID */
  
  if(IBSR & IBSR_RXAK_MASK)
    return -1;									/* return -1 if EEPROM did not respond */
  
  IBDR = addr;									/* send out starting address of the pagewrite */
  while(!(IBSR & IBSR_IBIF_MASK));				/* wait until the address is shifted out */
  IBSR = IBSR_IBIF_MASK;						/* clear IBIF flag */
  
  if(IBSR & IBSR_RXAK_MASK)
    return -1;									/* return -1 if EEPROM did not respond */
  
  while(ByteCnt){
    IBDR = *ptr++;								/* send out 1 byte of data */
    while(!(IBSR & IBSR_IBIF_MASK));
    IBSR = IBSR_IBIF_MASK;
    
    if(IBSR & IBSR_RXAK_MASK)
      return -1;								/* return -1 if EEPROM did not respond */
    
    ByteCnt--;
  }
  IBCR &= ~IBCR_MS_SL_MASK;						/* gemerate a stop condition */
  return 0;
}

void eeAckPoll(){
  
  sendSlaveID(ID);
  
  while(IBSR & IBSR_RXAK_MASK){
    IBCR |= IBCR_RSTA_MASK;						/* gemerate a restart condition */
    IBDR = ID;									/* send out EEPROM ID */
    
    while(!(IBSR & IBSR_IBIF_MASK));
    IBSR = IBSR_IBIF_MASK;						/* clear the IBIF flag */
  };											/* continue if EEPROM did not acknowledge */
  IBCR &= ~IBCR_MS_SL_MASK;						/* gemerate a stop condition - indispensable */
}


char getString(char *buf)
{
	while((*buf = TERMIO_GetChar()) != 0x0d) 
	{
		TERMIO_PutChar(*buf);
		*buf++;
	}
	*buf = 0;
}

void putString(char *cx)
{
  while((*cx)) 
  {
    TERMIO_PutChar(*cx);
    cx++;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -