【MSP430F149学习】22 读写EEPROM
准备工具:电脑;TS8900--MSP430F149开发板;USB转串口模组;USB线两根;杜邦线三根
开发环境:IAR EW for MSP430 V5.30
通过电脑串口控制从EEPROM的指定地址中读出一个字节的数据,或者向指定地址写入一个字节的数据
原理图
硬件图
部分程序代码
相关宏定义
#define SCL_H P1OUT |= BIT2
#define SCL_L P1OUT &= ~BIT2
#define SDA_H P1OUT |= BIT3
#define SDA_L P1OUT &= ~BIT3
#define SDA_in P1DIR &= ~BIT3 //SDA改成输入模式
#define SDA_out P1DIR |= BIT3 //SDA变回输出模式
#define SDA_val P1IN&BIT3 //SDA的位值
#define TRUE 1
#define FALSE 0
#define deviceaddress 0xa0 //AT24C02的设备地址
EEPROM操作相关函数
/*******************************************
函数名称:Write_1Byte
功 能:向EEPROM中写入1个字节的数据
参 数:Wdata--写入的数据
dataaddress--数据的写入地址
返回值 :写入结果:1--成功,0--失败
********************************************/
uchar Write_1Byte(uchar wdata,uchar dataaddress)
{
start();
write1byte(deviceaddress);
if(check())
write1byte(dataaddress);
else
return 0;
if(check())
write1byte(wdata);
else
return 0;
if(check()) stop();
else return 0;
delay_10ms(); //等待EEPROM完成内部写入
return 1;
}
/*******************************************
函数名称:Write_NByte
功 能:向EEPROM中写入N个字节的数据
参 数:outbuf--指向写入数据存放首地址的指针
n--数据个数,最大不能超过8,由页地址
决定其最大长度
dataaddress--数据写入的首地址
返回值 :写入结果:1--成功,0--失败
********************************************/
uchar Write_NByte(uchar * outbuf,uchar n,uchar dataaddress)
{
uchar flag;
start();
write1byte(deviceaddress); //写入器件地址
if(check() == 1)
write1byte(dataaddress); //写入数据字地址
else
return 0;
if(check())
flag=writeNbyte(outbuf,n);
else
return 0;
delay_10ms(); //等待EEPROM完成内部写入
if(flag) return 1;
else return 0;
}
/*******************************************
函数名称:Read_1Byte_currentaddress
功 能:从EEPROM的当前地址读取1个字节的数据
参 数:无
返回值 :读取的数据
********************************************/
uchar Read_1Byte_currentaddress(void)
{
uchar temp;
start();
write1byte((deviceaddress|0x01));
if(check())
temp = read1byte();
else
return 0;
mnack();
stop();
return temp;
}
/*******************************************
函数名称:Read_NByte_currentaddress
功 能:从EEPROM的当前地址读取N个字节的数据
参 数:readbuf--指向保存数据地址的指针
n--读取数据的个数
返回值 :读取结果:1--成功,0--失败
********************************************/
uchar Read_NByte_currentaddress(uchar * readbuf,uchar n)
{
start();
write1byte((deviceaddress|0x01));
if(check())
readNbyte(readbuf,n);
else
return 0;
return 1;
}
/*******************************************
函数名称:Read_1Byte_Randomaddress
功 能:从EEPROM的指定地址读取1个字节的数据
参 数:dataaddress--数据读取的地址
返回值 :读取的数据
********************************************/
uchar Read_1Byte_Randomaddress(uchar dataaddress)
{
uchar temp;
start();
write1byte(deviceaddress);
if(check())
write1byte(dataaddress);
else
return 0;
if(check())
{
start();
write1byte((deviceaddress|0x01));
}
else
return 0;
if(check())
temp = read1byte();
else
return 0;
mnack();
stop();
return temp;
}
/*******************************************
函数名称:Read_NByte_Randomaddress
功 能:从EEPROM的指定地址读取N个字节的数据
参 数:readbuf--指向保存数据地址的指针
n--读取数据的个数
dataaddress--数据读取的首地址
返回值 :读取结果:1--成功,0--失败
********************************************/
uchar Read_NByte_Randomaddress(uchar * readbuf,uchar n,uchar dataaddress)
{
start();
write1byte(deviceaddress);
if(check())
write1byte(dataaddress);
else
return 0;
if(check())
{
start();
write1byte(deviceaddress|0x01);
}
else
return 0;
if(check())
readNbyte(readbuf,n);
else
return 0;
return 1;
}
串口握手函数
/*******************************************
函数名称:InitUART
功 能:初始化UART端口
参 数:无
返回值 :无
********************************************/
void InitUART(void)
{
P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD
ME1 |= URXE0 + UTXE0; // Enable USART0 T/RXD
UCTL0 |= CHAR; // 8-bit character
UTCTL0 |= SSEL0; // UCLK = ACLK
UBR00 = 0x03; // 32k/9600 - 3.41
UBR10 = 0x00; //
UMCTL0 = 0x4A; // Modulation
UCTL0 &= ~SWRST; // Initialize USART state machine
}
/*******************************************
函数名称:HandleConfigMenu
功 能:处理PC的配置函数
参 数:inputvalue--接收到的来自PC机的字符
返回值 :无
********************************************/
void HandleConfigMenu(uchar inputvalue)
{
uchar addr,wdata,result;
uchar hi,lo;
switch(toupper(inputvalue))
{
case \'R\':
PutString("Please send the memory address to read:");
addr = Get1Char();
Send1Char(\'>\'); Send1Char(\'n\');
result = Read_1Byte_Randomaddress(addr);
Send1Char(0x30); //屏幕显示0
Send1Char(0x78); //屏幕显示x
hi = (result & 0xf0) >> 4;
if(hi > 0x09)
{
Send1Char(0x37 + hi); //屏幕显示字母(A~F)
}
else
{
Send1Char(0x30 + hi); //屏幕显示数字
}
lo = result & 0x0f;
if(lo > 0x09)
{
Send1Char(0x37 + lo); //屏幕显示字母(A~F)
}
else
{
Send1Char(0x30 + lo); //屏幕显示数字
}
Send1Char(\'n\');
break;
case \'W\':
PutString("Please send the memory address to write:");
addr = Get1Char();
Send1Char(\'>\'); Send1Char(\'n\');
PutString("Please send the data to write:");
wdata = Get1Char();
Send1Char(\'>\'); Send1Char(\'n\');
if( Write_1Byte(wdata,addr) )
{
PutString("Write successfully!");
}
else
{
PutString("Fail to write!");
}
break;
default:
DisplayConfigMenu();
}
}
主函数
void main( void )
{
/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF1OUT = 0XFF;
P2DIR = 0XFF2OUT = 0XFF;
P3DIR = 0XFF3OUT = 0XFF;
P4DIR = 0XFF4OUT = 0XFF;
P5DIR = 0XFF5OUT = 0XFF;
P6DIR = 0XFF6OUT = 0XFF;
uchar i;
WDTCTL = WDTPW + WDTHOLD; //关狗
P6DIR |= BIT26OUT |= BIT2; //关闭电平转换
P1DIR |= BIT3 + BIT2; //设置相应端口为输出状态
P1OUT |= BIT3 + BIT2;
InitUART(); //初始化UART端口
DisplayConfigMenu();
while(1)
{
Send1Char(\'>\');
Send1Char(\'n\');
i=Get1Char();
HandleConfigMenu(i);
}
}
测试效果
测试注意:在PC机发送EEPROM内的存储地址或者是写入数据时,必须使用十六进制发送,而在发送
读写控制命令时要使用默认 的发送ASCII码的设置,这点要注意,否则操作无法完成。
通信格式:N.8.1,9600
IAR工程
【MSP430F149学习】汇总贴
|