#define uchar unsigned char
#define WRSRb 0X01 //写状态寄存器指令
#define WRITEb 0X02 //写数据指令
#define READb 0X03 //读数据指令
#define WRDIb 0X04 //禁止写 *** 作指令
#define RDSRb 0X05 //读状态寄存器指令
#define WRENb 0X06 //允许写 *** 作指令
#define WAIT_TIM 200 //等待时间常数
sbit SO =P2^0 //串行数据输出端
sbit SI =P2^1 //串行数据输入端
sbit SCK=P2^2 //串行时钟端
sbit CS =P2^3 //片选端
void X5045_Rst() //复位看门狗
void X5045_Wren_Cmd(void) //允许写 *** 作指令函数
void X5045_Wrdi_Cmd(void) //禁止写 *** 作指令函数
void X5045_Write(uchar dt) //写一个字节数据函数
uchar X5045_Read(voX5045_id) //读一个字节数据函数
uchar X5045_Read_State(void) //读状态控制字函数
void X5045_Write_State(uchar dt)//写状态控制字函数
void X5045_Read_Nuchar(bit bA8,uchar adr_L,uchar n,uchar *adr) //读n个字节数据函数
void X5045_Write_Nuchar(bit bA8,uchar adr_L,uchar n,uchar *adr) //写n个字节数据函数
void X5045_Wait_End(uchar run_times)//等待函数
//函数定义
void X5045_Rst()//复位看门狗
{
CS=0
CS=1
}
//在写数据到x5045前 写入允许写 *** 作指令字
void X5045_Wren_Cmd(void)//向X5045写入允许写 *** 作指令字
{
CS=1 //
SCK=0 //
CS=0 //片选有效
write(WRENb) //写入允许写 *** 作指令字
CS=1 //片选无效
SCK=0
}
void X5045_Wrdi_Cmd(void)//向X5045写入禁止写 *** 作指令字
{
CS=1 //
SCK=0 //
CS=0 //片选有效
write(WRDIb) //写入禁止写 *** 作指令字
CS=1 //片选无效
SCK=0
}
//make clk for send data
void X5045_Write(uchar dt)//向X5045写入一个字节数据
{
uchar i
for(i=0i<8i++)//8位
{
SCK=0
SI=(bit)(dt&0x80) //先发高位
SCK=1 //上升沿锁存
dt=dt<<1 //左移
}
SI=0
}
//make clk for receive data
uchar X5045_Read(void)//从X5045读一个字节数据
{
uchar i
uchar dt=0 //清0
SO=1
for(i=0i<8i++)//8位
{
SCK=1
SCK=0
dt=dt<<1 //左移
if(SO) dt++ //数据线为1 则数据加1 为0不处理
}
return dt
}
//5045状态寄存器读出程序
//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
uchar X5045_Read_State(void)
{ //从X5045读状态控制字
uchar dt
X5045_Wren_Cmd() //向X5045写入允许写 *** 作指令字
CS=1
SCK=0
CS=0
X5045_Write(RDSRb) //写读状态寄存器指令
dt=X5045_Read() //读状态寄存器
SCK=0
CS=1
return dt
}
//write state word to x5045 before do somthing
void X5045_Write_State(uchar dt)//向X5045写状态控制字
{
X5045_Wren_Cmd() //向X5045写入允许写 *** 作指令字
CS=1
SCK=0
CS=0
X5045_Write(WRSRb) //写读状态寄存器指令
X5045_Write(dt) //写状态寄存器
SCK=0
CS=1
wait_end(WAIT_TIM)
}
//read n uchars from x5045
void X5045_Read_Nuchar(bit bA8,uchar adr_L,uchar n,uchar *adr)//读n个字节数据函数
/*bit bA8,//选择EPROM上半部分/下半部分
uchar adr_L,//从EPROM中什么地址开始读
uchar n, //要读的字节数
uchar *adr)//所读的数据从什么地址开始存放*/
{ //从X5045读n个字节数据
uchar i
CS=1
SCK=0
CS=0
X5045_Write(bA8?READb|0x08:READb)//选择EPROM上半/下半部分
X5045_Write(adr_L) //写EPROM中地址
for(i=0i<ni++)//要读n个字节
{
*adr=X5045_Read() //读数据
adr++ //地址调整
}
SCK=0
CS=1
}
//write n uchars to x5045//向X5045写n个字节数据
void X5045_Write_Nuchar(bit bA8,uchar adr_L,uchar n,uchar *adr)//写n个字节数据函数
/*bit bA8,//选择EPROM上半部分/下半部分
uchar adr_L,//从EPROM中什么地址开始写
uchar n,//要写的字节数
uchar *adr)//从什么地址开始取数据写*/
{
uchar i
EA=0
X5045_Wren_Cmd() //向X5045写入允许写 *** 作指令字
CS=1
SCK=0
CS=0
X5045_Write(bA8?WRITEb|0x08:WRITEb)//选择EPROM上半/下半部分
X5045_Write(adr_L) //写EPROM中地址
for(i=0i<ni++)//要写n个字节
{
X5045_Write(*adr) //写数据
adr++ //地址调整
}
SCK=0
CS=1
X5045_Wait_End(WAIT_TIM) //写等待时间
EA=1
}
// wait for be sure to complete
void X5045_Wait_End(uchar run_times)//等待向X5045写 *** 作完成
{
register uchar dt=0
while(run_times--)
{
dt=X5045_Read_State() //读状态
if(dt&0x01==0)
break
}
}
X5045与STM32单片机连接,写入数据正常,读取数据总是0XFF或者0X01,无法正确读取数据,那你怎么知道写入正常????????出现这种情况,排除硬件问题的话,就是时序问题,你仔细对照数据手册,检查你的读出写入程序,问题基本可以肯定就在这里。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)