dianyuan 发表于 2010-8-15 11:06:50

用MSP430读写AT25F1024程序

/**********************************************************/

////       MSP430 MCU                   AT25F1024
////   ------------------         ------------------
////   |      P14       | ------> |      CS       |
////   |      P30       | ------> |      SDO       |
////   |      P31       | ------> |      WP-       |
////   |      P32       | ------> |      SCLK       |
////   |      P33       | ------> |      SDI       |
////   ------------------         ------------------
/*********************************************************/
#include <msp430x14x.h>

#define AT25_DIR_CS             P1DIR
#define AT25_IN_CS            P1IN
#define AT25_OUT_CS             P1OUT
#define AT25_DIR                P3DIR
#define AT25_IN               P3IN
#define AT25_OUT                P3OUT

#define AT25_SDO                BIT0
#define AT25_WP               BIT1
#define AT25_SCLK               BIT2
#define AT25_SDI                BIT3                //定义MSP430的端口
#define AT25_CS               BIT4

#define AT25_SDO_LO             AT25_OUT &= ~AT25_SDO
#define AT25_SDO_HI             AT25_OUT |= AT25_SDO
#define AT25_WP_LO            AT25_OUT &= ~AT25_WP
#define AT25_WP_HI            AT25_OUT |= AT25_WP
#define AT25_SCLK_LO            AT25_OUT &= ~AT25_SCLK
#define AT25_SCLK_HI            AT25_OUT |= AT25_SCLK
#define AT25_SDI_LO             AT25_OUT &= ~AT25_SDI
#define AT25_SDI_HI             AT25_OUT |= AT25_SDI
#define AT25_CS_LO            AT25_OUT_CS &= ~AT25_CS
#define AT25_CS_HI            AT25_OUT_CS |= AT25_CS

#define        WREN        0x06
#define        WRDI        0x04
#define        RDSR        0x05
#define        WRSR        0x01
#define        READ        0x03
#define        WRITE        0x02
#define CHIPERASE 0x62
#define SECTIONERASE 0x52

void AT25_Delay(unsigned int dtime);
void SPI_Init(void);
void SPI_DCS(void);               
void SPI_CS(void);       
void SPI_WRITE_BYTE(unsigned char nbyte);
unsigned char SPI_READ_BYTE(void);
void SPI_WRITE_WAITDONE(void);
void SPI_WRITE_STATUS(unsigned char bstatus);
unsigned char SPI_READ_STATUS(void);
void SPI_READ_FLASH(unsigned long address,unsigned long length,unsigned char* buffer);
void SPI_WRITE_FLASH(unsigned long address,unsigned char bdata);
void SPI_CHIP_ERASE(void);
void SPI_SECTION_ERASE(unsigned short sectionno);

void AT25_Delay(unsigned int dtime)
{
      unsigned int temp;
      for(temp=0;temp<dtime;temp++);
}
void SPI_Init(void)
{
      AT25_DIR_CS|=AT25_CS;
      AT25_CS_HI;//P14 -CS
      
      AT25_DIR |= (AT25_SDI + AT25_WP+AT25_SCLK);
      AT25_WP_HI;
      AT25_SCLK_LO;
      AT25_SDI_LO;
}
void SPI_DCS(void)
{
      AT25_CS_HI;
}
               
void SPI_CS(void)
{
      AT25_CS_LO;
}

void SPI_WRITE_BYTE(unsigned char nbyte)
{
        unsigned char temp;
      
      //AT25_SDI_LO;
      for(temp=8;temp>0;temp--)
      {
                AT25_SDI_LO;
                if(nbyte&BIT7) AT25_SDI_HI;
                AT25_SCLK_LO;
                //AT25_Delay(1);
                AT25_SCLK_HI;
                //AT25_Delay(1);
                nbyte <<=1;
      }      
      
}

