搜索
bottom↓
回复: 4

求助——关于93c66读写驱动

[复制链接]

出0入0汤圆

发表于 2009-9-22 15:03:52 | 显示全部楼层 |阅读模式
参照网上的程序改的,但是读出来的始终是FF,DO口电平没变化,一直都是高,请高手指点小弟
#include <reg52.h>
#include <key.h>
#include <intrins.h>
#include <ABSACC.h>

#define uchar unsigned char //方便定义
#define uint  unsigned int
#define ulong unsigned long

unsigned char Addr_bit=8;

/*输出结果*/
sbit FULL = P1^6;
sbit PASS = P1^7;
sbit KEY1 = P2^7;
sbit KEY2 = P2^6;

sbit CS_93c66=P3^7;                //片选
sbit SK_93c66=P3^6;                //时钟
sbit DI_93c66=P3^5;                //串行输入
sbit DO_93c66=P3^4;                //串行输出


void START_93c66();
void END_93c66();
void EWEN_93c66();
void EWDS_93c66();

unsigned char READ(unsigned int);
unsigned char WRITE(unsigned int,unsigned int);
void SEND_DATA_93c66(unsigned int,unsigned char);
void delay1(unsigned int);
unsigned char WRAL(unsigned int);
unsigned char ERAL();



void main()
{   

        unsigned int tmp,m;

        senddata595=0x0001;
        PASS=0;
        FULL=0;
        tmp=100;


while(1)
    {
                WRITE(2,3);          
                tmp=READ(2);

        }
   
}


/*93c66 操作子程序 StartBit(1)+OP Code(2)+Address(A7-A0)数据(D15-D0)*/

void delay1(unsigned int num)
{
        while(num!=0){num=num-1;}
}
/***********************************************************************/
/*名称: START_93c66() */
/*说明: 用于93c66 的启动,防止由于CS_93c66 的改动而引起数据时序混乱 */
/***********************************************************************/
void START_93c66()
{

//        DO_93c66=1;
        DI_93c66=0;
        delay1(3);
        SK_93c66=0;
        delay1(3);
        CS_93c66=1;
        delay1(3);
}
/***************************************************************************/
/*名称:END_93c66() */
/*说明:用于93c66 的结束,防止由于CS_93c66 的改动而引起数据线为0 而无法输入*/
/***************************************************************************/
void END_93c66()
{
        CS_93c66=0;
        delay1(3);
        DI_93c66=1;
        delay1(3);
        SK_93c66=1;
        delay1(3);
}
/***********************************************************************/
/*名称:SEND_DATA_93c66() */
/*说明:在93c66 启动下,送入指定位数的数据 */
/*输入: op_data 要输入的数据 */
/* num 输入的位数 */
/**********************************************************************/
void SEND_DATA_93c66(unsigned int op_data,unsigned char num)
{
        unsigned char temp1;
        op_data=op_data<<(16-num); /*左移去掉无用位*/
        for(temp1=0;temp1<num;temp1++)
          {                 
                  DI_93c66=op_data&0X8000;
                delay1(3);
                  SK_93c66=1;
                delay1(3);
                  SK_93c66=0;
                delay1(3);
                  op_data=op_data<<1;
        }
}
/***********************************************************************/
/*名称: EWEN_93c66() */
/*说明: 93c66 的编程启动.操作码(100 11XXXXXXX) */
/***********************************************************************/
void EWEN_93c66()
{
        START_93c66();
        SEND_DATA_93c66(0X0004,0X03); /*送入3 位操作码+11*/
        SEND_DATA_93c66(0X00C0,Addr_bit); /*送入8位地址*/
}
/***********************************************************************/
/*名称: EWDS_93c66() */
/*说明: 93c66 的编程关闭.操作码(100 00XXXXXXX) */
/**********************************************************************/
void EWDS_93c66()
{
        SEND_DATA_93c66(0X0004,0X03);
        SEND_DATA_93c66(0X0000,Addr_bit);
        END_93c66();
}
/***********************************************************************/ /*名称:READ() */
/*说明:93c66 的字读取程序 */
/*输入:要读取的字节地址(9 位) */
/*输出:读取的字数值 */
/**********************************************************************/
unsigned char READ(unsigned int address)
{
        unsigned char temp1;
        unsigned int temp2;
       
        START_93c66();
        SEND_DATA_93c66(0X0006,0X03);
        SEND_DATA_93c66(address,Addr_bit);
        temp2=0; /*存放返回数据的缓冲先清零*/
       
        for(temp1=0;temp1<16;temp1++) /*循环读出16 个数据*/
        {
          temp2=temp2<<1;
          SK_93c66=1;
          delay1(3);
          SK_93c66=0;
          delay1(3);
          if(DO_93c66==1)
          {
                  temp2=temp2|0X01;
          }
        }
        END_93c66();
        return temp2;
}
/**********************************************************************/
/*名称:WRITE() */
/*说明:93c66 的字写入程序 */
/*输入: address 要写入的字节地址(9 位) */
/* op_data 要写入的数据(8 位) */
/*输出: 读取的字数值 */
/**********************************************************************/
unsigned char WRITE(unsigned int address,unsigned int op_data)
{
        unsigned char temp1;
        unsigned int temp2;

        EWEN_93c66();
        SEND_DATA_93c66(0X0005,0X03);
        SEND_DATA_93c66(address,Addr_bit);
        SEND_DATA_93c66(op_data,0X10);
        CS_93c66=0;
        delay1(5);
        CS_93c66=1;
        temp1=1;
        temp2=5000; /*设置一个最大延时等待数值.注意在不同的晶振下延时是不同的*/
        while(!DO_93c66)
        {
          temp2=temp2-1;
          if(temp2==0)
          {
                  temp1=0;//temp1=0则写入失败
                  FULL=1;
                  delay1(60000);
                  FULL=1;
                  break; /*最大等待延时后说明擦除失败*/
          }
        }
        EWDS_93c66();
        return temp1;
}
/***********************************************************************/
/*名称:ERASE() */
/*说明:93c66 的字擦除程序 */
/*输入: address 要擦除的字地址(9 位) */
/**********************************************************************/
unsigned char ERASE(unsigned char address)
{
        data unsigned char temp1;
        data unsigned int temp2;
        EWEN_93c66();
        START_93c66();
        SEND_DATA_93c66(0X07,0X03);
        SEND_DATA_93c66(address,0X08);
        CS_93c66=0;
        CS_93c66=1;
        temp1=1;
        temp2=50000;
        while(!DO_93c66)
        {
                temp2=temp2-1;
                if(temp2==0)
                {
                        temp1=0;
                        break;
                }
        }
        END_93c66();
        EWDS_93c66(); //返回表示擦除状态的特征
        return temp1;
}

