搜索
bottom↓
回复: 2

用stc12c5a60s2与m25p32通信写的进去就是都读不出来

[复制链接]

出0入0汤圆

发表于 2017-4-15 11:09:03 | 显示全部楼层 |阅读模式
各位坛友帮忙看哈   谢谢了
程序如下
         #include"M25P32.H"
         #include"uart12.h"

          unsigned char FlashData,FlashData1;

//***********延时函数********************////

  void delay_spi( )//1us  11.0592
{
              _nop_();
                      _nop_();
                      _nop_();
                          _nop_();
                          _nop_();

}


///***********延时函数3ms*************          

void Delay3ms()                  
{
        unsigned char i, j;

        _nop_();
        _nop_();
        i = 33;
        j = 66;
        do
        {
                while (--j);
        }   while (--i);
}

//************************************
//**/****** 延时函数300ms*************

void  Delay300ms()                //@11.0592MHz
{

        unsigned char i, j, k;
        _nop_();
        _nop_();
        i = 13;
        j = 156;
        k = 83;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

/////******初始化spi
  void         int_spi()
  {
     CS=1;
         CLK=1;
  }


////*******************发送一个字节**********************/

void    send_spi(unsigned char dat)
  {
     unsigned   char s=0,i;
         unsigned char         temp=0;
         temp=dat;
         CS=0;
        for(i=0;i<8;i++)
        {
            CLK=0;
            delay_spi();                                             
            s=temp&0x80;
                            
          if(s==0x80)
                DI=1;
           else
                    DI=0;         
       
                                        
                 delay_spi();
                 delay_spi();                  
                 CLK=1;
             delay_spi();                 
             delay_spi();
                 delay_spi();
             temp=temp<<1;            
        }
         CS=1;        
}


void waitwiriteEND(unsigned char state,unsigned int number)
{
        unsigned int i;
        unsigned char addr;
        if(state==0)//等待模式
        {

                for(i=0;i<number;i++)
                {

                   CLK=0;
                   delay_spi();         
                   delay_spi();
                   CLK=1;
                   delay_spi();
                   delay_spi();  
                   delay_spi();

                }

        }


          if(state==1)
                {
                        do
                          {

                                 addr=read_sr(0x01);           ///写状态寄存器
                         
                         }
                      while(addr&0x80);
                }



//                do
//
//                 {
//                        addr=read_sr(0x05);           ///读状态寄存器
//                 
//                 }
//                while(addr&0x01);
//        }
}


//*****发送允许指令*************

void  write_sr()
{
           CS=0;
            CLK=0;
           send_spi(WREN);        /////写使能06
                 CLK=1;
           CS=1;

}


///**********读取一个字节**********************

unsigned  char  read_spi()
{
          unsigned char i;
    unsigned  tdata;

    for (i=0;i<8;i++)                     
    {   
                       
       CLK=1;                                 
        tdata = (tdata<<1);  //xxxxxxx0

      CLK=0;  
                                                               
        if(DO==1)
        {
            tdata |=0x01;  //xxxxxxx0|00000001        
        }
        else
        {
            tdata &=~0x01;  //xxxxxxx0&11111110               
        }
    }
    return tdata;
                  
//   unsigned char i,data_read=0;
//     
//   for(i=0;i<8;i++)
//    {
//                                                   
//   
//           data_read<<=1;                 
//               CLK=1;                        
//               delay_spi();
//                   delay_spi();          
//                    
//                            CLK=0;                  
//                              
//           data_read=data_read|DO;                   ///看 c是否每一位输出数据  
//                                                                 
//    }
//          
//    return   data_read;
  }



//***读取寄存器***************

   unsigned  char  read_sr(unsigned char Send_Read_Reg_CMD)
{

    unsigned        char  read_1;
     CS=0;
         send_spi(Send_Read_Reg_CMD );
         read_1=read_spi();
          CS=1;
        return   read_1;

}

  

//****写入多个字节***********/

void   write_ye(u16 *P, u32 sendaddr,u8 j )
{

                     unsigned char i;

                write_sr();                 ////允许写
            
                        waitwiriteEND(1,0);
    ///   while(FLASHBUSY());         ////
                            CS=0;       

//         waitwiriteEND(2,0);         

        send_spi(PP);     ///////页数据指令  
            send_spi((sendaddr&0xff0000)>>16);
            send_spi((sendaddr&0xff00)>>8);
            send_spi(sendaddr&0xff);       
                       
                               
                  delay_spi();
                  delay_spi();

                for(i=0;i<j;i++)
                {

                           delay_spi();
                           FlashData = P[i];
                 send_spi(FlashData);

                }

                  CS=1;
              Delay3ms();
                                   
       
                  
}

///***********读取多个字节***********/

void  read_data(u32 readaddr, u8   rx)                 ////地址+
{

       
          unsigned int i=0;
          unsigned char save_H,save_L;
         
          write_sr();             
      CS=0;

        send_spi(0x03);                     ///读数据指令
        send_spi((readaddr&0xff0000)>>16);          //地址1高
        send_spi((readaddr&0xff00)>>8);            //地址2
        send_spi(readaddr&0xff);                   //地址3低
        send_spi(0x00);                                           ///清读

        while(rx--)
         {
                                                   
                      delay_spi( );
                   save_L=read_spi();                                            
                        atey[i]=save_L;
                           i++;         
         }

     CS=1;
     Delay3ms();

}

/*********扇区擦除***********/

void Erase_datac( u32 readAddr,unsigned char c_addr)
{
        /********允许写入命令*******/
          write_sr();
      CS=0;
         
          send_spi( SE );//发送扇区擦除命令

        if(c_addr==1)
         {

                 send_spi((readAddr & 0xFF0000) >> 16);//地址1高
                 send_spi((readAddr & 0xFF00) >> 8);//地址2
                 send_spi(readAddr & 0xFF);//地址3低

         }
         
          Delay3ms();
          CS=1;//结束,关闭模块
  
      Delay300ms();
  
}



//*****读ID************************
//   void ccc()
//{
//        unsigned int i;
//      CS=0;
//         send_spi(0x90);
//     waitwiriteEND(0,30);
//        for(i=0;i<5;i++)
//        {       
//             atey[i]=read_spi();
//         }
//
//     CS=1;
//     CS=0;
////        send_spi(0xAB);
//                 send_spi(0x9f);
//        for(i=5;i<10;i++)
//        {
//          atey[i]= read_spi();
//        }         
//   waitwiriteEND(0,30);
//  CS=0;
//}
//***********主程序******/////////////////////////////***
#include"main.h"
#include"M25P32.H"
#include"UART12.h"



sbit led=P2^6;
sbit led2=P2^7;

   
   xdata unsigned  int  atey[16];


     unsigned  char but[8]={"asdfghjk"};


void     main(void)
{


         int i=0;
     uart12_1();
         int_spi();        /////初始
         
                  
         while(1)
         {
                    
           Erase_datac(FLASH_WriteAddress,1);        //扇区擦除                                                                 
                   led=0;                                                                                                                                                                        
           write_ye(but,FLASH_WriteAddress,8);         ///写入数据
                   led2=0;       
                    
//                   led2=0;                                                                                                
//                   Delay3ms();
                   Delay3ms();
           read_data(FLASH_WriteAddress, 8);          //读取数据
                   led2=0;
                                                           
//                      ccc();
           SendString("out:123");

  //           led=0;
  //             SendString(atey);

             SendString("\r\n");
                 
                                                                                  

//                for(i=0;i<8;i++)
//                 {
//
//                           led=0;
//                      SendData(atey[i]);
//
//                 }


               
                  
         }

}





阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2017-4-15 11:10:56 | 显示全部楼层
一直没有发现问题出在哪里

出0入0汤圆

 楼主| 发表于 2017-4-15 11:13:26 | 显示全部楼层
这是指令部分

#include"main.h"



extern  xdata   unsigned int atey[16];


#define    WREN       0x06                  ////写使能
#define    WRDI       0x04                  ///写禁止

#define    RDSR       0x05        ///读状态寄存器

#define    WRSR                  0x01        ///写状态寄存器

#define    READ              0x03            ///读数据字节
#define   FAST_READ              0x0B          ///快速读数据字节
#define   PP                         0x02          ///页编程
#define   SE             0xD8          //扇区擦除
#define   BE             0xc7          ///批量擦除
#define   DP                         0xB9          ///深度掉电
#define          ID                         0x90          ///阅读制造商/设备ID                          
#define   RDID                         0x9f           //读取识别
#define          OTP                         0x3A           ////输入OTP模式


#define     FLASH_WriteAddress        0x3ffffe       





sbit    CS=P1^0;                                   //片选使能端
sbit    DO=P2^1;                              ///输出数据
sbit    WP=P1^2;                                  ////写保护
sbit    HOLD=P1^3;                                  ///HOLD输入
sbit    CLK=P2^3;                                  ///串行时钟输入
sbit    DI=P2^2;                                          ///输入数据
         


//extern  void waitwiriteEND_1(u16 x);
extern        void delay_spi( );//1us 11M 20
extern         void Delay3ms();
extern   void Delay300ms();


                                                                          
extern     void          int_spi();
extern     void      send_spi(unsigned char dat);
extern     void      write_sr();
extern     unsigned  char   read_spi();
extern     unsigned   char   read_sr(unsigned char Send_Read_Reg_CMD);
void    waitwiriteEND(unsigned char state,unsigned int number);
extern     void write_ye(u16 *P, u32 sendaddr,u8 j );         ////写多个字节
extern     void read_data(u32 readaddr, u8   rx);                 ////读多个字节
extern     void Erase_datac( u32 readAddr,unsigned char c_addr);  ////扇区擦除
extern                         void ccc(void);//读ID


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

本版积分规则

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

GMT+8, 2024-6-8 16:11

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

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