⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eerom.c

📁 富士通单片机MB90F387上实现MODBUS
💻 C
字号:
#include "GLOBAL.H"

/***********************************************************
总空间大小: 1K    0 - 1023

EEPROM 地址分配说明:
F 参数 F0 - F255 : 地址: 0 - 511; 0 1 保存F0, 2 3保存 F1 依次类推

识别标志:  "55AA"  地址: 1001 1002 1003 1004 //当连续55AA,说明已经初始化,否则初始化。       
调整液晶显示参数:  地址: 1006  LCD_OFFSET 默认值 = 35
Modbus初始化参数: 地址:1010、1011、1012、1013
***********************************************************/

#define  SDA        PDR1_P16
#define  SDA1      { DDR1_D16 = 0; }
#define  SDA0      { DDR1_D16 = 1; PDR1_P16 = 0; }
#define  SCL1      { DDR4_D41 = 0; }
#define  SCL0      { DDR4_D41 = 1; PDR4_P41 = 0; }

#define   AT24C08       0xa0
#define   PAGE_SIZE     16

//是否第一次读写EEPROM
void init_eeprom(void)
{
    uchar   i1,i2,i3,i4; //EEPROM 初始标志
    i1 = read_eerom(1001); // '5' 从EEPROM读取识别标志
	i2 = read_eerom(1002); // '5'
	i3 = read_eerom(1003); // 'A'
	  i4 = read_eerom(1004); // 'A'
	  
	  if ( !((i1 == '5')&&(i2 == '5') &&(i3 == 'A')&&(i4 == 'A')) )
	  {
	  	write_eerom(1010, 31); //主设备地址,默认31
	  	write_eerom(1011, 0);  //MODBUS模式,默认RTU
	  	write_eerom(1012, 3);  //波特率高字节,默认9600
	  	write_eerom(1013, 0);  //数据格式,默认 8 N 1
	  	
	  		  	
			write_eerom(1001, '5'); // '5'
			write_eerom(1002, '5'); // '5'
			write_eerom(1003, 'A'); // 'A'
			write_eerom(1004, 'A'); // 'A'
			write_eerom(1006, 35);  // 35 调整液晶显示参数	
	  }
}

void wait_1uS(void)
{
    uint    i;
    for (i = 0; i < 50;i++)
	    __wait_nop();
}

void wait_ms(uint time)
{
    uint    i,j;
    for (i = 0; i < time; i++)
    {  
        for (j = 0; j < 500; j++)   __wait_nop();
     } 

}

void start_i2c(void)
{
	SDA1;
    wait_1uS();
	SCL1;
	wait_1uS();
	SDA0;
	wait_1uS();
	SCL0
}

void stop_i2c(void)
{
	SDA0;
	wait_1uS();
	SCL1;
	wait_1uS();
	SDA1;
	wait_1uS();
	SCL0;
}

void send_ack(void)
{
    SDA0;
    wait_1uS();
    SCL1;
    wait_1uS();
    SCL0;   
    wait_1uS();
}

void send_nak(void)
{
    SDA1;
    wait_1uS();
    SCL1;
    wait_1uS();
    SCL0;   
    wait_1uS();
}

uchar wait_ack(void)
{
  uint timeout;
  
  timeout = 1000;
  SDA1;
  wait_1uS();
  SCL1;
  wait_1uS();
  while (SDA)
    {
     timeout--;
     if (timeout == 0)
       {
        stop_i2c();
        return (FALSE);
        }
     }
  SCL0;
  return (TRUE);
}

void sendbyte(uint ch)
{
    uint    i;

    SCL0;
    for (i = 8; i != 0; i--)
      {
       if ((ch & 0x80) != 0) SDA1
       else SDA0;
       ch <<= 1;
       wait_1uS();
       SCL1;
       wait_1uS();
       SCL0;   
       }
}

uint recvbyte(void)
{
    uint i,result;
    
    result = 0;
    SDA1;
    for (i = 8; i != 0; i--)
      {
       result <<= 1;
       SCL0;
       wait_1uS();
       SCL1;
       wait_1uS();
       if (SDA) result |= 1;
       }
    SCL0;
    return (result);
}

void write_eerom(uint addr,uchar ch)
{
	uint	i;
	i = ((addr >> 7) & 0x6) + AT24C08;
	
    start_i2c();
    sendbyte(i);
    wait_ack();
    sendbyte(addr);
    wait_ack();
    sendbyte(ch);
    wait_ack();
    stop_i2c();
   	wait_ms(5);
}

uint read_eerom(uint addr)
{
    uint i,result;

	i = ((addr >> 7) & 0x6) + AT24C08;
    start_i2c();
    sendbyte(i);
    wait_ack();
    sendbyte(addr);
    wait_ack();

    start_i2c();
    sendbyte(i+1);
    wait_ack();
    result = recvbyte();
    send_nak();
    stop_i2c();
    return (result);
}

/*		
void read_eerom_block(uint addr,uchar *ch,uint len)
{
    uint i;
    
    if (len == 0) return;
	i = ((addr >> 0x7) & 0x6) + AT24C08;
    start_i2c();
    sendbyte(i);
    wait_ack();
    sendbyte(addr);
    wait_ack();
    start_i2c();
    sendbyte(i+1);
    wait_ack();
    for (i = len; i != 0; i--,ch++)
       {
        if (i == 1)
           {
             *ch = recvbyte();
             send_nak();
            } 
        else 
           {
            *ch = recvbyte();
             send_ack();
            }
        }
    stop_i2c();
}

void write_eerom_block(uint addr,uchar *ch,uint len)
{
    uint i,j;
    if (len == 0) return;

	while (len > 0)
	  {	
		i = ((addr >> 0x7) & 0x6) + AT24C08;
    	start_i2c();
	    sendbyte(i);
        wait_ack();
    	sendbyte(addr);
        wait_ack();
	    if (len > PAGE_SIZE)
	      {
	       len -= PAGE_SIZE;
	       j = PAGE_SIZE;
	       }
	    else
	      {	   
		   j = len;
		   len = 0;
		   } 
	    for (i = 0; i < j; i++,ch++)
    	  { 
    	   sendbyte(*ch);
           wait_ack();
           } 
	    stop_i2c();
	    addr += PAGE_SIZE;
    	wait_ms(5);
       }	
}
*/

/*******************************************************
* 名称:    save_eerom
* 功能:    保存 F 参数到EEPROM 中
* 地址范围: 0 - 511; 0 1 保存F0, 2 3保存 F1 依次类推
* 输入:    no 参数编号  p 参数值
* 输出: 
* 返回:    无
********************************************************/
void save_eerom(uchar no,uint p)
{
  	write_eerom(no+no,p & 0xff);
  	write_eerom(no+no+1,p >> 8);
}

/*******************************************************
* 名称:upload_para
* 功能:从EEPROM 中读取参数值
* 地址范围: 0 - 511; 0 1 保存F0, 2 3保存 F1 依次类推
* 输入:no 参数编号 
* 输出: 
* 返回:no 参数编号所对应的参数值
********************************************************/
uint upload_para(uchar no)
{
	uint para;
	para = read_eerom(no+no) + ((read_eerom(no+no+1))<<8);
	return(para);
}
/*
void restore_para(void)
{
	uchar i;
	uint  j;
	
	for (i = 0; i < max_para; i++)
	  {
	  	j = i + i;
	  	para[i] = read_eerom(j) + (read_eerom(j + 1) << 8);
	  }
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -