jxcrg_t35 发表于 2011-12-25 18:41:22

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

david.h.du 发表于 2012-7-13 21:35:14

移位的时候程序错误了吧

cock 发表于 2012-7-15 04:06:36

告诉一个招数:
   先用编程器写一段话(最好先试ASCII)在芯片里,然后先调试读程序,如果能把自己写进去的话一字不差读出,再试写程序。因为读程序已能工作,测试写程序不就简单之极了。

coleyao 发表于 2012-7-15 06:52:14

这款芯片我大概8年前刚好用过的{:biggrin:}
需要的话我等会找找原来的代码贴上来。

ywjianghu 发表于 2012-8-18 01:58:33

coleyao 发表于 2012-7-15 06:52 static/image/common/back.gif
这款芯片我大概8年前刚好用过的
需要的话我等会找找原来的代码贴上来。 ...

你好!代码还能找到吗?
如果能贴上来将十分感谢!

coleyao 发表于 2012-8-18 05:37:05

//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子程序------------------------------------

ywjianghu 发表于 2012-8-18 14:20:46

coleyao 发表于 2012-8-18 05:37 static/image/common/back.gif
//78E58B,晶振应该是33M的
//------------------------------读写X5045子程序---------------------------- ...

无论如何,非常感谢你!
对Command_7

等有些费解,是个宏吗?

coleyao 发表于 2012-8-18 16:49:42

本帖最后由 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;

dtdzlujian 发表于 2012-8-25 07:02:29

学习了!我也有这个芯片.

dyz 发表于 2012-8-28 16:57:11

coleyao 发表于 2012-8-18 05:37 static/image/common/back.gif
//78E58B,晶振应该是33M的
//------------------------------读写X5045子程序---------------------------- ...

你好,x5045在读写数据时需要注意什么呢?为啥我的程序在运行时读出来的寄存器值总是0xff呢?我是用单片机的一个引脚作为x5045的时钟信号的,那么这个时钟信号需要一定的延时吗?我在设定时钟延时时,为什么延时不同数据输出值也不同呢?

coleyao 发表于 2012-8-28 20:58:23

dyz 发表于 2012-8-28 16:57 static/image/common/back.gif
你好,x5045在读写数据时需要注意什么呢?为啥我的程序在运行时读出来的寄存器值总是0xff呢?我是用单片 ...

网上找一个X5045的pdf文档看一下,注意一下时序要求,根据你自己的时钟频率相应调整一下。
页: [1]
查看完整版本: X5045读写问题,请大家指点。已经调试了两天了