AT45DB161用MSP430F149普通I/O口模拟SPI读写数据状态寄存器读数总是0x00

2019-03-24 12:20发布

#include  <msp430x14x.h>   
unsigned char Flash_Data[512];  unsigned char Flash_Data1[512];void AT45DB161_cs_low(void);void AT45DB161_cs_high(void);void AT45DB161_si_low(void);void AT45DB161_si_high(void);void AT45DB161_sck_low(void);void AT45DB161_sck_high(void);unsigned char AT45DB161_so(void);void write_AT45DB161_byte(unsigned char data);unsigned char read_AT45DB161_byte(void);//===============================================================================


//================================================================================void  init_AT45DB161(void);//===============================================================================////P64 SO            IN//P65 CS            OUT       低有效//P66 SCK           OUT//P67 SI            OUTvoid init_AT45DB161(void)    {    P6OUT|=0xe0;           //1110 0000     CS SCK SI输出1    }//片选有效void AT45DB161_cs_low(void)    {    P6OUT&=0xdf;      //1101 1111     CS=0   P65 CS     }//片选无效void AT45DB161_cs_high(void)    {    P6OUT|=0x20;       //0010 0000    CS=1   P65 CS     }//SI置低void AT45DB161_si_low(void)    {    P6OUT&=0x7f;    //0111 1111         SI=0    P67 SI    }//SI置高void AT45DB161_si_high(void)    {    P6OUT|=0x80;     //1000 0000        SI=1    P67 SI    }//SCK置低void AT45DB161_sck_low(void)    {    P6OUT&=0xbf;    //1011 1111         SCK=0     P66 SCK     }//SCK置高void AT45DB161_sck_high(void)    {    P6OUT|=0x40;     //0100 0000        SCK=1      P66 SCK     }    
void delay_AT5DB161(unsigned char time){  while(time--);}
//读SO状态unsigned char AT45DB161_so(void){    unsigned char c;    c=P6IN;    c=c&0x10;    if(c==1)    {         c=1;    }    else    {        c=0;    }    return(c);}        //写1个字节void write_AT45DB161_byte(unsigned char data)//-------------------------{    unsigned int i;    AT45DB161_cs_low();    AT45DB161_sck_low();        for(i=0;i<8;i++)    {        if(data&0x80)          AT45DB161_si_high();        else           AT45DB161_si_low();        delay_AT5DB161(20);        AT45DB161_sck_low();         delay_AT5DB161(20);        AT45DB161_sck_high();          data<<=1;            }    AT45DB161_cs_high();}//读1个字节unsigned char read_AT45DB161_byte(void)//-------------------------{    unsigned int i;    unsigned char data,c;    AT45DB161_cs_low();    data=0;    for(i=0;i<8;i++)    {      AT45DB161_sck_high();      delay_AT5DB161(20);      AT45DB161_sck_low();      delay_AT5DB161(20);      c=AT45DB161_so();      if(c)      {        data|=0x80>>i;      }      else      {        data>>=1;      }                 }    AT45DB161_cs_high();    return(data);}
//Read register statusunsigned char AT45DB161_ReadStatus(void){    unsigned char status;    AT45DB161_cs_low();    write_AT45DB161_byte(0xd7);    write_AT45DB161_byte(0x00);    write_AT45DB161_byte(0x00);    write_AT45DB161_byte(0x00);    status=read_AT45DB161_byte();    AT45DB161_cs_high();       return(status);}

//Read from AT45DB161 to MSP430  ----Main Memory Page Read(52H+24bits addr+32bits dc)void AT45DB161_MainMemoryPageRead(unsigned int pageaddr,unsigned int baseaddr,unsigned int len,unsigned char *pbuf){  unsigned int i;  while(!(AT45DB161_ReadStatus()&0x80));  AT45DB161_cs_low();  write_AT45DB161_byte(0x52);  write_AT45DB161_byte((unsigned char)(pageaddr>>6));  write_AT45DB161_byte((unsigned char)((pageaddr<<2)|(baseaddr>>8)));  write_AT45DB161_byte((unsigned char)(baseaddr));  for(i=0;i<4;i++)    write_AT45DB161_byte(0x00);  for(i=0;i<len;i++)    pbuf=read_AT45DB161_byte();   AT45DB161_cs_high();}
//Write from MSP430 to buffer-----Buffer1/2 Write(84H/87H+14bits dc+10bits addr) void AT45DB161_BufferWrite(unsigned char nbuf,unsigned int baseaddr,unsigned int len,unsigned char *pbuf){  unsigned int i;  while(!(AT45DB161_ReadStatus()&0x80));  AT45DB161_cs_low();  switch(nbuf)  {  case 1: write_AT45DB161_byte(0x84);          break;  case 2: write_AT45DB161_byte(0x87);          break;  }  write_AT45DB161_byte(0x00);  write_AT45DB161_byte((unsigned char)(baseaddr>>8));  write_AT45DB161_byte((unsigned char)baseaddr);  for(i=0;i<len;i++)    write_AT45DB161_byte(pbuf);  AT45DB161_cs_high();}
//Write from MSP430 to AT45DB161 through Buffer------Main Memory Page Program Through Buuffer1/2//---------------------------------------------------void AT45DB161_MainMemoryPageProgramThroughBuuffer(unsigned char nbuf,unsigned int pageaddr,unsigned int baseaddr,unsigned int len,unsigned char *pbuf){  while(!(AT45DB161_ReadStatus()&0x80));  AT45DB161_cs_low();  switch(nbuf)  {  case 1: write_AT45DB161_byte(0x82);          break;  case 2: write_AT45DB161_byte(0x85);          break;  }   write_AT45DB161_byte((unsigned char)(pageaddr>>6));  write_AT45DB161_byte((unsigned char)((pageaddr<<2)|(baseaddr>>8)));  write_AT45DB161_byte((unsigned char)(baseaddr));  AT45DB161_cs_high();}

/* 初始化P6口 */void Iint_Port6(void)                      {      P6SEL=0x00;                          //0000 0011 P6口的低两位,设置为ADC12功能     P6DIR=0xe0;                          //1110 0000    }  void Iint_OSCF(void){ int i; BCSCTL1=0x04;                   //ACLK来源于LFXT1低频模式,其频率为32K,XT2开启 BCSCTL2=0x88;                   //MCLK与SMCLK均来源于XT2,分频系数为1,频率为8M  do   {  IFG1 &= ~OFIFG;                       // Clear OSCFault flag  for (i = 0xFF; i > 0; i--);           // Time for flag to set  }  while ((IFG1 & OFIFG) != 0);          // OSCFault flag still set                                   }
void main(void){  unsigned int i;  //unsigned char Flash_Data[512];  WDTCTL=WDTPW+WDTHOLD;   Iint_OSCF();  Iint_Port6();  init_AT45DB161();    for(i=0;i<512;i++)                   Flash_Data=i;   AT45DB161_MainMemoryPageProgramThroughBuuffer(1,100,0,512,Flash_Data);  //buffer 1,page 100,addr 0,length 512  for(i=0;i<512;i++)               //清空Flash_Data    Flash_Data=0;   AT45DB161_MainMemoryPageRead(100,0,512,Flash_Data);    //page 100,addr 0,length 512  while(1);}


以上是程序,已经测试很久了。。。不知道问题出在哪里了?是不是I/O口模拟SPI时序除了问题?麻烦对这方面了解的版友帮帮忙吧。。。小女子跪谢了~~~在线等待 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
nothingo
2019-03-24 19:19
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章