//开发软件:IAR v5502
//开发平台:MSP430F2618
//功能:读写EEPROM I2C接口
#include "EEPROM.h"
//——————————————————————————————————向EEPROM写单个字节——————————————————————————————————
unsigned char eeprom_writebyte(unsigned char word_addr,unsigned char word_value){
IE2 &= ~UCB0TXIE;                // Disable TX interrupt
while(UCB0CTL1 & UCTXSTP);
UCB0CTL1 |= UCTR;                // 写模式
UCB0CTL1 |= UCTXSTT;              // 发送启动位
UCB0TXBUF = word_addr;            // 发送字节地址
while(!(IFG2 & UCB0TXIFG))        // 等待 UCB0TXIFG = 1 与 UCTXSTT = 0 同时变化 等待一个标志位即可
{
if( UCB0STAT & UCNACKIFG )      // 若无应答 UCNACKIFG = 1
{
return 1;
}
UCB0TXBUF = word_value;          // 发送字节内容
while(!(IFG2 & UCB0TXIFG));      // 等待 UCB0TXIFG = 1
UCB0CTL1 |= UCTXSTP;
while(UCB0CTL1 & UCTXSTP);        // 等待发送完成
IFG2 &= ~UCB0TXIFG;              //此步骤很重要,否则进入中断等待,程序无法继续正确运行
IE2 |= UCB0TXIE;                  // Enable TX interrupt
return 0;
}
//——————————————————————————————————向EEPROM写多个字节——————————————————————————————————
//注意:对于AT24C01(16x8Byte),从页首开始,最多连续写8个字节,此后会回到页首覆盖先前数据,页写时只有低3位地址会递增
unsigned char eeprom_writepage(unsigned char word_addr,unsigned char *pword_buf,unsigned char len){
IE2 &= ~UCB0TXIE;                  // Disable TX interrupt
while( UCB0CTL1 & UCTXSTP );
UCB0CTL1 |= UCTR;                // 写模式
UCB0CTL1 |= UCTXSTT;              // 发送启动位
UCB0TXBUF = word_addr;            // 发送字节地址
while(!(IFG2 & UCB0TXIFG))        //等待 UCB0TXIFG = 1 与 UCTXSTT = 0 同时变化 等待一个标志位即可
{
if( UCB0STAT & UCNACKIFG )      // 若无应答 UCNACKIFG = 1
{
return 1;
}
for(unsigned char i = 0 ; i < len ; i++ )
{
UCB0TXBUF = *pword_buf++;      // 发送寄存器内容
while(!(IFG2 & UCB0TXIFG));    // 等待 UCB0TXIFG = 1 
}
UCB0CTL1 |= UCTXSTP;
while(UCB0CTL1 & UCTXSTP);        // 等待发送完成
IFG2 &= ~UCB0TXIFG;              //此步骤很重要,否则进入中断等待,程序无法继续正确运行
IE2 |= UCB0TXIE;                  // Enable TX interrupt
return 0;
}
//——————————————————————————————————从EEPROM读单个字节——————————————————————————
———
—————
unsigned char eeprom_readbyte(unsigned char word_addr,unsigned char *pword_value){
IE2 &= ~UCB0TXIE;                // Disable TX interrupt
UCB0CTL1 |= UCTR;                // 写模式
UCB0CTL1 |= UCTXSTT;              // 发送启动位和写控制字节
UCB0TXBUF = word_addr;            // 发送字节地址,必须要先填充TXBUF
while(!(IFG2 & UCB0TXIFG))        // 等待 UCB0TXIFG = 1 与 UCTXSTT = 0 同时变化 等待一个标志位即可
{
if( UCB0STAT & UCNACKIFG )      // 若无应答 UCNACKIFG = 1
{
return 1;
}
}                     
UCB0CTL1 &= ~UCTR;                // 读模式
UCB0CTL1 |= UCTXSTT;              // 发送启动位和读控制字节
while(UCB0CTL1 & UCTXSTT);        // 等待 UCTXSTT = 0
// 若无应答 UCNACKIFG = 1
UCB0CTL1 |= UCTXSTP;              // 先发送停止位
while(!(IFG2 & UCB0RXIFG));      // 读取字节内容
*pword_value = UCB0RXBUF;        // 读取BUF寄存器在发送停止位之后
while( UCB0CTL1 & UCTXSTP );
IFG2 &= ~UCB0TXIFG;              //此步骤很重要,否则进入中断等待,程序无法继续正确运行
IE2 |= UCB0TXIE;                  // Enable TX interrupt
return 0;
}
//——————————————————————————————————从EEPROM读多个字节——————————————————————————————————
//page读时地址会自动递增,因此可以连续读任意长度字节,而不用担心地址回到页首
unsigned char eeprom_readpage(unsigned char word_addr,unsigned char *pword_buf,unsigned char len){
IE2 &= ~UCB0TXIE;                // Disable TX interrupt
while( UCB0CTL1 & UCTXSTP );
UCB0CTL1 |= UCTR;                // 写模式
UCB0CTL1 |= UCTXSTT;              // 发送启动位和写控制字节
UCB0TXBUF = word_addr;            // 发送字节地址
while(!(IFG2 & UCB0TXIFG))        // 等待 UCB0TXIFG = 1 与 UCTXSTT = 0 同时变化 等待一个标志位即可
{
if( UCB0STAT & UCNACKIFG )      // 若无应答 UCNACKIFG = 1
{
return 1;
}
}   
UCB0CTL1 &= ~UCTR;                // 读模式
UCB0CTL1 |= UCTXSTT;              // 发送启动位和读控制字节
while(UCB0CTL1 & UCTXSTT);        // 等待UCTXSTT=0
// 若无应答 UCNACKIFG = 1
for( unsigned char i = 0; i < len - 1 ; i++ )
{
while(!(IFG2 & UCB0RXIFG));    // 读取字节内容,不包括最后一个字节内容
*pword_buf++ = UCB0RXBUF;
}
UCB0CTL1 |= UCTXSTP;              // 在接收最后一个字节之前发送停止位
while(!(IFG2 & UCB0RXIFG));      // 读取最后一个字节内容
*pword_buf = UCB0RXBUF;
while( UCB0CTL1 & UCTXSTP );
IFG2 &= ~UCB0RXIFG;              //此步骤很重要,否则进入中断等待,程序无法继续正确运行
IE2
|= UCB0TXIE; 
// Enable TX interrupt
return 0;
}
//——————————————————————————————————向EEPROM写单个字节——————————————————————————————————
unsigned char eeprom_writebyte_1M(unsigned char FirstWordAddr,unsigned char SecondWordAddr,unsigned char word_value){
IE2 &= ~UCB0TXIE;                // Disable TX interrupt
while(UCB0CTL1 & UCTXSTP);
UCB0CTL1 |= UCTR;                // 写模式
UCB0CTL1 |= UCTXSTT;              // 发送启动位
UCB0TXBUF = FirstWordAddr;        // 发送第一个字节地址
while(!(IFG2 & UCB0TXIFG))        // 等待 UCB0TXIFG = 1 与 UCTXSTT = 0 同时变化 等待一个标志位即可
{
if( UCB0STAT & UCNACKIFG )      // 若无应答 UCNACKIFG = 1
{
return 1;
}
UCB0TXBUF = SecondWordAddr;      // 发送第二个字节地址
while(!(IFG2 & UCB0TXIFG));      // 等待 UCB0TXIFG = 1
UCB0TXBUF = word_value;          // 发送字节内容
while(!(IFG2 & UCB0TXIFG));      // 等待 UCB0TXIFG = 1
UCB0CTL1 |= UCTXSTP;
while(UCB0CTL1 & UCTXSTP);        // 等待发送完成
IFG2 &= ~UCB0TXIFG;              //此步骤很重要,否则进入中断等待,程序无法继续正确运行
IE2 |= UCB0TXIE;                  // Enable TX interrupt
return 0;
}
//——————————————————————————————————向EEPROM写多个字节——————————————————————————————————
/
/注意:对于AT24CM01(512x256Byte),从页首开始,最多连续写256个字节,此后会回到页首覆盖先前数据,页写时只有低8位地址会递增
unsigned char eeprom_writepage_1M(unsigned char FirstWordAddr,unsigned char SecondWordAddr,unsigned char *pword_buf,unsigned char len){
IE2 &= ~UCB0TXIE;                  // Disable TX interrupt
while( UCB0CTL1 & UCTXSTP );
UCB0CTL1 |= UCTR;                // 写模式
UCB0CTL1 |= UCTXSTT;              // 发送启动位
UCB0TXBUF = FirstWordAddr;        // 发送第一个字节地址
while(!(IFG2 & UCB0TXIFG))        //等待 UCB0TXIFG = 1 与 UCTXSTT = 0 同时变化 等待一个标志位即可
中文写代码软件
{
if( UCB0STAT & UCNACKIFG )      // 若无应答 UCNACKIFG = 1
{
return 1;
}
UCB0TXBUF = SecondWordAddr;      // 发送第二个字节地址
while(!(IFG2 & UCB0TXIFG));      // 等待 UCB0TXIFG = 1
for(unsigned char i = 0 ; i < len ; i++ )
{
UCB0TXBUF = *pword_buf++;      // 发送寄存器内容
while(!(IFG2 & UCB0TXIFG));    // 等待 UCB0TXIFG = 1 
}
UCB0CTL1 |= UCTXSTP;
while(UCB0CTL1 & UCTXSTP);        // 等待发送完成
IFG2 &= ~UCB0TXIFG;              //此步骤很重要,否则进入中断等待,程序无法继续正确
运行
IE2 |= UCB0TXIE;                  // Enable TX interrupt
return 0;
}
//——————————————————————————————————从EEPROM读单个字节——————————————————————————————————
unsigned char eeprom_readbyte_1M(unsigned char FirstWordAddr,unsigned char SecondWordAddr,unsigned char *pword_value){
IE2 &= ~UCB0TXIE;                // Disable TX interrupt
UCB0CTL1 |= UCTR;                // 写模式
UCB0CTL1 |= UCTXSTT;              // 发送启动位和写控制字节
UCB0TXBUF = FirstWordAddr;        // 发送第一个字节地址,必须要先填充TXBUF
while(!(IFG2 & UCB0TXIFG))        // 等待 UCB0TXIFG = 1 与 UCTXSTT = 0 同时变化 等待一个标志位即可
{
if( UCB0STAT & UCNACKIFG )      // 若无应答 UCNACKIFG = 1
{
return 1;
}
}                     
UCB0TXBUF = SecondWordAddr;      // 发送第二个字节地址
while(!(IFG2 & UCB0TXIFG));      // 等待 UCB0TXIFG = 1
UCB0CTL1 &= ~UCTR;                // 读模式
UCB0CTL1 |= UCTXSTT;              // 发送启动位和读控制字节
while(UCB0CTL1 & UCTXSTT);        // 等待 UCTXSTT = 0
// 若无应答 UCNACKIFG = 1
UCB0CTL1 |= UCTXSTP;              // 先发送停止位
while(!(IFG2 & UCB0RXIFG));      // 读取字节内容
*pword_value = UCB0RXBUF;        // 读取BUF寄存器在发送停止位之后
while( UCB0CTL1 & UCTXSTP );
IFG2 &= ~UCB0TXIFG;              //此步骤很重要,否则进入中断等待,程序无法继续正确运行
IE2 |= UCB0TXIE;                  // Enable TX interrupt
return 0;
}
//——————————————————————————————————从EEPROM读多个字节——————————————————————————————————
unsigned char eeprom_readpage_1M(unsigned char FirstWordAddr,unsigned char SecondWordAddr,unsigned char *pword_buf,unsigned char len){
IE2 &= ~UCB0TXIE;                // Disable TX interrupt
while( UCB0CTL1 & UCTXSTP );
UCB0CTL1 |= UCTR;                // 写模式
UCB0CTL1 |= UCTXSTT;              // 发送启动位和写控制字节
UCB0TXBUF = FirstWordAddr;        // 发送第一个字节地址
while(!(IFG2 & UCB0TXIFG))        // 等待 UCB0TXIFG = 1 与 UCTXSTT = 0 同时变化 等待一个标志位即可
{
if( UCB0STAT & UCNACKIFG )      // 若无应答 UCNACKIFG = 1
{
return 1;
}
}   
UCB0TXBUF = SecondWordAddr;      // 发送第二个字节地址
while(!(IFG2 & UCB0TXIFG));      // 等待 UCB0TXIFG = 1
UCB0CTL1 &= ~UCTR;                // 读模式
UCB0CTL1 |= UCTXSTT;              // 发送启动位和读控制字节
while(UCB0CTL1 & UCTXSTT);        // 等待UCTXSTT=0
// 若无应答 UCNACKIFG = 1
for( un
signed c
har i = 0; i < len - 1 ; i++ )
{
while(!(IFG2 & UCB0RXIFG));    // 读取字节内容,不包括最后一个字节内容
*pword_buf++ = UCB0RXBUF;
}
UCB0CTL1 |= UCTXSTP;              // 在接收最后一个字节之前发送停止位
while(!(IFG2 & UCB0RXIFG));      // 读取最后一个字节内容
*pword_buf = UCB0RXBUF;
while( UCB0CTL1 & UCTXSTP );
IFG2 &= ~UCB0RXIFG;              //此步骤很重要,否则进入中断等待,程序无法继续正确运行
IE2 |= UCB0TXIE;                  // Enable TX interrupt
return 0;
}
//清楚EEPROM连续若干地址下的数据
void EEPROM_ClearData(unsigned char FirstWordAddr,unsigned char SecondWordAddr,unsigned char len){
for(unsigned char i=0;i<len;i++){
eeprom_writebyte_1M(FirstWordAddr,SecondWordAddr+i,0);
delay_ms(5);
}
}