X5045读写问题,请大家指点。已经调试了两天了
#include <reg51.h>#include <intrins.h>
#include <config.h>
extern bit x5045useflag;
/**************************
//x5045接口定义 ,512 BYTE
sbit x5045_cs=P1^4; //低电平有效,操作时需要有个高低变化过程
sbit x5045_so=P0^2;//串行输出,MSB先输出
sbit x5045_sck=P0^1;//时钟,上升沿SI输入,下降沿SO输出
sbit x5045_si=P0^0;//串行输入,MSB先输入
#define WREN 0X06 //写允许
#define WRDI 0X04 //写禁止
#define RSDR 0x05 //读状态寄存器
#define WRSR 0x01 //写状态寄存器,看门狗和块保护定义
#define READ_ADDERS_H 0x0b //从256~511地址读,可以连续写
#define READ_ADDERS_L 0x03 //从0~255地址读,可以连续写
#define WRITE_ADDERS_H 0x0a //从256~511地址写,可以连续写
#define WRITE_ADDERS_L 0x02 //从0~255地址写,可以连续写
bit x5045useflag=0;//=1为在x5045操作,终止定时喂狗
**************************/
void x5045_write_onebyte(unsigned char onedata){//只做时钟,不判断其他,在调用程序中加读写条件
unsigned char i;
for(i=0;i<8;i++){//上升沿写入SI
x5045_si=(bit)(onedata&0x80);
x5045_sck=0;
onedata<<=1;
x5045_sck=1; //SCK=1;
}
}
unsigned char x5045_read_onebyte(void){//只做时钟,不判断其他,在调用程序中加读写条件
unsigned char i,onedata;
for(i=0;i<8;i++){//下降沿读入So
x5045_sck=1;
x5045_sck=0; //sck=0;
onedata|=x5045_si;
onedata<<=1;
}
return(onedata);
}
unsigned char x5045_read_status(void){
unsigned char temp;
//*****************************
x5045_so=1;
x5045_si=1;
//*****************************/
x5045_cs=0;
x5045useflag=1;
x5045_write_onebyte(RSDR);
temp=x5045_read_onebyte();
x5045_cs=1;
x5045useflag=0;
return(temp);
}
void x5045_write_status(unsigned char vdata){
x5045_cs=0;
x5045useflag=1;
x5045_write_onebyte(WREN);
x5045_cs=1;
x5045_cs=0;
x5045_write_onebyte(WRSR);
x5045_write_onebyte(vdata);
x5045_cs=1;
x5045useflag=0;
}
void x5045_write_data(unsigned int adders,unsigned char data_buff){//len<16,每页为16BYTE字节
x5045useflag=1;
x5045_cs=0;
x5045_write_onebyte(WREN);//写完后,CS需被拉高,write enbleSCK=1
x5045_cs=1;
//temp=(adders>255)?WRITE_ADDERS_H:WRITE_ADDERS_L; //写入高地址
x5045_cs=0;
x5045_write_onebyte((adders>255)?WRITE_ADDERS_H:WRITE_ADDERS_L); //写入write 指令地址
//temp=(unsigned char)adders; //写入真实地址
x5045_write_onebyte((unsigned char)adders);
//temp=data_buff;//写入数据
x5045_write_onebyte(data_buff);
x5045_cs=1;//写入完成SCK=1
x5045useflag=0;
if(x5045_read_status()&0x01){x5045_cs=0;
_nop_();
x5045_cs=1;}; //检查WIP状态,喂狗,=0时,写入完成
}
unsigned char x5045_read_data(unsigned int adders){//返还指定地址的数据
unsigned char temp;
x5045useflag=1;
x5045_so=1;
x5045_cs=0;
//temp=(adders>255)?READ_ADDERS_H:READ_ADDERS_L;//高地址读
x5045_write_onebyte((adders>255)?READ_ADDERS_H:READ_ADDERS_L); //写入读地址指令
x5045_write_onebyte((unsigned char )adders); //sck=1
temp=x5045_read_onebyte();
x5045_cs=1;
x5045useflag=0;
return(temp);
}
写入指定地址55,AA,读出来却是00,fe 移位的时候程序错误了吧 告诉一个招数:
先用编程器写一段话(最好先试ASCII)在芯片里,然后先调试读程序,如果能把自己写进去的话一字不差读出,再试写程序。因为读程序已能工作,测试写程序不就简单之极了。 这款芯片我大概8年前刚好用过的{:biggrin:}
需要的话我等会找找原来的代码贴上来。 coleyao 发表于 2012-7-15 06:52 static/image/common/back.gif
这款芯片我大概8年前刚好用过的
需要的话我等会找找原来的代码贴上来。 ...
你好!代码还能找到吗?
如果能贴上来将十分感谢! //78E58B,晶振应该是33M的
//------------------------------读写X5045子程序------------------------------------
void WatchDog(void) //喂狗
{
nop;
X5045Cs=0;
nop;
X5045Cs=1;
}
void Write_byte5045(void) //写字节5045命令(与KA120比较有改动)
{
uchar k;
for(k=0;k<8;k++)
{
Sck=0;nop;
Sio=Command_7;nop;
Sck=1; nop;
Command<<=1;
}
Sio=1; feeddog=1;
}
void Write_en5045(void) //写使能
{
X5045Cs =0;
Command=0x06;
Write_byte5045();
X5045Cs =1;
}
void Write_dis5045(void)
{
X5045Cs=0;
Command=0x04;
Write_byte5045();
X5045Cs =1;
}
voidWrite_5045(uchar Length, bit High_address, uchar Low_address) //根据参数写5045
{
uchar i;
X5045Cs= 0; //5045使能
if(High_address) //判断是否需要最高位地址
Command=0x0a;
else
Command=0x02;
Write_byte5045();
Command=Low_address;
Write_byte5045(); //写入起始地址
for(i=0;i<Length;i++) //写入数据
{
Command=Data1_buffer;
Write_byte5045();
}
X5045Cs =1;
Ddelay(20,1);
}
void DogEnable(void) //写5045状态寄存器
{
X5045Cs=0;
Command=0x01;
Write_byte5045();
Command=0;
Write_byte5045();
X5045Cs=1;
}
void DogDisable(void) //写5045状态寄存器
{
X5045Cs=0;
Command=0x01;
Write_byte5045();
Command=0x30;
Write_byte5045();
X5045Cs=1;
}
void Read_byte5045(void) //读字节5045命令(与KA120比较有改动)
{
uchar k;
for(k=0;k<8;k++)
{
Command<<=1;
Sck=1; nop;Sck=0;
Command_0=Sio;
}
Sck=1;
}
voidRead_5045(uchar Length, bit High_address, uchar Low_address) //根据参数读5045
{
uchar i;
X5045Cs= 0; //5045使能
if(High_address)Command=0x0b; else Command=0x03;
Write_byte5045();
Command=Low_address;
Write_byte5045();
for(i=0;i<Length;i++)
{
Read_byte5045();
Data1_buffer=Command;
}
X5045Cs =1;
}
//------------------------------读写X5045子程序------------------------------------ coleyao 发表于 2012-8-18 05:37 static/image/common/back.gif
//78E58B,晶振应该是33M的
//------------------------------读写X5045子程序---------------------------- ...
无论如何,非常感谢你!
对Command_7
等有些费解,是个宏吗? 本帖最后由 coleyao 于 2012-8-18 16:50 编辑
//用的是位存储区的字节,应该不是宏,算位变量吧
bdata uchar Command _at_ 0x29;
sbitCommand_7 = Command^7;
sbitCommand_6 = Command^6;
sbitCommand_5 = Command^5;
sbitCommand_4 = Command^4;
sbitCommand_3 = Command^3;
sbitCommand_2 = Command^2;
sbitCommand_1 = Command^1;
sbitCommand_0 = Command^0; 学习了!我也有这个芯片. coleyao 发表于 2012-8-18 05:37 static/image/common/back.gif
//78E58B,晶振应该是33M的
//------------------------------读写X5045子程序---------------------------- ...
你好,x5045在读写数据时需要注意什么呢?为啥我的程序在运行时读出来的寄存器值总是0xff呢?我是用单片机的一个引脚作为x5045的时钟信号的,那么这个时钟信号需要一定的延时吗?我在设定时钟延时时,为什么延时不同数据输出值也不同呢? dyz 发表于 2012-8-28 16:57 static/image/common/back.gif
你好,x5045在读写数据时需要注意什么呢?为啥我的程序在运行时读出来的寄存器值总是0xff呢?我是用单片 ...
网上找一个X5045的pdf文档看一下,注意一下时序要求,根据你自己的时钟频率相应调整一下。
页:
[1]