打印

X5045的问题

[复制链接]
2407|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chen3bing|  楼主 | 2013-1-10 12:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用了一款复位带存储芯片,X5045.我写的程序,存储的值读的时候会和存的不一样。
我查不出问题,到底是存的有问题还是读的有问题。请高手指教,谢谢!
附原理图和程序。 1.pdf (44.68 KB) 2.pdf (42.73 KB)






相关帖子

沙发
chen3bing|  楼主 | 2013-1-10 12:17 | 只看该作者
这是程序。
#include<reg51.h>
#include<intrins.h>
#include<main.h>

sbit AD_CS1 = P0^6;
sbit Dat = P0^7;
sbit rcs =        P2^4;
sbit LCD_CS3 = P2^5;
sbit LCD_CS2 = P2^6;
sbit LCD_CS1 = P2^7;
sbit Clock = P3^3;
//        ;==========================================
//        ;向5045发送1个字节数据,入口:数据在dat中
//        ;==========================================


void WR_X5045(uchar dat)
{
        uchar i;
        EA=0;
        AD_CS1=1;
    LCD_CS1=1;
    LCD_CS2=1;
    LCD_CS3=1;
    Dat=0;
    for(i=8;i>0;i--)
        {
          
           dat<<=1;
           Dat=CY;
           _nop_();
           Clock=1;
           _nop_();
           _nop_();
           Clock=0;
        }
        EA=1;
}
//        ;==========================================
//       ;5045写允许子程序
//       ;==========================================

void wr5045en()
{
        EA=0;
        AD_CS1=1;
    LCD_CS1=1;
    LCD_CS2=1;
    LCD_CS3=1;
    rcs=0;
        //       ;写入"写允许"指令0000 0110B.
        WR_X5045(6);
        rcs=1;
        EA=1;
}
void wr5045dis()
{
        EA=0;
        AD_CS1=1;
    LCD_CS1=1;
    LCD_CS2=1;
    LCD_CS3=1;
    rcs=0;
        //       ;写入"禁止写"指令0000 0110B.
        WR_X5045(4);
        rcs=1;
        EA=1;
}
//        ;==========================================
//        ;从5045中读取1个字节数据,出口:数据在dat中
//        ;==========================================

uchar Read_X5045()
{
        uchar dat,i;
        EA=0;
        dat=0;
        AD_CS1=1;
    LCD_CS1=1;
    LCD_CS2=1;
    LCD_CS3=1;
        for(i=0;i<8;i++)
        {
                dat<<=1;
                //Dat=1;
                Clock=1;
            _nop_();
                if(Dat==1)
                        dat|=1;
                       
            Clock=0;
          //;Dat作为输入口。
   
        }
        Dat=0;
        EA=1;
        return dat;
}
// ;==========================================
//        ;5045状态字节读取子程序,出口数据在dat中
//        ;==========================================

uchar rd5045Status()
{
        uchar dat;
        EA=0;
        AD_CS1=1;
    LCD_CS1=1;
    LCD_CS2=1;
    LCD_CS3=1;
        ;
        Clock=0;
        rcs=0;
        _nop_();
       
        WR_X5045(5);         //读状态寄存器
        dat=Read_X5045();
        rcs=1;
        EA=1;
        return dat;
}
//        ;---------------------------------------------------
//        ;           随机写入字节到5045低区子程序
//        ;        .................................
//        ;入口参数:addr是地址,date是数据
//        ;---------------------------------------------------

void WR5045LowArea(uchar addr,uchar date)
{
        uchar i;
        EA=0;
        AD_CS1=1;
    LCD_CS1=1;
    LCD_CS2=1;
    LCD_CS3=1;
    Clock=0;
        wr5045en();         //           ;写入X5045的写使能.
        rcs=0;
               //;在低区中将数据写入到指定地址的存储区中去,A8=0表示是低区。
        WR_X5045(2);                  //写数据
                //;R5是指定的写入地址。
        WR_X5045(addr);
            //;RAMData是写入的数据.
        WR_X5045(date);
        rcs=1;
        i=1;
        while((i&0x01)==1)
        {
                i=rd5045Status();       //;D0=WIP=1表示X5045正在进行写操作,还没有写完。
        }
        EA=1;
        //for(i=0;i<200;i++);
        wr5045dis();
}
//        ;---------------------------------------------------
//        ;5045低区字节读取子程序,入口地址在R6中,出口数据在A中
//        ;---------------------------------------------------

uchar ReadPowerStatusData(uchar addr)
{
        uchar temp;
        EA=0;
        AD_CS1=1;
    LCD_CS1=1;
    LCD_CS2=1;
    LCD_CS3=1;
        ;
        Clock=0;
        rcs=0;
        _nop_();
       
    WR_X5045(3);
       
        WR_X5045(addr);
        temp=Read_X5045();
        _nop_();
        rcs=1;
        EA=1;
        return temp;
}
//        ;=====================================================
//        ;看门狗初始化设置为1.4秒
//        ;=====================================================

void X5045Inia()
{
        //uchar i;
        Clock=0;
        //i=rd5045Status();
        //i&=0x3c;
        //if(i==0)
        //        goto end_x5045init;
                        wr5045en();
                        rcs=0;
                       
                        WR_X5045(1);                 //写状态寄存器
                       
                        WR_X5045(0);                 //不保护,1.4秒
                        rcs=1;
//end_x5045init:
//                i=i;               
       
}

使用特权

评论回复
板凳
vincent325| | 2013-1-10 14:49 | 只看该作者
既然是模拟的就要确定一下这两个地方
1. 确保时序没有问题
2. 确保延时时间足够

使用特权

评论回复
地板
ayb_ice| | 2013-1-10 15:40 | 只看该作者
注意几点:
        1: 平时时钟线为低
        2: 写数据时时钟线为低改变数据线,高电平期间禁止改变数据线状态

        3: 第七个下降(0~7)后开始输出第一个数据,这里很重要,特别注意写与读的转换

        4: 将时序图打印出来,仔细对照程序是否完全一致,包括初始化与每次操作完成后,这也很重要

你这个程序确实很乱,没有条理,基本读写字节程序应该只管操作时钟与数据,不要控制其它的,其它的由具体的指令开始时初始化,结束时再次处理...

使用特权

评论回复
5
chen3bing|  楼主 | 2013-1-10 20:55 | 只看该作者
谢谢两位大侠,明天好好搞一搞。

使用特权

评论回复
6
明月小厨| | 2013-1-10 21:46 | 只看该作者
模拟I2C是很痛苦的事,我做过一次后再也没做第二次;

使用特权

评论回复
7
hhhhhhgggg| | 2016-10-25 07:23 | 只看该作者
ayb_ice 发表于 2013-1-10 15:40
注意几点:
        1: 平时时钟线为低
        2: 写数据时时钟线为低改变数据线,高电平期间禁止改变数据线状态


5045的RO引脚连接单片机,但是程序中没用的这个引脚,我将该引脚直接做IO口使用行吗?用断开5045的RO引脚吗?5045的RO引脚会输出高低电平吗?

使用特权

评论回复
8
hhhhhhgggg| | 2016-10-25 07:24 | 只看该作者
ayb_ice 发表于 2013-1-10 15:40
注意几点:
        1: 平时时钟线为低
        2: 写数据时时钟线为低改变数据线,高电平期间禁止改变数据线状态

5045的RO引脚连接单片机,但是程序中没用的这个引脚,我将该引脚直接做IO口使用行吗?用断开5045的RO引脚吗?5045的RO引脚会输出高低电平吗!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

439

主题

2540

帖子

2

粉丝