X5045程序问题

X5045程序问题,第1张

你先看看你两个X5045是不是型号一样的!你用的CPU电路的工作电压是多少!X5054/X5043有两种电压等级,2.7-5.5V,4.5-5.5V。搭个电路把你的程序烧到芯片上去就可以了,如果你那个是密集型贴片的话就不太好弄了!

#include <reg51.h>

#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,无法正确读取数据,那你怎么知道写入正常????????

出现这种情况,排除硬件问题的话,就是时序问题,你仔细对照数据手册,检查你的读出写入程序,问题基本可以肯定就在这里。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11856613.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存