搜索
bottom↓
回复: 10

X5045读写问题,请大家指点。已经调试了两天了

[复制链接]

出0入0汤圆

发表于 2011-12-25 18:41:22 | 显示全部楼层 |阅读模式
#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 enble  SCK=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

出0入0汤圆

发表于 2012-7-13 21:35:14 | 显示全部楼层
移位的时候程序错误了吧

出0入0汤圆

发表于 2012-7-15 04:06:36 | 显示全部楼层
告诉一个招数:
     先用编程器写一段话(最好先试ASCII)在芯片里,然后先调试读程序,如果能把自己写进去的话一字不差读出,再试写程序。因为读程序已能工作,测试写程序不就简单之极了。

出0入0汤圆

发表于 2012-7-15 06:52:14 | 显示全部楼层
这款芯片我大概8年前刚好用过的
需要的话我等会找找原来的代码贴上来。

出0入0汤圆

发表于 2012-8-18 01:58:33 | 显示全部楼层
coleyao 发表于 2012-7-15 06:52
这款芯片我大概8年前刚好用过的
需要的话我等会找找原来的代码贴上来。 ...

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

出0入0汤圆

发表于 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;
}

void  Write_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[i];
  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;
}


void  Read_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[i]=Command;
}
X5045Cs =1;
}
//------------------------------读写X5045子程序------------------------------------

出0入0汤圆

发表于 2012-8-18 14:20:46 | 显示全部楼层
coleyao 发表于 2012-8-18 05:37
//78E58B,晶振应该是33M的
//------------------------------读写X5045子程序---------------------------- ...

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

等有些费解,是个宏吗?

出0入0汤圆

发表于 2012-8-18 16:49:42 | 显示全部楼层
本帖最后由 coleyao 于 2012-8-18 16:50 编辑

//用的是位存储区的字节,应该不是宏,算位变量吧
bdata uchar Command    _at_    0x29;
sbit  Command_7 = Command^7;
sbit  Command_6 = Command^6;
sbit  Command_5 = Command^5;
sbit  Command_4 = Command^4;
sbit  Command_3 = Command^3;
sbit  Command_2 = Command^2;
sbit  Command_1 = Command^1;
sbit  Command_0 = Command^0;

出0入0汤圆

发表于 2012-8-25 07:02:29 | 显示全部楼层
学习了!我也有这个芯片.

出0入0汤圆

发表于 2012-8-28 16:57:11 | 显示全部楼层
coleyao 发表于 2012-8-18 05:37
//78E58B,晶振应该是33M的
//------------------------------读写X5045子程序---------------------------- ...

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

出0入0汤圆

发表于 2012-8-28 20:58:23 | 显示全部楼层
dyz 发表于 2012-8-28 16:57
你好,x5045在读写数据时需要注意什么呢?为啥我的程序在运行时读出来的寄存器值总是0xff呢?我是用单片 ...

网上找一个X5045的pdf文档看一下,注意一下时序要求,根据你自己的时钟频率相应调整一下。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 01:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表