历史上的今天
返回首页

历史上的今天

今天是:2025年03月12日(星期三)

正在发生

2018年03月12日 | 25045操作标准子程序

2018-03-12 来源:eefocus

25045操作标准子程序

# include
# include
# define uchar unsigned char
# define uint unsigned int
 sbit SO=P1^1;/*25045输出*/
 sbit SI=P1^2;/*25045输入*/
 sbit SCK=P1^3;/*25045时钟*/
 sbit CS=P1^4;/*25045片选*/
 uchar code WREN_INST=0X06;
 /* Write enable latch instruction (WREN)*/
 uchar code WRDI_INST=0X04;
 /* Write dISAble latch instruction (WRDI)*/
 uchar code WRSR_INST=0X01;
 /* Write status register instruction (WRSR)*/
 uchar code RDSR_INST=0X05;
 /* Read status register instruction (RDSR)*/
 uchar code WRITE_INST=0X02;
 /* Write memory instruction (WRITE)*/
 /*写入25045的先导字,应当为0000A010,其中的A为写入25045的高位地址
 将此WRITE_INST和写入高位地址相或后即为正确的写先导字*/
 uchar code READ_INST=0X03;
 /* Read memory instruction (READ)*/
 /*读出25045的先导字,应当为0000A011,其中的A为读出25045的高位地址
 将此READ_INST和读出高位地址相或后即为正确的读先导字*/
 uint code BYTE_ADDR=0X55;
 /* Memory address for byte mode operations*/
 uchar code BYTE_DATA=0X11;
 /*Data byte for byte write operation*/
 uint  code PAGE_ADDR=0X1F;
 /* Memory address for page mode operations*/
 /*页面写入的其始地址*/
 uchar code PAGE_DATA1=0X22;
 /* 1st data byte for page write operation*/
 uchar code PAGE_DATA2=0X33;
 /* 2nd data byte for page write operation*/
 uchar code PAGE_DATA3=0X44;
 /* 3rd data byte for page write operation*/
 uchar code STATUS_REG=0X20;
 /* Status register,设置DOG时间设置为200毫秒,无写保护*/
 /*这是状态寄存器的值,他的意义在于第5,第4位为WDI1,WDI0代表DOG的时间,00为1.4秒,01为600毫秒,10为200毫秒,00为disabLED
 第3位和第2位为BL1,BL0,是写保护设置位,00为无保护,01为保护180-1FF,10为保护100-1FF,11为保护000-1FF.第1位为WEL,
 当他为1时代表已经"写使能"设置了,现在可以写了,只读位.第0位为WIP,当他为1时代表正在进行写操作,是只读*/
 uchar code  MAX_POLL=0x99;
 /* Maximum number of polls*/
 /*最大写过程时间,确定25045的最大的写入过程的时间*/
 uchar code INIT_STATE=0x09;
 /* Initialization value for control ports*/
 uint code SLIC=0x30;
 /* Address LOCation of SLIC*/
 void wren_cmd(void);/*写使能子程序*/
 void wrdi_cmd(void);/*写使能复位*/ 
 void wrsr_cmd(void);/*复位时间位和数据保护位写入状态寄存器*/ 
 uchar rdsr_cmd(void);/*读状态寄存器*/
 void byte_write(uchar aa,uint dd);/*字节写入,aa为写入的数据,dd为写入的地址*/
 uchar byte_read(uint dd);/*字节读出,dd为读出的地址,返回读出的数据*/
 void page_write(uchar aa1,uchar aa2,uchar aa3,uchar aa4,uint dd);/*页写入*/
 void sequ_read(void);/*连续读出*/ 
 void rst_wdog(void);/*DOG复位*/
 void outbyt(uchar aa);/*输出一个字节到25045中,不包括先导字等*/
 uchar inputbyt();/*由25045输入一个字节,不包括先导字等额外的东西*/ 
 void wip_poll(void);/*检查写入过程是否结束*/
 
 
