hpdell 发表于 2010-8-14 11:18:42

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

/******************************************************************

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;               
}

yujian12365 发表于 2010-9-9 17:26:38

very good !

蓝蓝的恋 发表于 2014-12-17 14:15:11

我来测试一下看看~

BS_good200xy 发表于 2018-5-17 10:36:19

多谢分享!项目中要用到GT93C86,打算做一个93CXX的通用驱动程序。

蓝蓝的恋 发表于 2020-6-15 09:06:53

稍微整理了一下,先传到这里吧,省的以后用到了找不到{:lol:}

hpdell 发表于 2020-6-18 17:15:02

本帖最后由 hpdell 于 2020-6-18 17:26 编辑

蓝蓝的恋 发表于 2020-6-15 09:06
稍微整理了一下,先传到这里吧,省的以后用到了找不到

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

d2203s 发表于 2020-6-18 17:16:28

本帖最后由 d2203s 于 2020-6-18 17:18 编辑

原子例程也可已参考一下
页: [1]
查看完整版本: SPI 模拟的程序,93C56 绝对OK