比神乐 发表于 2024-10-21 16:10

读写25LC040的问题

proteus仿真图

程序
#include <reg51.h> // ??8051?????
#include <intrins.h>

#define uchar unsigned char
#define uintunsigned int
       
sbit SCK=P2^0;
sbit SI=P2^1;
sbit SO=P2^2;
sbit CS=P2^3;
// ???SPI??????
void SPI_Init(void); // SPI???
void SPI_SendByte(unsigned char byte); // SPI??????
unsigned char SPI_ReceiveByte(void); // SPI??????
void SPI_CS_Low(void); // ??????
void SPI_CS_High(void); // ??????

unsigned char readData,readData1,readData2;
// 25LC040???
#define READ_INSTRUCTION0x03 // ???(??25LC040,????????????)
#define WRITE_INSTRUCTION 0x02 // ???(??,??????????)
#define WREN_INSTRUCTION0x06 // ?????

// ????
void EEPROM_WriteByte(unsigned char address, unsigned char date) {
    SPI_CS_Low(); // ??????
    SPI_SendByte(WREN_INSTRUCTION); // ???????
    SPI_CS_High(); // ??????,???????(??????)
      
    SPI_CS_Low(); // ????????
    SPI_SendByte(WRITE_INSTRUCTION); // ?????
    //SPI_SendByte((address >> 8) & 0xFF); // ???????(??25LC040,?????)
    SPI_SendByte(address); // ???????
    SPI_SendByte(date); // ????
    SPI_CS_High(); // ??????,?????
      
    // ???????????,?????EEPROM????
}

unsigned char EEPROM_ReadByte(unsigned char address) {
    unsigned char date;
      
    SPI_CS_Low(); // ??????
    SPI_SendByte(READ_INSTRUCTION); // ?????
    //SPI_SendByte((address >> 8) & 0xFF); // ???????(??25LC040,?????)
    SPI_SendByte(address ); // ???????
    date = SPI_ReceiveByte(); // ????
    SPI_CS_High(); // ??????,?????
      
    return date;
}

void EEPROM_ReadByte1(unsigned char address) {
    unsigned char date;
      
    SPI_CS_Low(); // ??????
    SPI_SendByte(READ_INSTRUCTION); // ?????
    //SPI_SendByte((address >> 8) & 0xFF); // ???????(??25LC040,?????)
    SPI_SendByte(address ); // ???????
    readData = SPI_ReceiveByte(); // ????
                readData1 = SPI_ReceiveByte();
       readData2 = SPI_ReceiveByte();
    SPI_CS_High(); // ??????,?????
      
   // return date;
}

void main(void) {
                uint i;
               
    SPI_Init(); // ???SPI??
      
    // ??:?????EEPROM
    EEPROM_WriteByte(0x00, 0xAB); // ???0x0000??0xAB
                for(i=0;i<10000;i++);
    EEPROM_WriteByte(0x01, 0x55); // ???0x0000??0xAB
                for(i=0;i<10000;i++);
                EEPROM_WriteByte(0x02, 0x66); // ???0x0000??0xAB
                for(i=0;i<10000;i++);
    // ??:?EEPROM????
    EEPROM_ReadByte1(0); // ???0x0000????
    P1=readData;
        _nop_();
                        _nop_();
                //readData1 = EEPROM_ReadByte(0x01); // ???0x0000????
    P3=readData1;
        _nop_();
                        _nop_();
                //readData2 = EEPROM_ReadByte(0x02); // ???0x0000????
    P0=readData2;
    // ?????????????????
      
    while (1) {
      // ???
    }
}

// ????????SPI???????
void SPI_Init(void) {
    // ???SPI??,????????
}

void SPI_SendByte(unsigned char byte) {
    // ??SPI??????
                uchar i;
                for(i=0;i<8;i++)
                {
                        SCK=0;
                        _nop_();
                        _nop_();
                        if((byte&0x80)==0x80)
                                SI=1;
                        else
                                SI=0;
                        _nop_();
                        _nop_();
                        byte<<=1;
                        SCK=1;
                        _nop_();
                        _nop_();
                }
}

unsigned char SPI_ReceiveByte(void) {
    // ??SPI??????
                uchar i,dat=0;
        for(i;i<8;i++)
        {
                dat<<=1;
                SCK=1;                        //第一位
                _nop_();
                        _nop_();
        SCK=0;
                _nop_();
                        _nop_();
                SO=1;
                if(SO)
                        dat|=1;
               
                _nop_();
                        _nop_();
               
        }
               
               
    return dat; // ??????????????
}

void SPI_CS_Low(void) {
    // ???????
    CS = 0; // ?????????P1.0??
}

void SPI_CS_High(void) {
    // ???????
    CS = 1; // ?????????P1.0??
}只有第一次读的是对的。
请问高手,哪里错了?谢谢

XZL 发表于 2024-11-11 15:13

unsigned char SPI_ReceiveByte(void) {

    // ??SPI??????

uhar i,dat=0;
          SO=1;
      for(i;i<8;i++)

      {
                dat<<=1;
                SCK=1;                        //第一位
               _nop_();
               _nop_();
            if(SO)
                   dat|=1;
               _nop_();
      SCK=0;
               _nop_();
               _nop_();
      }
    return dat; // ??????????????

}
试试这段代码。
页: [1]
查看完整版本: 读写25LC040的问题