[51单片机] 读写25LC040的问题

[复制链接]
4943|1
 楼主| 比神乐 发表于 2024-10-21 16:10 | 显示全部楼层 |阅读模式
proteus仿真图

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

  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5.        
  6. sbit SCK=P2^0;
  7. sbit SI=P2^1;
  8. sbit SO=P2^2;
  9. sbit CS=P2^3;
  10. // ???SPI??????  
  11. void SPI_Init(void); // SPI???  
  12. void SPI_SendByte(unsigned char byte); // SPI??????  
  13. unsigned char SPI_ReceiveByte(void); // SPI??????  
  14. void SPI_CS_Low(void); // ??????  
  15. void SPI_CS_High(void); // ??????  

  16. unsigned char readData,readData1,readData2;
  17. // 25LC040???  
  18. #define READ_INSTRUCTION  0x03 // ???(??25LC040,????????????)  
  19. #define WRITE_INSTRUCTION 0x02 // ???(??,??????????)  
  20. #define WREN_INSTRUCTION  0x06 // ?????  
  21.   
  22. // ????  
  23. void EEPROM_WriteByte(unsigned char address, unsigned char date) {  
  24.     SPI_CS_Low(); // ??????  
  25.     SPI_SendByte(WREN_INSTRUCTION); // ???????  
  26.     SPI_CS_High(); // ??????,???????(??????)  
  27.       
  28.     SPI_CS_Low(); // ????????  
  29.     SPI_SendByte(WRITE_INSTRUCTION); // ?????  
  30.     //SPI_SendByte((address >> 8) & 0xFF); // ???????(??25LC040,?????)  
  31.     SPI_SendByte(address); // ???????  
  32.     SPI_SendByte(date); // ????  
  33.     SPI_CS_High(); // ??????,?????  
  34.       
  35.     // ???????????,?????EEPROM????  
  36. }  
  37.   
  38. unsigned char EEPROM_ReadByte(unsigned char address) {  
  39.     unsigned char date;  
  40.       
  41.     SPI_CS_Low(); // ??????  
  42.     SPI_SendByte(READ_INSTRUCTION); // ?????  
  43.     //SPI_SendByte((address >> 8) & 0xFF); // ???????(??25LC040,?????)  
  44.     SPI_SendByte(address ); // ???????  
  45.     date = SPI_ReceiveByte(); // ????  
  46.     SPI_CS_High(); // ??????,?????  
  47.       
  48.     return date;  
  49. }  

  50. void EEPROM_ReadByte1(unsigned char address) {  
  51.     unsigned char date;  
  52.       
  53.     SPI_CS_Low(); // ??????  
  54.     SPI_SendByte(READ_INSTRUCTION); // ?????  
  55.     //SPI_SendByte((address >> 8) & 0xFF); // ???????(??25LC040,?????)  
  56.     SPI_SendByte(address ); // ???????  
  57.     readData = SPI_ReceiveByte(); // ????
  58.                 readData1 = SPI_ReceiveByte();
  59.          readData2 = SPI_ReceiveByte();
  60.     SPI_CS_High(); // ??????,?????  
  61.       
  62.    // return date;  
  63. }  
  64.   
  65. void main(void) {
  66.                 uint i;
  67.                
  68.     SPI_Init(); // ???SPI??  
  69.       
  70.     // ??:?????EEPROM  
  71.     EEPROM_WriteByte(0x00, 0xAB); // ???0x0000??0xAB
  72.                 for(i=0;i<10000;i++);
  73.     EEPROM_WriteByte(0x01, 0x55); // ???0x0000??0xAB
  74.                 for(i=0;i<10000;i++);
  75.                 EEPROM_WriteByte(0x02, 0x66); // ???0x0000??0xAB
  76.                 for(i=0;i<10000;i++);
  77.     // ??:?EEPROM????  
  78.     EEPROM_ReadByte1(0); // ???0x0000????  
  79.     P1=  readData;
  80.         _nop_();
  81.                         _nop_();
  82.                 //readData1 = EEPROM_ReadByte(0x01); // ???0x0000????  
  83.     P3=  readData1;
  84.         _nop_();
  85.                         _nop_();
  86.                 //readData2 = EEPROM_ReadByte(0x02); // ???0x0000????  
  87.     P0=  readData2;
  88.     // ?????????????????  
  89.       
  90.     while (1) {  
  91.         // ???  
  92.     }  
  93. }  
  94.   
  95. // ????????SPI???????  
  96. void SPI_Init(void) {  
  97.     // ???SPI??,????????  
  98. }  
  99.   
  100. void SPI_SendByte(unsigned char byte) {  
  101.     // ??SPI??????
  102.                 uchar i;
  103.                 for(i=0;i<8;i++)
  104.                 {
  105.                         SCK=0;
  106.                         _nop_();
  107.                         _nop_();
  108.                         if((byte&0x80)==0x80)
  109.                                 SI=1;
  110.                         else
  111.                                 SI=0;
  112.                         _nop_();
  113.                         _nop_();
  114.                         byte<<=1;
  115.                         SCK=1;
  116.                         _nop_();
  117.                         _nop_();
  118.                 }
  119. }  
  120.   
  121. unsigned char SPI_ReceiveByte(void) {  
  122.     // ??SPI??????  
  123.                 uchar i,dat=0;
  124.         for(i;i<8;i++)
  125.         {
  126.                 dat<<=1;
  127.                 SCK=1;                        //第一位
  128.                 _nop_();
  129.                         _nop_();
  130.         SCK=0;
  131.                 _nop_();
  132.                         _nop_();
  133.                 SO=1;
  134.                 if(SO)
  135.                         dat|=1;
  136.                
  137.                 _nop_();
  138.                         _nop_();
  139.                
  140.         }
  141.                
  142.                
  143.     return dat; // ??????????????  
  144. }  
  145.   
  146. void SPI_CS_Low(void) {  
  147.     // ???????  
  148.     CS = 0; // ?????????P1.0??  
  149. }  
  150.   
  151. void SPI_CS_High(void) {  
  152.     // ???????  
  153.     CS = 1; // ?????????P1.0??  
  154. }
只有第一次读的是对的。
请问高手,哪里错了?谢谢

本帖子中包含更多资源

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

×
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; // ??????????????  

}  
试试这段代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部