查看: 416|回复: 0
打印 上一主题 下一主题

【MSP430F149学习】22 读写EEPROM

[复制链接] qrcode

28

主题

31

帖子

94

积分

注册会员

Rank: 2

积分
94
楼主
跳转到指定楼层
发表于 2015-12-16 07:12 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


【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学习】汇总贴




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表