📄 main.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 + -