|
x5045 c程序
//X5045.H
#ifndef X5045_h #define X5045_h
#define WDT1_4 0x00; #define WDT600 0x10; #define WDT200 0x20; #define WDTDIS 0x30;
//BIT sbit B_CS5045=P2^0; sbit B_SO5045=P2^1; sbit B_SCLK5045=P2^3; sbit B_SI5045=P2^2;
extern unsigned char data tcX5045;
void RstWDT(void); void WrB5045(unsigned char,unsigned char) reentrant; //写入单字节数据 unsigned char RdB5045(unsigned char); //读出单字节数据 void byteout(unsigned char); //向5045输出单字节 void wip_chk(void); //等待5045结束内部写周期 unsigned char rdsr(void); //5045状态寄存器读出程序 unsigned char bytein(void); //从5045读出一字节数据 unsigned char readx(void); //读地址,地址位于100h void wrsr(unsigned char); //5045状态寄存器写入程序 void wren(void); //写允许 void wrdi(void); //写禁止
#endif
/* X5045/3 读写驱动 */
#include <reg51.h> #include "X5045.h"
//复位看门狗 void RstWDT() { B_CS5045=0; B_CS5045=1; }
//向X5045写入单字节数据 //输入:x,待写数据,address,写入数据的地址 void WrB5045(unsigned char x,unsigned char address) reentrant //数据,地址 { wren(); B_SCLK5045=0; B_CS5045=0; byteout(0x2); //write byteout(address); byteout(x); B_SCLK5045=0; B_CS5045=1; wip_chk(); wrdi(); }
//从X5045读入单字节数据 //输入:address,待读数据地址 //返回:读出的数据 unsigned char RdB5045(unsigned char address) { unsigned char data x; B_SCLK5045=0; B_CS5045=0; byteout(0x3); //read 000h byteout(address); x=bytein(); B_SCLK5045=0; B_CS5045=1; return (x); }
//向X5045输出单字节 void byteout(unsigned char x) { unsigned char data i,j; j=128; for(i=0;i<8;i++) { B_SCLK5045=0; B_SI5045=x/j; B_SCLK5045=1; x%=j; j/=2; } B_SI5045=0; }
//等待X5045结束内部写周期 void wip_chk() { unsigned char data dat; tcX5045=0; do { dat=rdsr(); dat&=0x1; if(tcX5045>=5) break; } while(dat); }
//5045状态寄存器读出程序 unsigned char rdsr() { unsigned char data dat; B_SCLK5045=0; B_CS5045=0; byteout(5); dat=bytein(); B_SCLK5045=0; B_CS5045=1; return (dat); }
//从X5045读出一字节数据 unsigned char bytein() { unsigned char data i,x; x=0; for (i=0;i<8;i++) { B_SO5045=1; B_SCLK5045=1; B_SCLK5045=0; if (B_SO5045) x=x+x+1; else x<<=1; } return(x); }
//5045状态寄存器写入程序 void wrsr(unsigned char x) { wren(); B_SCLK5045=0; B_CS5045=0; byteout(1); //wrsr byteout(x); B_SCLK5045=0; B_CS5045=1; wip_chk(); wrdi(); }
//写允许 void wren() { B_SCLK5045=0; B_CS5045=0; byteout(6); B_SCLK5045=0; B_CS5045=1; }
//写禁止 void wrdi() { B_SCLK5045=0; B_CS5045=0; byteout(4); B_SCLK5045=0; B_CS5045=1; }
x5045c驱动程序
//*******************X5045 DRIVE************************** //X5045.H //#include <absacc.h> //#include <intrins.h> #include <reg52.h> #define byte unsigned char #define N_NOP _nop_();//_nop_();_nop_();_nop_();_nop_(); ////////////////////////////////////////////////////////////////// //x5045 ////////////////////////////////////////////////////////////////// //DEFINE
#define WRSR_INIT 0X01 //写状态寄存器指令; #define WRITE_INIT 0X02 //写数据指令; #define READ_INIT 0X03 //读数据指令; #define WRDI_INIT 0X04 //禁止写操作指令; #define RDSR_INIT 0X05 //读状态寄存器指令; #define WREN_INIT 0X06 //允许写操作指令; #define WAIT_TIMES 200 //等待时间常数;
sbit SO =P2^4; sbit SI =P2^5; sbit SCK =P2^6; sbit CS =P2^7;
///////////////////////////////////////////////////////////////// //函数声明;PROPERTY void wren_cmd(void); //允许写操作指令函数; void write(byte dt); //写一个字节数据函数; byte read(void); //读一个字节数据函数; byte read_state(void); //读状态控制字函数; void write_state(byte dt); //写状态控制字函数; void read_nbyte( bit bA8, //读n个字节数据函数; byte adr_L, byte n, byte *adr); void write_nbyte(bit bA8, //写n个字节数据函数; byte adr_L, byte n, byte *adr); void wait_end(byte run_times);//等待函数; ///////////////////////////////////////////////////////////////// //函数定义; //FOUNCTION //enable before write data to x5045;
void wren_cmd(void) {//向X5045写入允许写操作指令字; CS=1; SCK=0; CS=0; write(WREN_INIT); CS=1; SCK=0; }
//make clk for send data void write(byte dt) {//向X5045写入一个字节数据
register byte i; for(i=0;i<8;i++) {
SCK=0; //N_NOP;
SI=(bit)(dt & 0x80);//_|- SCK=1; //N_NOP;
dt=dt<<1; } SI=0; }
//make clk for receive data byte read(void) {//从X5045读一个字节数据;
register byte i; register byte dt=0; SO=1; for(i=0;i<8;i++) { SCK=1; //N_NOP;
SCK=0; //N_NOP;
dt=dt<<1; if(SO)dt++; } return dt; }
//--------------------------------------- //X5045状态控制字: | //BIT: 7 6 5 4 3 2 1 0
| // x x WD1 WD0 BL1 BL0 WEL WIP | //WIP:0---正在写操作; | // 1---写操作完成; | //WEL:0---写使能锁存器复位; | // 1---写使能锁存器置位; | //BL1 BL0:
| // 00--不保护; | // 01--保护:01H--180H--1FFH; | // 10--保护:100H--1FFH; | // 11--保护:000H--1FFH; | //WD1 WD0:
| // 00--1.4秒; | // 01--600毫秒; | // 10--200毫秒; | // 11--禁止看门狗; | //--------------------------------------- //read state word from x5045; byte read_state(void) {//从X5045读状态控制字;
register byte dt; wren_cmd(); CS=1; SCK=0; CS=0; write(RDSR_INIT); dt=read(); SCK=0; CS=1; return dt; }
//write state word to x5045 before do somthing; void write_state(byte dt) {//向X5045写状态控制字;
wren_cmd(); CS=1; SCK=0; CS=0; write(WRSR_INIT); write(dt); SCK=0; CS=1; wait_end(WAIT_TIMES); }
//read n bytes from x5045; void read_nbyte(bit bA8,//选择EPROM上半部分/下半部分 byte adr_L,//从EPROM中什么地址开始读; byte n, //要读的字节数; byte *adr)//所读的数据从什么地址开始存放; {//从X5045读n个字节数据;
register byte i ; CS=1; SCK=0; CS=0; write(bA8?READ_INIT | 0x08 : READ_INIT); write(adr_L); for(i=0;i<n;i++) { *adr=read(); adr++; } SCK=0; CS=1;
}
//write n bytes to x5045; void write_nbyte(bit bA8,//选择EPROM上半部分/下半部分; byte adr_L,//从EPROM中什么地址开始写; byte n,//要写的字节数; byte *adr)//从什么地址开始取数据写; {//向X5045写n个字节数据;
register byte i ; EA=0; wren_cmd(); CS=1; SCK=0; CS=0; write(bA8?WRITE_INIT | 0x08 : WRITE_INIT); write(adr_L); for(i=0;i<n;i++) { write(*adr); adr++; } SCK=0; CS=1; wait_end(WAIT_TIMES); EA=1; }
// wait for be sure to complete void wait_end(byte run_times) {////等待向X5045写操作完成; register byte dt=0; while(run_times--) { dt=read_state(); if(dt&0x01==0)break; } } //////////////////////////////////////////////////////////////////
|