|
/**********************************************************/
//// 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) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981
|