搜索
bottom↓
回复: 7

SPI 模拟的程序,93C56 绝对OK

[复制链接]

出0入0汤圆

发表于 2010-8-14 11:18:42 | 显示全部楼层 |阅读模式
/******************************************************************

AT93C56程序的读写测试 ,此程序是以8位结构的存储器为例

PIN1 = CS
PIN2 = SK
PIN3 = DI                主设备数据输入,从设备数据输出
PIN4 = DO                主设备数据输出,从设备数据输入
PIN5 = GND
PIN6 = ORG
PIN7 = NC
PIN8 = VCC


                VCC                NC                        ORG                        GND
         __|______|______|_____|_
  |                                                                                                 |
        |                                                                                                 |
        |                                   AT93C56                            |
        |        .                                                                                         |
        |________________________|
                 |                        |                         |                 |
                 CS                 SK                         DI                 DO




ORG=1        内部是16位结构的存储器        128*16
ORG=0        内部是8位结构的存储器                256*8
本实验已经将ORG硬件接地了,即选择芯片内部是8位结构的存储器,256*8
2K容量

******************************************************************/                       
sbit SPI_CS = P2^4;
sbit SPI_CK = P2^5;
sbit SPI_DI = P2^6;
sbit SPI_DO = P2^7;

/******************************************
名称:START_93cxx()
说明:用于93CXX的启动,防止由于CS的改动而引起的时序混乱
起始条件:SC与DI在CK首个上升沿的时候,且SC与DI都为高,器件视之为起始位
*********************************************/
void START_93cxx_SWS()
{
        SPI_DO = 1;                //防止DO 由于是低电平而无法输入//
        SPI_CS = 1;
        Delay_us(1);
        SPI_CS = 0;
        SPI_DI = 0;
        SPI_CK = 0;
        SPI_CS = 1;
        Delay_us(2);               
}


/******************************************
名称:END_93cxx()
说明:用于93CXX的停止,防止由于CS的改动而引起的时序混乱
*********************************************/
void END_93cxx_SWS()
{
        SPI_CS = 0;
        SPI_DI = 1;
        SPI_CK = 1;               
}



void SEND_DATA_93cxx_SWS(uchar Op_data,numbyte)
{
        unsigned char temp;

        for(temp=0;temp<numbyte;temp++)
        {
                if((Op_data & 0x80))
                        SPI_DI = 1;
                else SPI_DI = 0;                
                       
                SPI_CK = 1;
                SPI_CK = 0;
                Op_data <<= 1;                       
        }
}


/******************************************
名称:EWEN_93cxx()
说明:93CXX的编程启动,操作码(100 11XXXXXXX)
送入的操作码及控制码的总共位数一位也不能少,切忌
*********************************************/
void EWEN_93cxx_SWS()
{
        START_93cxx_SWS();
        SEND_DATA_93cxx_SWS(0X98,8); //送入3 位操作码+11//        ok
        SEND_DATA_93cxx_SWS(0X00,4); //送入操作码的扩展码                       
        END_93cxx_SWS();
}


/******************************************
名称:EWDS_93cxx()
说明:93CXX的编程关闭,操作码(100 00XXXXXXX) ,操作码与控制码的总共位数不能够少
*********************************************/
void EWDS_93cxx_SWS()
{
        START_93cxx_SWS();
        SEND_DATA_93cxx_SWS(0X80,8); //送入三位操作码/扩展码
        SEND_DATA_93cxx_SWS(0X00,4); //送入操作码的扩展码
        END_93cxx_SWS();
}


/******************************************
名称:Write_Eeprom(unsigned char addr,unsigned char dat)
说明:addr是要写入的地址,dat是要写入的数据,操作码(101 xxxxxxxx)
*********************************************/
T_Bit Write_Eeprom_SWS(unsigned char addr,unsigned char dat)
{
        unsigned char Eep_data=0;
        unsigned int i=0;

        EWEN_93cxx_SWS();  //允许写动作开启
        START_93cxx_SWS();
        SEND_DATA_93cxx_SWS(0xa0,4); //送入三位写操作码        +0 ,只传高4位,

        SEND_DATA_93cxx_SWS(addr,8); //送入要写入的地址码
        SEND_DATA_93cxx_SWS(dat,0X08); //送入要写入的数据
        SPI_CS = 0;
  Delay_us(1);
        SPI_CS = 1;

        i=65000; //设置一个最大延时等待数值
        while(!SPI_DO)
        {
                i = i-1;
                if(i==0)
                {
                        return ERROR;                //等待最大延时后,说明擦除失败
                }
        }
        END_93cxx_SWS();
        EWDS_93cxx_SWS();
        return OK;
}


/******************************************
名称:Read_Eeprom(unsigned char addr)
说明:addr是要读取的地址,操作码(110 xxxxxxxxx)
*********************************************/
uchar Read_Eeprom_SWS(unsigned char addr)
{
        unsigned char Eep_data=0,i=0;
        START_93cxx_SWS();
        SEND_DATA_93cxx_SWS(0xc0,4); //送入三位读操作码         +0         ,只传高4位,

        SEND_DATA_93cxx_SWS(addr,8); //送入读的地址码
        for(i=0;i<8;i++)
        {
                 Eep_data <<= 1;
                 SPI_CK = 1;
                 Delay_us(1);
                 SPI_CK = 0;
                 if(SPI_DO==1)
                         Eep_data |= 0X01;          

        }
        END_93cxx_SWS();
        return Eep_data;
}

/******************************************
名称:ERASE_ALL_Eeprom()
说明:93CXX的全部擦除程序,操作码(100 10xxxxxxx),操作码与控制码的总共位数不能够少
*********************************************/
T_Bit ERASE_ALL_Eeprom_SWS()
{       
        unsigned int i=0;
        EWEN_93cxx_SWS();  //允许写动作开启
        START_93cxx_SWS();
        SEND_DATA_93cxx_SWS(0X90,8); //送入三位写操作码及扩展码
        SEND_DATA_93cxx_SWS(0X00,4); //送入剩余的扩展码
        SPI_CS = 0;
  Delay_us(1);                 //delay 250ns//
        SPI_CS = 1;
       
        i=50000;
        while(!SPI_DO)
        {
                i=i-1;
                if(i==0)
                {
                 return ERROR;
                }
        }
        END_93cxx_SWS();
        EWDS_93cxx_SWS();
        return OK;               
}

出0入0汤圆

发表于 2010-9-9 17:26:38 | 显示全部楼层
very good !

出0入8汤圆

发表于 2014-12-17 14:15:11 | 显示全部楼层
我来测试一下看看~

出0入4汤圆

发表于 2018-5-17 10:36:19 | 显示全部楼层
多谢分享!项目中要用到GT93C86,打算做一个93CXX的通用驱动程序。

出0入8汤圆

发表于 2020-6-15 09:06:53 | 显示全部楼层
稍微整理了一下,先传到这里吧,省的以后用到了找不到

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2020-6-18 17:15:02 | 显示全部楼层
本帖最后由 hpdell 于 2020-6-18 17:26 编辑
蓝蓝的恋 发表于 2020-6-15 09:06
稍微整理了一下,先传到这里吧,省的以后用到了找不到


感谢大神了啊,我也收藏一下

出0入0汤圆

发表于 2020-6-18 17:16:28 | 显示全部楼层
本帖最后由 d2203s 于 2020-6-18 17:18 编辑

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

本版积分规则

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

GMT+8, 2024-4-20 01:58

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

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