读状态寄存器是只发0x57对吧?为什么收回的是0x4E呢?正常应该是0xA8吧?PS:现在是SPI的方式#include <MSP430X14X.h>#include "Flash_SPI.h"unsigned char Flash_Data[512]; void SPI_Init(void){ // P3.1 P3.2 P3.3作为SPI的管脚 P3SEL = BIT3 + BIT2 + BIT1; //P3.1作为输出 P3DIR |= BIT1; //P3.0作为输出 P3DIR |= BIT0; //P3.3作为输出 P3DIR |= BIT3; //P3.0输出高电平 P3OUT = BIT0; //P3.1输出高电平 P3OUT = BIT1; //P3.3输出高电平 P3OUT = BIT3; // 以下设置SPI口的参数 U0CTL = 0X00; //将寄存器的内容清零 //数据为8比特,选择SPI模式,单片机为主机模式 U0CTL |= CHAR + SYNC + MM; U0TCTL = 0X00; //将寄存器的内容清零 // 时钟源为SMCLK,选择3线模式 U0TCTL = CKPH + SSEL1 + SSEL0 + STC; UBR0_0 = 0X45; //波特率为115200 UBR1_0 = 0X00; UMCTL_0 = 0X49; //调整寄存器 ME1 = USPIE0; //SPI0模块允许 IE1 |= URXIE0; //接收中断允许 IE1 |= UTXIE0; //发送中断允许 }void Init_CLK(void){ unsigned int i; BCSCTL1 = 0X00;//将寄存器的内容清零 //XT2震荡器开启 //LFTX1工作在低频模式 //ACLK的分频因子为1 do { IFG1 &= ~OFIFG; // 清除OSCFault标志 for (i = 0x20; i > 0; i--); } while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1 BCSCTL2 = 0X00; //将寄存器的内容清零 BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1 BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1}void AT45DB161_cs_low(){ P3OUT &=0xfe; }void AT45DB161_cs_high(){ P3OUT |=0x01;}void Delay_ms(unsigned long nValue)//毫秒为单位,8MHz为主时钟{ unsigned long nCount; int i; unsigned long j; nCount = 2667; for(i = nValue;i > 0;i--) { for(j = nCount;j > 0;j--); } return;}void Delay_us(unsigned long nValue)//微秒为单位,8MHz为主时钟{ int nCount; int i; int j; nCount = 3; for(i = nValue;i > 0;i--) { for(j = nCount;j > 0;j--); } return;}//Send one byte via SPIunsigned char write_AT45DB161_byte(const unsigned char data){ while (IFG1&UTXIFG0 ==0); // wait while not ready for TX halSPITXREADY (IFG1&UTXIFG0) TXBUF0=data; // write while (IFG1&URXIFG0 ==0); // wait for RX buffer (full) return (RXBUF1);}//Read register statusunsigned char AT45DB161_ReadStatus(void){ unsigned char status; AT45DB161_cs_low(); status=write_AT45DB161_byte(0x57); 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=write_AT45DB161_byte(0xff); 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();}void main(){ unsigned int i; WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗 Init_CLK(); SPI_Init(); 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=0; AT45DB161_MainMemoryPageRead(100,0,512,Flash_Data); //page 100,addr 0,length 512 while(1);}哪里有问题求帮助啊。。。:Sad: