搜索
bottom↓
回复: 2

用MSP430读写AT25F1024程序

[复制链接]

出0入0汤圆

发表于 2010-8-15 11:06:50 | 显示全部楼层 |阅读模式
/**********************************************************/

////       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周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-12-19 01:43:00 | 显示全部楼层
这个不错,学习了

出0入0汤圆

发表于 2011-12-20 23:02:12 | 显示全部楼层
MARK
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-28 10:24

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

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