x5045
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
监控芯片X5045的应用
作者:杜洋
2005-10-13
X5045是一种3合1功能监控芯片,其具有EEPROM、电压跌落检测、看门狗复位。
用SPI总线与处理器通信,是兼有储存监测的单片机系统的最佳选择。
X5045的特性如下:
·支持MOTOROLA推出的SPI总线协议
·可选复位时间的看门狗定时器
·电源电压跌落检测和复位控制
·5种标准的开始复位电压
·当电源电压为1V时仍可保证复位输出
·多种芯片选择不同的工作电压
·内置4Kbit的EEPROM,可擦写100万次
·EEPROM数据可全部或分区保护
·硬件及指令写保护,使数据更安全
·时钟可达3.3MHZ
·读写速度快,16字节的页写入
·经典写周期为5mS
·商用级温宽为0~70摄氏度,工业级温宽为-40~84摄氏度
·16字节的页写入模式
·复位信号输出可保持200MS
X5045接口说明:
1-CS/WDI使能及看门狗复位输入
2-SO数据输出(可与SI复用)
3-WP写保护(低电平保护)
4-Vss参考0电位
5-SI数据输入
6-SCK时钟输入
7-RESET复位信号输出(必须接上接电阻)
8-Vcc电源电压
X5045与单片机接口电路:
通信协议:
在每一次通信之前都必须输入2个字节的操作数据。
其中有9位是操作地址位,3位功能选择位。
操作位在第5到第7个时钟脉冲输入,地址位在第4个脉冲为最高地址,第8到第23个时钟脉冲输入由高到低的8位地址数据。
地址结构为:
“0 0 0 0 A8 M2 M1 M0 A7 A6 A5 A4 A3 A2 A1 A0”(A为地址,M为功能)。
其第1个字节的功能选择表如下:
读数据操作:
写数据操作:
状态寄存器的说明:
X5045内置一个状态寄存器,用于设置看门狗和数据锁存。
其为8位数据,有单独的功能操作数据。
当读写状态寄存器时地址位数据就成为状态寄存器的数据镜像。
其数据结构如下:
(MSB) 7 6 5 4 3 2 1 0 (LSB)
0 0 WD1 WD0 BL1 BL0 WEL WIP
7、6两位必须是0。
WD1、WD0是看门狗定时器复位时间选择,WD1、WD0为0、0表示1.4秒看门狗复位溢出。
0、1表示600毫秒溢出。
1、0表示200毫秒溢出。
1、1表示禁用看门狗。
BL1、BL0是数据分区保护选择,BL1、BL0为0、0时无保护,0、1时保护180H~1FFH;1、0时保护100H~1FFH;1、1时保护000H~1FFH。
WEL是写保护位,为0禁写,为1可写。
(运行一次芯片读写操作后此位自动置0)
WIP是芯片读忙位,为0就绪,为1芯片忙。
(进行读写操作前最好先读此位)
注意:读写前先令WEL=1。
一次写EEPROM不得超过16字节(一页)。
RESET必须接上接电阻。
CS下沿复位看门狗。
X5045接口程序的编写:
/*-------------------------------------------
项目名:接口子程序块
程序名:X5045子程序块
编写人:杜洋
初写时间:2005年10月12日
程序功能:实现监控芯片X5045的SPI总线驱动
实现方法:CPU处理
CPU说明:MCS-51
接口说明:1-CS/WDI 2-SO(SI) 3-WP(H) 4-Vss 5-SI(SO) 6-SCK 7-RESET 8-Vcc
信息说明:
-------------------------------------------*/
;****************************************************************************** ********
;===X5045驱动子程序块===
;占用资源:占用4个I/O口(其中SO/SI和SCK可复用,WP可不用),占用2DH~30H 的4个通用寄存器。
;****************************************************************************** ********
CS BIT P2.4 ;芯片使能(低电平有效)
SI BIT P2.3 ;数据输入(可以和SO复用)
SCK BIT P2.2 ;时钟输入
SO BIT P2.3 ;数据输出
WP BIT P2.1 ;写保护(低电平有效,可由硬件控制)
WREN_INST EQU 06H ;写允许命令字(WREN)
WRDI_INST EQU 04H ;写禁止命令字(WRDI)
WRSR_INST EQU 01H ;写状态寄存器命令字(WRSR)
RDSR_INST EQU 05H ;读状态寄存器命令字(RDSR)
WRITE_INST EQU 02H ;写存储器命令字(WRITE)
READ_INST EQU 03H ;读存储器命令字(READ)
MAX_POLL EQU 99H ;测试的最大次数
WDT200 EQU 90H ;WD1 WD0=01
WDT600 EQU 0A0H;WD1 WD0=10
WDT1400 EQU 80H ;如果最高位是1代表设置看门狗WD1 WD0 =00
NOWDT EQU 0B0H;WD1 WD0=11
PROQTR EQU 04H ;BL1 BL0=01保护区域为高128字节
PROHALF EQU 08H ;BL1 BL0=10写保护区域为高256字节
PROALL EQU 0CH ;BL1 BL0=11写保护区域为整个存储器
NOPRO EQU 00H ;如果最高位是0,代表设置保护区域BL1 BL0=00,不写保护
;****************************************************************************** *********
MTD EQU 30H ;发送数据缓冲区
MRD EQU 30H ;接收数据缓冲区
NUMBYT EQU 2FH ;传送字节数存放单元
STATBYT EQU 2FH ;状态字节存放单元
DATAADDR EQU 2DH ;该单元及DATAADDR+1是待操作的EEPROM的地址单元,该位存入高1位地址,ADDRDATA+1单元存入低8位地址
;****************************************************************************** ************
;名称:写数据(将数据缓冲区的数据写入指定的地址)
;描述:MTD指定数据缓冲区首地址,NUMBYT指定字节数,DATAADDR及DATAADDR+1指定被写器件地址
;注意事项:不允许跨页
;占用资源:R0,R1,A,B
;输入特性:就绪
;输入:NUMBYT(写入的字节数);DATAADDR/DATAADDR+1(被写器件地址);并将数据送入MTD;
;输出特性:数据写完,全部存储单元写保护
;输出:(无)
;****************************************************************************** ************
WRITE_DATA:
MOV R0,#DATAADDR ;地址单元的高8位
MOV A,@R0
MOV DPH,A
INC R0
MOV A,@R0
MOV DPL,A
MOV R1,NUMBYT ;从传送字节数存元中获取待写字节数
MOV R0,#MTD ;待写数据缓冲区
W_L:
SETB WP ;硬件写允许
CALL Write_Able ;写允许
CLR SCK ;将SCK拉低
CLR CS ;将/CS拉低
MOV A, #WRITE_INST
MOV B, DPH
MOV C, B.0
MOV ACC.3, C
LCALL Write_EEPROM ;送出含有地址最高位的写指令
MOV A, DPL
LCALL Write_EEPROM ;送出地址的低8位
MOV A, @R0
LCALL Write_EEPROM ;送出数据
CLR SCK ;将SCK拉低
SETB CS ;升高/CS
LCALL Read_Busy ;测试是否已器件内部是否写完
INC DPL
INC R0
DJNZ R1,W_L
MOV STATBYT,#PROALL ;状态存放单元
CALL SET_STATUS ;整个存储器均被保护
RET
;****************************************************************************** ************
;名称:读数据(把指定地址单元中的数据读入数据缓冲区)
;描述:MRD指定数据缓冲区首地址,NUMBYT指定字节数,DATAADDR及DATAADDR+1指定被写器件地址
;使用资源:B,R0,DPTR
;注意事项:不允许跨页
;输入特性:就绪
;输入:NUMBYT(读入的字节数);DATAADDR/DATAADDR+1(被读器件地址);
;输出特性:数据读完,存储单元写保护
;输出:并将数据存入MTD
;****************************************************************************** ************
READ_DATA:
MOV R0,#DATAADDR ;地址单元的高8位
MOV DPH,A
INC R0
MOV A,@R0
MOV DPL,A
MOV R1,NUMBYT ;从传送字节数存元中获取待写字节数
MOV R0,#MRD ;待读数据缓冲区
R_L:
CLR SCK ; 将SCK拉低
CLR CS ; 将/CS拉低
MOV A, #READ_INST
MOV B, DPH
MOV C, B.0
MOV ACC.3, C
LCALL Write_EEPROM ; 送出含有地址最高位的读指令
MOV A, DPL
LCALL Write_EEPROM ;送出低8位地址
LCALL Read_EEPROM ; 读数据
CLR SCK ; 将SCK拉低
SETB CS ;升高/CS
MOV @R0,A
INC R0
INC DPL
DJNZ R1,R_L
RET
;****************************************************************************** *************
;名称;SET_STATUS(状态寄存器设置)
;7 6 5 4 3 2 1 0
;0 0 WD1 WD0 BL1 BL0 WEL WIP
;注意事项:如果需要设置保护和看门狗,需分两次进行
;占用资源:R0,R1,A,B
;输入:设置STATBYT传递参数,共8个预定义常量(详见初定义)
;输出:(无)
;****************************************************************************** *************
Set_Status:
CALL Write_Able ;写允许
CALL Read_Status ;读当前寄存器的状态,在A中
MOV B,A ;存入B
MOV A,STATBYT ;读入参数
JB ACC.7,SET_WDT ;如果最高位是1则转设置看门狗
MOV C,ACC.2 ;否则是设置保护区域
MOV C,ACC.3
MOV B.3,C
JMP WRITE_STATUS
SET_WDT:
MOV C,ACC.4
MOV B.4,C
MOV C,ACC.5
MOV B.5,C
WRITE_STATUS:
CLR SCK ;将SCK拉低
CLR CS ;将/CS拉低
MOV A, #WRSR_INST
LCALL Write_EEPROM ;送出WRSR 指令
MOV A, B
LCALL Write_EEPROM ;送出状态寄存器的状态
CLR SCK ;将SCK拉低
SETB CS ;升高/CS
LCALL Read_Busy ;测试是否已器件内部是否写完
RET
;****************************************************************************** *************
;名称:Write_Able(写允许)
;功能:这段程序发送命令允许写存储器单元和状态寄存器
;调用子程序:Write_EEPROM
;输入:(无)
;输出:(无)
;占用资源:A
;****************************************************************************** *************
Write_Able:
CLR SCK ;将SCK拉低
CLR CS ;将/CS 拉低
MOV A, #WREN_INST
LCALL Write_EEPROM ;送出WREN_INST指令
CLR SCK ;将SCK拉低
SETB CS ;将/CS 升高
RET
;****************************************************************************** *************
;名称:Write_Enable(写禁止)
;功能:这段程序发送命令禁止对存储单元和状态寄存器写
;调用子程序:Write_EEPROM
;输入:(无)
;输出:(无)
;占用资源:A
;****************************************************************************** *************
Write_Enable:
CLR SCK ;将SCK拉低
CLR CS ;将/CS拉低
MOV A, #WRDI_INST
LCALL Write_EEPROM ;送出WRDI指令
CLR SCK ;将SCK拉低
SETB CS ;升高/CS
RET
;****************************************************************************** *************
;名称:Read_Status(读状态寄存器)
;功能:本程序发送命令用以读状态寄存器
;调用子程序:Write_EEPROM, INBYT
;输入:(无)
;输出:状态寄存器存入A中
;寄存器使用:A
;****************************************************************************** *************
Read_Status:
CLR SCK ;将SCK拉低
CLR CS ;将/CS拉低
MOV A, #RDSR_INST
LCALL Write_EEPROM ;发送RDSR 指令
LCALL Read_EEPROM ;读状态寄存器
CLR SCK ;将SCK拉低
SETB CS ;升高/CS
RET
;****************************************************************************** *************
;名称:Reset_WTD(复位看门狗定时器)
;功能:这段程序用来复位看门狗定时器,不发送命令
;使用方法:可以用定时器产生复位看门狗信号,小于200MS都可以用
;调用子程序:无
;输入:(无)
;输出:(无)
;占用资源:(无)
;****************************************************************************** *************
Reset_WTD:
CLR CS ;将/CS 拉低
SETB CS ;将/CS 升高
RET
;****************************************************************************** *************
;名称:Read_Busy(器件内部忙碌检查)
;功能:本程序通过检查WIP位来确定X5045内部编程是否结束
;子程序调用:Read_status
;输入:(无)
;输出:(无)
;占用资源:R3, A
;****************************************************************************** *************
Read_Busy:
MOV R3, #MAX_POLL ;设置用于偿试的最大次数
Read_Busy1:
LCALL Read_status ;读状态寄存器
JNB ACC.0, Read_Busy2;如果WIP 位是'0' 说明内部的写周期完成了
DJNZ R3, Read_Busy1 ;如果WIP 位是'1'说明内部写周期还没有完成
Read_Busy2:
RET
;****************************************************************************** *************
;名称:Write_EEPROM(将一个字节送到EEPROM)
;功能:本段程序移位送出一个字节,从最高位开始送PROM
;调用子程序:(无)
;输入:待写的字节放A中
;输出:(无)
;占用资源:R2, A
;****************************************************************************** *************
Write_EEPROM:
MOV R2, #08 ;设置位计数(共8位)
Write_EEPROM1:
CLR SCK ;将SCK拉低
RLC A ;带进位位的左移位
MOV SI, C ;送出进位位
SETB SCK ;将SCK 升高
DJNZ R2, Write_EEPROM1 ;循环8次
CLR SI ;将SI置于已知的状态
RET
;****************************************************************************** *************
;名称:Read_EEPROM(从EEPROM中接收数据)
;功能:这段程序从EEPROM中接收数据,高位在先
;调用子程序:(无)
;输入:(无)
;输出:接收到的数据送A中
;寄存器使用:R2, A
;****************************************************************************** *************
Read_EEPROM:
MOV R2, #08 ;设置计数(共8位)
Read_EEPROM1:
SETB SCK ;将SCK 升高
CLR SCK ;将SCK拉低
MOV C, SO ;将输出线的状态读到进位位
RLC A ;带进位位的循环左移
DJNZ R2, Read_EEPROM1 ;循环8次
RET
;****************************************************************************** *************
;X5045芯片驱动子程序块结束
;****************************************************************************** *************。