搜索
bottom↓
回复: 2

求解用stc12c5a60s2单片机和w25p32通信为什么始终读不出来数..

[复制链接]

出0入0汤圆

发表于 2017-3-29 20:06:13 | 显示全部楼层 |阅读模式
#include"M25P32.H"
  #include"uart12.h"


//***********延时函数********************////
  void delay_spi( )//1us  11.0592
{
        _nop_();
}

///***********延时函数3ms*************
void Delay3ms()

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2017-3-29 20:07:28 | 显示全部楼层
#include"M25P32.H"   #include"uart12.h"   //***********延时函数********************////   void delay_spi( )//1us  11.0592 {         _nop_(); }  ///***********延时函数3ms************* void Delay3ms()                //@11.0592MHz {         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;         for(i=0;i<8;i++)         {             CLK=0;             delay_spi( );                   delay_spi( );                    delay_spi( );                   delay_spi( );                    delay_spi( );                   delay_spi( );              s=temp&0x80;                        if(s==0x80)               DI=1;            else                   DI=0;               delay_spi( );                   delay_spi( );                    delay_spi( );                     delay_spi( );                          delay_spi( );                           delay_spi( );                    CLK=1;              delay_spi( );                   delay_spi( ); delay_spi( );                   delay_spi( ); delay_spi( );                   delay_spi( );              temp=temp<<1;          }         }     /*****等待写入结束*****1 0 */ 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( );                    delay_spi( );                     delay_spi( );                         CLK=1;                  delay_spi( );                   delay_spi( ); delay_spi( );                   delay_spi( );                 }         }         else//检测忙         {                   if(state==2)                 {                         do                         {                                 addr=read_sr(0x35);                                 SendData(addr);                         }                   while(addr&0x80);                 }                 do                 {                         addr=read_sr(0x05);                         SendData(addr);                 }                 while(addr&0x01);         } }   //*****发送允许指令*************  void  write_sr() {    CS=0;    send_spi(WREN);        /////写使能06     CS=1;  }    //**********读取一个字节********************/   unsigned  char  read_spi()  {    unsigned char i,data_read=0;    for(i=0;i<8;i++)    {                   data_read<<=1;                   CLK=0;                          delay_spi( );                   delay_spi( );                    delay_spi( );                   delay_spi( );                    delay_spi( );                                 CLK=1;                 delay_spi( );                   delay_spi( );                    delay_spi( );                     delay_spi( );                     delay_spi( );                   delay_spi( );          data_read=data_read|DO;                   ///看是否每一位输出数据      }       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();         return   read_1;  }  //****写入多个字节***********/   void  write_ye(u16 *P, u32 sendaddr,u8 j ) {                    unsigned char i;                  unsigned char FlashData,FlashData1;             write_sr();                 waitwiriteEND(1,0);             CS=0;         send_spi(PP);    ///////页数据指令 //                 send_spi(WRSR          );              send_spi((sendaddr&0xff0000)>>16);             send_spi((sendaddr&0xff00)>>8);             send_spi(sendaddr&0xff);                   Delay3ms();                 for(i=0;i<j;i++)                 {                                              FlashData = P[i];  //                           FlashData1 = P[i]>>8;  //                        FlashData1 = P[i]>>8;                      send_spi(FlashData); //                    send_spi(FlashData1);                 }                    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(READ);                  ///读数据指令         send_spi((readaddr&0xff0000)>>16);         send_spi((readaddr&0xff00)>>8);         send_spi(readaddr&0xff);          while(rx--)          { //                   save_H=read_spi();                    save_L=read_spi(); //                   atey[i]=save_L+save_H<<8 ;                         atey[i]=save_L;                     i++;          }      CS=1;  } /*********扇区擦除***********/ 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;//结束,关闭模块   //        waitwiriteEND(2,0);       Delay300ms();  //        CMD_write_SR(0x00,0x00);//清除状态寄存器 }    //*****读ID************************    void ccc() {         unsigned int i;       CS=0;           send_spi(0x9f);      waitwiriteEND(0,30);         for(i=0;i<5;i++)         {                      atey[i]=read_spi();          }       CS=1;       CS=0;          send_spi(0xAB);         for(i=5;i<10;i++)         {           atey[i]= read_spi();         }             waitwiriteEND(0,30);   CS=0;  }

出0入0汤圆

发表于 2017-3-30 23:25:39 | 显示全部楼层
这样子没注意代码格式一窝蜂传上来,大家一看都没了兴趣。注意下代码格式,或者上传一份.c/.txt格式文档,总会有人帮你看的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 08:08

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

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