/*25045操作子程序集*/
/*;*******************************************************
*
;* Name: WREN_CMD
;* Description: Set write enable latch
;* Function: This routine sends the command to enable writes to the EEPROM memory array or
;* status register
;* Calls: outbyt
;* Input: None
;* Outputs: None
;* Register Usage: A
;*****************************************************
*/
/*写使能子程序*/
void wren_cmd(void)
{
 uchar aa;
 SCK=0;/* Bring SCK low */
 CS=0;/* Bring /CS low */
 aa=WREN_INST;
 outbyt(aa);/* Send WREN instruction */
 SCK=0;/* Bring SCK low */
 CS=1;/* Bring /CS high */
}

/*;***********************************************************
*
;* Name: WRDI_CMD
;* Description: Reset write enable latch
;* Function: This routine sends the command to disable writes to the EEPROM memory array or
;* status register
;* Calls: outbyt
;* Input: None
;* Outputs: None
;* Register Usage: A
;***********************************************************
*/
/*写使能复位子程序*/
void wrdi_cmd(void)
{
 uchar aa;
 SCK=0;/* Bring SCK low */
 CS=0;/* Bring /CS low */
 aa=WRDI_INST;
 outbyt(aa);/* Send WRDI instruction */
 SCK=0;/* Bring SCK low */
 CS=1;/* Bring /CS high */
}


/*;********************************************************
*
;* Name: WRSR_CMD
;* Description: Write Status Register
;* Function: This routine sends the command to write the WD0, WD1, BP0 and BP0 EEPROM
;* bits in the status register
;* Calls: outbyt, wip_poll
;* Input: None
;* Outputs: None
;* Register Usage: A
;********************************************
*/
/*写状态寄存器子程序*/
void wrsr_cmd(void)
{
 uchar aa;
 SCK=0;/* Bring SCK low */
 CS=0;/* Bring /CS low */
 aa=WRSR_INST;
 outbyt(aa) ;/* Send WRSR instruction */
 aa=STATUS_REG;
 outbyt(aa);/* Send status register */
 SCK=0;/* Bring SCK low */
 CS=1;/* Bring /CS high */
 wip_poll();/* Poll for completion of write cycle */
}

/*;*************************************************************
*
;* Name: RDSR_CMD
;* Description: Read Status Register
;* Function: This routine sends the command to read the status register
;* Calls: outbyt, inputbyt
;* Input: None
;* Outputs: A = status registerXicor Application Note AN21
;* Register Usage: A
;*******************************************************
*/
/*读状态寄存器,读出的数据放入到aa中*/
uchar rdsr_cmd (void)
{
 uchar aa;
 SCK=0;
 CS=0;
 aa=RDSR_INST;
 outbyt(aa);
 aa=inputbyt();
 SCK=0;
 CS=1;
 return aa;
}

/*;*******************************************************
*
;* Name: BYTE_WRITE
;* Description: Single Byte Write
;* Function: This routine sends the command to write a single byte to the EEPROM memory
array
;* Calls: outbyt, wip_poll
;* Input: None
;* Outputs: None
;* Register Usage: A, B
;**********************************************************
*/

/*字节写入,aa为写入的数据,dd为写入的地址,对于25045而言为000-1FF*/
void byte_write(aa,dd)
uchar aa;
uint dd;
{
 SCK=0;
 CS=0;
 outbyt((((uchar)(dd-0XFF))<<3)|WRITE_INST);/* Send WRITE instruction including MSB of address */
 /*将高位地址左移3位与写入先导字相或,得到正确的先导字写入25045*/
 outbyt((uchar)(dd));
 /*输出低位地址到25045*/
 outbyt(aa);
 /*写入数据到25045的对应单元*/
 SCK=0;
 CS=1;
 wip_poll();
 /*检测是否写完*/
}


/*;********************************************************
*
;* Name: BYTE_READ
;* Description: Single Byte Read
;* Function: This routine sends the command to read a single byte from the EEPROM memory
array
;* Calls: outbyt, inputbyt
;* Input: None
;* Outputs: A = read byte
;* Register Usage: A, BXICor Application Note AN21
;********************************************************
*/
/*字节读出,其中dd为读出的地址,返回的值为读出的数据*/
uchar byte_read(dd)
uint dd;
{
 uchar CC;
 SCK=0;
 CS=0;
 outbyt((((uchar)(dd-0XFF))<<3)|READ_INST);/* Send READ_INST instruction including MSB of address */
 /*将高位地址左移3位与读出先导字相或,得到正确的先导字写入25045*/
 outbyt((uchar)(dd));
 /*输出低位地址到25045*/
 cc=inputbyt();/*得到读出的数据*/
 SCK=0;
 CS=1;
 return cc;
}


