STM32F407 读写 AT93C86 ,始终返回0xffff

2019-07-20 10:45发布

芯片ORG引脚接VCC,16位数据,地址为A9---A0
主要代码如下:
// Write enable must precede all programming modes.
void EEPROM_Ewen(void)
{
                u16 i,InData;
                EEPROM_CS_0( );
                EEPROM_SCLK_0( );
                delay_us(100);
                EEPROM_CS_1( );
                InData=0x4C0; // 100 11XX XXXX
                for(i = 0; i < 11; i++)
                { // 9
                        if(InData&0x400)
                        {                               
                                EEPROM_MOSI_1( );
                        }
                        else
                                EEPROM_MOSI_0( );
                        delay_us(100);
                        EEPROM_SCLK_1( );
                        delay_us(100);
                        EEPROM_SCLK_0( );
                        delay_us(100);
                        InData <<= 1;
                }
                EEPROM_CS_0( );
}

// Write enable must precede all programming modes.
void EEPROM_Ewds(void)
{
                unsigned int i,InData;
                EEPROM_CS_0( );  
                EEPROM_SCLK_0( );
                delay_us(100);
                EEPROM_CS_1( );
                InData=0x400; // 100 00XX XXXX
                for(i = 0; i < 11; i++)
                { // 9
                        if(InData & 0x400)
                        {                               
                                EEPROM_MOSI_1( );
                        }
                        else EEPROM_MOSI_0( );
                        delay_us(100);
                        EEPROM_SCLK_1( );
                        delay_us(100);
                        EEPROM_SCLK_0( );
                        delay_us(100);
                        InData <<= 1;
                }
                EEPROM_CS_0( );
}
void EEPROM_Earse(u16 address)
{
        unsigned char i;
        u16 result = 0;
        EEPROM_SCLK_0( );
        EEPROM_CS_0( );
        delay_us(100);
        EEPROM_CS_1( );
        address=(address&0x3FF)|0x1C00;
        for(i = 0; i < 13; i++ )
        { // 8
                if(address & 0x1000) EEPROM_MOSI_1( );
                else EEPROM_MOSI_0( );
                delay_us(100);
                EEPROM_SCLK_1( );
                delay_us(100);
                EEPROM_SCLK_0( );
                delay_us(100);
                address <<= 1;
        }
        delay_us(100);
        EEPROM_CS_0( );
        //EEPROM_SCLK_0( );
        delay_us(1); // 1  
        EEPROM_CS_1( );
        delay_us(1);
        //while(!EEPROM_MISO_IS_HIGH())
        while(!PBin(4))
        { // busy test
                EEPROM_SCLK_0( );
                delay_us(100);
                EEPROM_SCLK_1( );
                delay_us(100);
        }
        EEPROM_SCLK_0( );
        EEPROM_CS_0( );
}


// Reads data stored in memory, at specified address.
u16 EEPROM_Read(u16 address)
{
        unsigned char i;
        u16 result = 0;
        EEPROM_Ewen();
        EEPROM_SCLK_0( );
        EEPROM_CS_0( );
        delay_us(100);
        EEPROM_CS_1( );
        address=(address&0x3FF)|0x1800;
        for(i = 0; i < 13; i++ )
        { // 8
                if(address & 0x1000) EEPROM_MOSI_1( );
                else EEPROM_MOSI_0( );
                delay_us(100);
                EEPROM_SCLK_1( );
                delay_us(100);
                EEPROM_SCLK_0( );
                delay_us(100);
                address <<= 1;
        }
        EEPROM_SCLK_1( );
        delay_us(100);
        EEPROM_SCLK_0( );
        delay_us(100); // 1
        //DO=1;
        delay_us(100);
        for(i = 0; i < 16; i++)
        { // 16
                EEPROM_SCLK_1( );
                delay_us(100);
                result = result << 1;
                if (EEPROM_MISO_IS_HIGH())
                {
                        result++;
                }
                EEPROM_SCLK_0( );
                delay_us(100);
        }
        EEPROM_CS_0( );
        EEPROM_Ewds();
        return(result);
}

// Writes memory location An - A0.
void EEPROM_Write(u16 address,u16 InData)
{
        unsigned char i;
        EEPROM_Ewen(); //3&#245;ê&#188;&#187;ˉê±&#214;′DDò&#187;′&#206;&#190;íDDá&#203;£&#172;
        delay_us(5);
        // 101 A9-A0
        EEPROM_Earse(address);//&#188;ó2&#187;&#188;ó&#213;aDD&#189;á1&#251;&#182;&#188;ò&#187;&#209;ù
        delay_us(5);
        EEPROM_CS_0( );
        EEPROM_SCLK_0( );
        delay_us(100);
        EEPROM_CS_1( );
        address=(address&0x3FF)|0x1400;
        for(i = 0; i < 13; i++)
        { // 8
                if(address & 0x1000)
                        EEPROM_MOSI_1( );
                else
                        EEPROM_MOSI_0( );
                delay_us(100);
                EEPROM_SCLK_1( );
                delay_us(100);
                EEPROM_SCLK_0( );
                delay_us(100);
                address<<=1;
        }
        for(i = 0; i< 16; i++)
        { // 16

                if(InData & 0x8000)
                        EEPROM_MOSI_1( );
                else
                        EEPROM_MOSI_0( );
                delay_us(100);
                EEPROM_SCLK_1( );
                delay_us(100);
                EEPROM_SCLK_0( );
                delay_us(100);
                InData<<=1;
        }
        //EEPROM_SCLK_1( );
        delay_us(100);
        EEPROM_CS_0( );
        //EEPROM_SCLK_0( );
        delay_us(1); // 1  
        EEPROM_CS_1( );
        delay_us(1);
        //while(!EEPROM_MISO_IS_HIGH())
        while(!PBin(4))
        { // busy test
                EEPROM_SCLK_0( );
                delay_us(100);
                EEPROM_SCLK_1( );
                delay_us(100);
        }
        EEPROM_SCLK_0( );
        delay_us(100);
        EEPROM_CS_0( );
        delay_us(100);
        EEPROM_Ewds(); //2&#187;DèòaD′íê&#190;íEWDS
}



在主函数中做如下测试:
        EEPROM_Ewen();
        while (1)
        {
                EEPROM_Write(0x01,0x01);
                data_read_test = EEPROM_Read(0x01);
                }

data_read_test始终返回 0xffff。
通过万用表测试 do引脚,发现该引脚始终为高,怎么都不会进入到busy状态。
请熟悉的同志帮忙看看,代码中有什么问题吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
正点原子
1楼-- · 2019-07-20 11:41
帮顶
v100wtb
2楼-- · 2019-07-20 12:35
AT93C86 執行 Ewen, InData 應該是 1_0011_XXXX_XXXX (13 bits). 你只有送 11 bits.
v100wtb
3楼-- · 2019-07-20 14:29
 精彩回答 2  元偷偷看……
imagewxg
4楼-- · 2019-07-20 17:30
本帖最后由 imagewxg 于 2017-11-21 13:52 编辑

datasheet上要求是11位的,100 11 xxxxxx,ORG是置高,按16位访问的。
imagewxg
5楼-- · 2019-07-20 21:45
 精彩回答 2  元偷偷看……

一周热门 更多>