unsigned char SPI_READ_BYTE(void)
{
        unsigned char temp,rdata;
      
      rdata = 0x00;
      for(temp=8;temp>0;temp--)
      {
                rdata <<= 1;
                AT25_SCLK_LO;
                //AT25_Delay(1);
                if((AT25_IN&AT25_SDO)==AT25_SDO)rdata |= BIT0;               
                AT25_SCLK_HI;
                //AT25_Delay(1);               
               
      }      
      return(rdata);        
}

void SPI_WRITE_WAITDONE(void)
{
        unsigned char temp;
       
        SPI_DCS();               
        SPI_CS();                                                               
        SPI_WRITE_BYTE(RDSR);       
        temp=SPI_READ_BYTE();       
        SPI_DCS();
       
        while (temp&0x01)
        {
                SPI_DCS();
                SPI_CS();                                                               
                SPI_WRITE_BYTE(RDSR);               
                temp=SPI_READ_BYTE();       
                SPI_DCS();
        }
}

void SPI_WRITE_STATUS(unsigned char bstatus)
{
        SPI_DCS();
        SPI_CS();
        SPI_WRITE_BYTE(WREN);       
        SPI_DCS();
       
        SPI_CS();       
        SPI_WRITE_BYTE(WRSR);       
        SPI_WRITE_BYTE(bstatus);       
        SPI_DCS();
}

unsigned char SPI_READ_STATUS(void)
{
        unsigned char bstatus;
       
        SPI_DCS();       
        SPI_CS();
        SPI_WRITE_BYTE(RDSR);       
        bstatus=SPI_READ_BYTE();       
        SPI_DCS();
        SPI_CS();       
        return bstatus;
}


void        SPI_READ_FLASH(unsigned long address,unsigned long length,unsigned char* buffer)
{       
        unsigned int i;
       
        SPI_DCS();
       
        SPI_CS();
        SPI_WRITE_BYTE(READ);       
        SPI_WRITE_BYTE(address>>16);       
        SPI_WRITE_BYTE(address>>8);       
        SPI_WRITE_BYTE(address);       
        for (i=0;i<length;i++)
        {                       
                buffer=SPI_READ_BYTE();
        }       
        SPI_DCS();
}

void SPI_WRITE_FLASH(unsigned long address,unsigned char bdata)
{
        SPI_DCS();
        SPI_CS();
        SPI_WRITE_BYTE(WREN);       
        SPI_DCS();
                                                                                                                                                                                                                                                                                                                                                                                                                                                               
        SPI_CS();
        SPI_WRITE_BYTE(WRITE);       
        SPI_WRITE_BYTE(address>>16);       
        SPI_WRITE_BYTE(address>>8);
        SPI_WRITE_BYTE(address);       
        SPI_WRITE_BYTE(bdata);
               
        SPI_DCS();
        SPI_WRITE_WAITDONE();
}


void SPI_CHIP_ERASE(void)
{
        SPI_DCS();
        SPI_CS();
        SPI_WRITE_BYTE(WREN);       
        SPI_DCS();
       
        SPI_CS();
        SPI_WRITE_BYTE(CHIPERASE);       
        SPI_DCS();       
        SPI_WRITE_WAITDONE();
}

void SPI_SECTION_ERASE(unsigned short sectionno)
{
        unsigned long address;
       
        address = sectionno*0x8000;
       
        SPI_DCS();
        SPI_CS();
        SPI_WRITE_BYTE(WREN);       
        SPI_DCS();
      
        SPI_CS();
        SPI_WRITE_BYTE(SECTIONERASE);       
        SPI_WRITE_BYTE(address>>16);       
        SPI_WRITE_BYTE(address>>8);       
        SPI_WRITE_BYTE(address);       
        SPI_DCS();
       
        SPI_WRITE_WAITDONE();
}

AT25F1024ourdev_575131.rar(文件大小:1K) (原文件名:SPI.rar)

dssz 发表于 2011-12-19 01:43:00

这个不错,学习了

ljmdzyx 发表于 2011-12-20 23:02:12

MARK
页: [1]
查看完整版本: 用MSP430读写AT25F1024程序