/*;**********************************************
*
;* Name: PAGE_WRITE
;* Description: Page Write
;* Function: This routine sends the command to write three consecutive bytes to the EEPROM
;* memory array using page mode
;* Calls: outbyt, wip_poll
;* Input: None
;* Outputs: None
;* Register Usage: A, B
;*****************************************************
*/
/*页面写入,其中aa1,aa2,aa3,aa4为需要写入的4个数据(最大也就只能一次写入4个字,dd为写入的首地址*/
void page_write(aa1,aa2,aa3,aa4,dd)
uchar aa1,aa2,aa3,aa4;
uint dd;
{
 SCK=0;
 CS=0;
 outbyt((((uchar)(dd-0XFF))<<3)|WRITE_INST);/* Send WRITE instruction including MSB of address */
 /*将高位地址左移3位与写入先导字相或,得到正确的先导字写入25045*/
 outbyt((uchar)(dd));
 /*写入低位地址到25045*/
 outbyt(aa1);
 /*写入数据1到25045的对应单元*/
 outbyt(aa2);
 /*写入数据2到25045的对应单元*/
 outbyt(aa3);
 /*写入数据3到25045的对应单元*/
 outbyt(aa4);
 /*写入数据4到25045的对应单元*/
 SCK=0;
 CS=1;
 wip_poll();
}


/*;********************************************
*
;* Name: SEQU_READ
;* Description: Sequential Read
;* Function: This routine sends the command to read three consecutive bytes from the EEPROM
;* memory array using sequential mode
;* Calls: outbyt, inputbyt
;* Input: None
;* Outputs: A = last byte read
;* Register Usage: A, B
;*********************************************************
*/
/*连续读出,由于函数的返回值只能为1个,对于连续读出的数据只能使用指针作为函数的返回值才能做到返回一系列的数组*/
/*sequ_read:*/
unsigned int *page_read(n,dd)
uchar n;/*n是希望读出的数据的个数,n<=11*/ 
unsigned int dd;/*dd是读出数据的首地址*/
{
 uchar i;
 uchar pp[10];
 unsigned int *pt=pp;
 SCK=0;
 CS=0;
 outbyt((((uchar)(dd-0XFF))<<3)|READ_INST);
 for (i=0;i {
   pp[i]=inputbyt();
 }
 return (pt);
}
/*调用的方法如下*/
/*unsigned int *p;*/
/*p=page_read(4,100);*/
/*a=*(p)*/  
/*b=*(p+1)*/
/*c=*(p+2)*/
/*d=*(p+3)*/
/*abcd中存放25045中由100地址开始的4个数据*/
 /* Send WRITE */
/*mov DPTR, #PAGE_ADDR ; Set address of 1st byte to be read
clr sck ; Bring SCK low
clr cs ; Bring /CS low
mov A, #READ_INST
mov B, DPH
mov C, B.0
mov ACC.3, C
lcall outbyt ; Send READ instruction with MSB of address
mov A, DPL
lcall outbyt ; Send low order address byte
lcall inputbyt ; Read 1st data byte
lcall inputbyt ; Read 2nd data byte
lcall inputbyt ; Read 3rd data byte
clr sck ; Bring SCK low
setb cs ; Bring /CS high
ret*/
/*;*******************************************************
*
;* Name: RST_WDOG
;* Description: Reset Watchdog Timer
;* Function: This routine resets the watchdog timer without sending a command
;* Calls: None
;* Input: None
;* Outputs: None
;* Register Usage: None
;***************************************************
*/
/*复位DOG*/
void rst_wdog (void)
{
 CS=0;
 CS=1;
}

/*;******************************************************
*
;* Name: WIP_POLL
;* Description: Write-In-Progress Polling
;* Function: This routine polls for completion of a nonvolatile write cycle by examining the
;* WIP bit of the status register
;* Calls: rdsr_cmdXicor Application Note AN21
;* Input: None
;* Outputs: None
;* Register Usage: R1, A
;**************************************************
*/
/*检测写入的过程是否结束*/
void wip_poll(void)
{
 uchar aa;
 uchar idata my_flag;
 for (aa=1;aa>MAX_POLL;aa++)
 {
  my_flag=rdsr_cmd();

  if ((my_flag&&0x01)==0) {aa=MAX_POLL;}/*判断是否WIP=0,即判断是否写入过程已经结束,若结束就跳出,否则继续等待直到达到最大记数值*/
 }
}



/*;*******************************************************
*
;* Name: OUTBYT
;* Description: Sends byte to EEPROM
;* Function: This routine shifts out a byte, starting with the MSB, to the EEPROM
;* Calls: None
;* Input: A = byte to be sent
;* Outputs: None
;* Register Usage: R0, A
;**********************************************************
*/
/*输出一个数据到25045,此数据可能为地址,先导字,写入的数据等*/
void outbyt(aa)
uchar aa;
{
 uchar my_flag1,i;
 for (i=0;i>7;i++)
 {
   my_flag1=aa;
   SCK=0;
   SI=(my_flag1>>i);
   SCK=1;
 }
 SI=0;/*使SI处于确定的状态*/ 
}


/*;***************************************************
*
;* Name: INPUTBYT
;* Description: Recieves byte from EEPROM
;* Function: This routine recieves a byte, MSB first, from the EEPROM
;* Calls: None
;* Input: None
;* Outputs: A = recieved byte
;* Register Usage: R0, A
;*******************************************************
*/
/*得到一个数据,此数据可能为状态寄存器数据,读出的单元数据等*/
uchar inputbyt(void)
{
 uchar aa,my_flag;
 char i;
 for (i=7;i<0;i--)
 {
   SCK=0;
   my_flag=(uchar)(SO);
   SCK=1;
   aa=(aa||(my_flag<   my_flag=0x00;
 }
 return aa;
}


推荐阅读

史海拾趣

AUREL公司的发展小趣事

AUREL公司深知人才是企业发展的核心动力。因此,公司一直注重人才的引进和培养。通过与高校和研究机构的合作,公司吸引了大批优秀的研发人才和管理人才。同时,公司还建立了完善的人才激励机制和培训体系,为员工提供了广阔的职业发展空间。这些举措使得AUREL公司的人才队伍不断壮大,为公司的持续发展提供了有力保障。

Fukushima Futaba Electric Co Ltd公司的发展小趣事

近年来,全球电子行业面临着诸多挑战,包括技术更新换代迅速、市场竞争加剧等。Futaba Electric积极应对这些挑战,不断加大研发投入,推出了一系列具有创新性和竞争力的新产品。同时,公司还注重与上下游产业链的合作与协同,通过整合资源、优化流程等方式降低成本、提高效率。此外,Futaba Electric还积极响应环保政策,推动绿色制造和可持续发展。这些努力使得公司在面对挑战时依然能够保持稳健的发展态势。

超霸(GP)公司的发展小趣事

绿索超容在追求经济效益的同时,始终不忘履行社会责任。公司积极响应国家绿色发展的号召,致力于环保事业和可持续发展。在产品研发和生产过程中,绿索超容始终坚持绿色、低碳、环保的理念,采用环保材料和工艺,减少对环境的影响。此外,公司还积极参与社会公益活动,为社会贡献自己的力量。这些举措不仅提升了绿索超容的企业形象,也为其在电子行业中树立了良好的口碑。

东软载波(EastSoft)公司的发展小趣事

随着市场的不断变化和技术的不断发展,东软载波始终保持对技术创新的重视。公司不断投入研发资源,相继开发出窄带低速、窄带高速、宽带低速、宽带高速等系列电力载波通信芯片,产品性能持续提升。同时,公司还形成了支撑电力线载波通信系统的三大重点核心技术,包括电力线通信网络与数据交换技术、电力线高精度同步和速率自适应扩频通信技术等。这些技术的突破使东软载波在行业中保持领先地位。

FlexiPanel公司的发展小趣事

在追求经济效益的同时,FlexiPanel也高度重视企业的社会责任和环保问题。公司积极响应国家节能减排政策,致力于推广绿色制造和可持续发展理念。在产品设计、生产、包装等各个环节中,FlexiPanel都采取了环保措施,减少了对环境的影响。此外,公司还积极参与公益事业和社会活动,为社会和谐发展贡献了自己的力量。

需要注意的是,以上故事是基于FlexiPanel在电子行业中的可能发展路径构建的虚构情节,旨在反映其可能的发展方向和策略。由于具体信息可能因企业实际情况和市场环境变化而有所不同,因此以上内容仅供参考。

芯朋微电子(chipown)公司的发展小趣事

随着公司业务的不断发展,芯朋微电子开始布局国际市场。公司积极寻求与国际知名企业的合作,引进先进技术和管理经验,提升自身竞争力。同时,公司也加强了对海外市场的研究和拓展,努力将产品推向全球市场。

问答坊 | AI 解惑

为什么MC52i经常读不到短信?

使用mc52i,每隔半小时通过向服务器传送一个UDP数据包,同时服务器也向mc52i发送短信,但是使用AT+CMGR指令,经常读取不到短信。 有没有做过类似工作的朋友帮帮忙,已经调试了几天了,问题依然存在…

查看全部问答>

做过GRPS数据传输的请进!!!!!!!

第一次做GPRS数据传输,用的是华为的GTM900B。希望各位能给个AT指令建立连接,传输数据的例子。 邮箱:amarantine33520@163.com 不胜感激!!!!!!!…

查看全部问答>

刚毕业的大学生去东软总部(沈阳)做嵌入式开发适合吗?

刚毕业的大学生去东软总部(沈阳)做嵌入式开发适合吗?请回答我!!!…

查看全部问答>

问下各位大哥大姐,platform builder 中的仿真器是否可以用模拟器来完成仿真?

问下各位大哥大姐,platform builder 中的仿真器是否可以用模拟器来完成仿真? 拜托了…

查看全部问答>

低功耗单片机选型 求帮助

想找一个低功耗单片机, 要求:         一块700MAh的一次性电池 能连续工作5年(4万小时) 单片机只用来显示时间。   请问高手,有没有这样一款单片机或FPGA 谢谢…

查看全部问答>

LM3S 12864驱动问题

void S12864_SysCtl_Init(void) {         SysCtlPeripheralEnable(S12864_PERIPH);         GPIODirModeSet(S12864_PORT,S12864_SCLK_PIN|S12864_CS_PIN|S12864_SID_PIN,GPIO_DIR_MODE_OUT);   ...…

查看全部问答>

只有一个定时器的430,能否输出PWM的同时还能定时中断干其他活?

只有一个定时器的430,能否输出PWM的同时还能定时中断干其他活? 比如系统输出30K的PWM波形,同时还能有0.5秒的定时中断去执行其它任务。 大大能否贴个简单的代码指导一下啊?…

查看全部问答>

为什么没有产生pwm呢

#include \"msp430.h\" typedef unsigned char uchar; typedef unsigned int  uint; uchar flag; uchar table[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,\\ 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38 ...…

查看全部问答>

【NXP Rapid IoT评测】+ 开发套件展示及硬件熟悉

【一】初识套件: 今天收到了论坛寄来的NXP Rapid IOT开发套件,首先展示一下套件的外形,套件开箱之后需要使用Micro USB连接电脑进行充电,上电后可通过四个触摸按键进行翻页,四个独立按键进行设置。包装图片: 打开包装后里面包括套件、快速开 ...…

查看全部问答>

Power的 PCB Layout 问题

本帖最后由 bluefox0919 于 2019-5-9 13:27 编辑 这是某款Power的局部Layout,没有做过大Power所以看到有些不懂想请问。 蓝色是Bottom Layer,粉紫色Bottom Solder。 PG是地、Vbus是大电压电流点 问题点是: 1为什么Bottom Solder不要直接铺成 ...…

查看全部问答>