EEPROM读写c代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//开发软件: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);
}
}