/**********************************************************************/
/*名称:ERAL() */
/*说明:93c66 的全部擦除程序 */
/**********************************************************************/
unsigned char ERAL()
{
        data unsigned char temp1;
        data unsigned int temp2;
        EWEN_93c66();
        START_93c66();
        SEND_DATA_93c66(0X04,0X03);
        SEND_DATA_93c66(0X80,0X08);
        CS_93c66=0;
        CS_93c66=1;
        temp1=1;
        temp2=50000;
        while(!DO_93c66)
        {
                temp2=temp2-1;
                if(temp2==0)
                {
                        temp1=0;
                        break;
                }
        }
        END_93c66();
        EWDS_93c66(); //返回表示擦除状态的特征
        return temp1;
}
/***********************************************************************/
/*名称:WRAL() */
/*说明:93c66 的写全部程序 */
/*输入: op_data 要写入的数据(16 位) */
/*输出: 读取的字数值 */
/***********************************************************************/
unsigned char WRAL(unsigned int op_data)
{
        data unsigned char temp1;
        data unsigned int temp2;
        EWEN_93c66();
        START_93c66();
        SEND_DATA_93c66(0X04,0X03);
        SEND_DATA_93c66(0X40,0X08);
        SEND_DATA_93c66(op_data,0X10);
        CS_93c66=0;
        CS_93c66=1;
        temp1=1;
        temp2=50000; //设置一个最大延时等待数值.注意在不同的晶振下延时是不同的
        while(!DO_93c66)
        {
                temp2=temp2-1;
                if(temp2==0)
                {
                        temp1=0;
                        break;
                }
        }
        END_93c66();
        EWDS_93c66();
        return op_data;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2009-9-22 16:30:12 | 显示全部楼层
问题解决了,每个指令写完了应该把CS置低一下

出0入0汤圆

发表于 2010-1-8 17:46:06 | 显示全部楼层
我严格按照说明书时序编程,93c66就是没反应,93c66的do你加上拉电阻了?

出0入4汤圆

发表于 2018-5-17 15:09:13 | 显示全部楼层
正要试验这个程序,看看我有没有类似问题。

出0入4汤圆

发表于 2018-5-18 18:00:44 | 显示全部楼层
void SEND_DATA_93c66(unsigned int op_data,unsigned char num)
{
        unsigned char temp1;
        op_data=op_data<<(16-num); /*左移去掉无用位*/
        for(temp1=0;temp1<num;temp1++)
          {                  
                  DI_93c66=op_data&0X8000;
                delay1(3);
                  SK_93c66=1;
                delay1(3);
                  SK_93c66=0;
                delay1(3);
                  op_data=op_data<<1;
        }
}

DI_93C66赋值方式错误。应该是if(op_data&0X8000) DI_93C66=1;else DI_93C66=0;
                                       
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-14 21:20

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

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