搜索
bottom↓
回复: 10

谁有MX25L1605D的驱动没

[复制链接]

出0入0汤圆

发表于 2010-10-20 17:57:43 | 显示全部楼层 |阅读模式
要做MX25L1605D的驱动,请问谁有不。发上来共享共享^_^

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2010-10-21 01:00:34 | 显示全部楼层
写了一个,抛砖引玉吧。

#include "MX25L1605D.h"
#include "config.h"
#include <intrins.H>

/*********************************************************************************
*函数原型:SPI_WriteByte(U8 byte)
*函数功能: SCK上升沿向芯片输入数据有效
*函数参数:
*返回值:
*说明:入口是,sck为高,出口是sck仍为高
*********************************************************************************/
void SPI_WriteByte(U8 byte)
{
    U8 data count;
    for(count=0;count<8;count++)
    {
        SCK=0;
        _nop_();
        if (byte&0x80)
                {   
                        SI=1;
                }
        else
                {            
                        SI=0;
                }
        byte=byte<<1;   
        SCK=1;
        _nop_();
    }
}

/*********************************************************************************
*函数原型:U8 SPI_ReadByte()
*函数功能:SCK下降沿从芯片读出数据有效
*函数参数:
*返回值:
*说明:入口是,sck为高,出口是sck仍为高
*********************************************************************************/


U8 SPI_ReadByte()
{
    U8 data count,byte;
    byte=0;
    for(count=0;count<8;count++)
    {     
        
        SCK=0;
        byte<<=1;
        if(SO)
                {
                        byte++;
        }
        _nop_();
        SCK=1;
        _nop_();
        
    }
    return(byte);
}

/*********************************************************************************
*函数原型:void Flash_WaitBusy(void)
*函数功能:
*函数参数:
*返回值:
*说明:
*********************************************************************************/
void Flash_WaitBusy(void)
{
        U8 state_reg = 0x00;
        CLS_CS;       
        SPI_WriteByte(WREN);
        SET_CS;
        CLS_CS;
        SPI_WriteByte(RDSR);
        do
        {
                state_reg = SPI_ReadByte();
        }
        while(state_reg&0x01);
        SET_CS;
}

/*********************************************************************************
*函数原型:U8 Flash_Read_ID(void)
*函数功能:
*函数参数:
*返回值:
*说明:
*********************************************************************************/
U8 Flash_Read_ID(void)          //ID读取
{       
        U8 Manu_ID;
        CLS_CS;
        SPI_WriteByte(RDID);                //ID = C2
        Manu_ID = SPI_ReadByte();       
        SET_CS;
        Flash_WaitBusy();
        return Manu_ID;       
}

/*********************************************************************************
*函数原型:void Earse_Flash(void)
*函数功能:整片擦除
*函数参数:
*返回值:
*说明:整片擦除时间为5秒左右
*********************************************************************************/
void Earse_Flash(void)
{
        U8 state = 0;
        CLS_CS;       
        SPI_WriteByte(WREN);
        SET_CS;
        CLS_CS;       
        SPI_WriteByte(CE);                 //60 or C7  to erase whole chip
        SET_CS;       
    CLS_CS;       
        SPI_WriteByte(RDSR);        //to read out the values of the status register
        do
        {
                state = SPI_ReadByte();
        }
        while(state&0x01);
        SET_CS;
}

/*********************************************************************************
*函数原型:void Earse_Sector(U16 i)
*函数功能:扇区擦除
*函数参数:块地址
*返回值:
*说明:         4K-byte
*********************************************************************************/
void Earse_Sector(U16 i)
{
        U8 state = 0;
        CLS_CS;
        SPI_WriteByte(WREN);
        SET_CS;

        CLS_CS;       
        SPI_WriteByte(SE);                  //to erase the selected sector
        SPI_WriteByte(i>>4);
        SPI_WriteByte(i<<4);
        SPI_WriteByte(0x00);
        SET_CS;
       
    CLS_CS;       
        SPI_WriteByte(RDSR);        //to read out the values of the status register
        do
        {
                state = SPI_ReadByte();
        }
        while(state&0x01);
        SET_CS;       
}

/*********************************************************************************
*函数原型:Flash_PageWrite(u16 page,u8 *Data_Buf)
*函数功能:
*函数参数:
*返回值:
*说明:         写一整页,页范围0-4095
*********************************************************************************/
void Flash_PageWrite(U16 page,U8 *Pdata)               
{
        U16 j=page;
        U16 i;
        CLS_CS;       
        SPI_WriteByte(WREN);
        SET_CS;

        CLS_CS;
        SPI_WriteByte(PP);                  //to program the selected page
        SPI_WriteByte((U8)j>>8);
        SPI_WriteByte((U8)j);
        SPI_WriteByte(0x00);
        for(i = 0; i< 256; i++)
        {
                SPI_WriteByte(Pdata);
        }
        SET_CS;
        Flash_WaitBusy();       
}

/*********************************************************************************
*函数原型:void Flash_PageRead(U16 page,U8 *Data_Buf)
*函数功能:
*函数参数:
*返回值:
*说明:
*********************************************************************************/
void Flash_PageRead(U16 page,U8 *Pdata)          //页读取
{
        unsigned long adr = page;
        unsigned long  i  = 0;
        CLS_CS;       
        SPI_WriteByte(WREN);
        SET_CS;
       
        CLS_CS;
        SPI_WriteByte(FAST_READ);                //n bytes read out until CS# goes high
        SPI_WriteByte((U8)adr>>16);
        SPI_WriteByte((U8)adr>>8);
        SPI_WriteByte((U8)adr);
        SPI_WriteByte((U8)0x00);               
        for(i = 0 ; i< 256; i++)
        {
                Pdata = SPI_ReadByte();       
        }
        SET_CS;
        Flash_WaitBusy();       
}


/*********************************************************************************
*函数原型:void SPI_Read(U16 page,U16 addr,U16 len,U8 *Data_Buf)
*函数功能:从指定页指定地址读出指定长度数据
*函数参数:
*返回值:
*说明:
*********************************************************************************/
void Flash_Read(U16 page,U16 addr,U16 len,U8 *Data_Buf)
{
        unsigned long adr = (page<<9)+addr;
        unsigned long  i  = 0;
        CLS_CS;       
        SPI_WriteByte(WREN);                //sets the (WEL)write enable latch bit
        SET_CS;
       
        CLS_CS;
        SPI_WriteByte(FAST_READ);                //n bytes read out until CS# goes high
        SPI_WriteByte((U8)adr>>16);        //AD1        send out the address, high byte, middle byte, then low byte
        SPI_WriteByte((U8)adr>>8);        //AD2
        SPI_WriteByte((U8)adr);                //AD3
        SPI_WriteByte((U8)0x00);        //Dummy       
        for(i = 0 ; i!= len; i++)
        {
                Data_Buf = SPI_ReadByte();       
        }
        SET_CS;
        Flash_WaitBusy();       
}

出0入0汤圆

 楼主| 发表于 2010-10-22 16:31:27 | 显示全部楼层
上面的有错误。再发一个更改以后的。

#include "MX25L1605D.h"
#include "config.h"
#include <intrins.H>

/*********************************************************************************
*函数原型:SPI_WriteByte(U8 byte)
*函数功能: SCK上升沿向芯片输入数据有效
*函数参数:
*返回值:
*说明:入口是,sck为高,出口是sck仍为高
*********************************************************************************/
void SPI_WriteByte(U8 byte)
{
    U8 data count;
    for(count=0;count<8;count++)
    {
        SCK=0;
        _nop_();
        if (byte&0x80)
                {   
                        SI=1;
                }
        else
                {            
                        SI=0;
                }
        byte=byte<<1;   
        SCK=1;
        _nop_();
    }
}

/*********************************************************************************
*函数原型:U8 SPI_ReadByte()
*函数功能:SCK下降沿从芯片读出数据有效
*函数参数:
*返回值:
*说明:入口是,sck为高,出口是sck仍为高
*********************************************************************************/


U8 SPI_ReadByte()
{
    U8 data count,byte;
    byte=0;
    for(count=0;count<8;count++)
    {     
        
        SCK=0;
        byte<<=1;
        if(SO)
                {
                        byte++;
        }
        _nop_();
        SCK=1;
        _nop_();
        
    }
    return(byte);
}

/*********************************************************************************
*函数原型:void Flash_WaitBusy(void)
*函数功能:
*函数参数:
*返回值:
*说明:
*********************************************************************************/
void Flash_WaitBusy(void)
{
        U8 state_reg = 0x00;
        CLS_CS;       
        SPI_WriteByte(WREN);
        SET_CS;
        CLS_CS;
        SPI_WriteByte(RDSR);
        do
        {
                state_reg = SPI_ReadByte();
        }
        while(state_reg&0x01);
        SET_CS;
}

/*********************************************************************************
*函数原型:U8 Flash_Read_ID(void)
*函数功能:
*函数参数:
*返回值:
*说明:
*********************************************************************************/
U8 Flash_Read_ID(void)          //ID读取
{       
        U8 Manu_ID;
        CLS_CS;
        SPI_WriteByte(RDID);                //ID = C2
        Manu_ID = SPI_ReadByte();       
        SET_CS;
        Flash_WaitBusy();
        return Manu_ID;       
}

/*********************************************************************************
*函数原型:void Earse_Flash(void)
*函数功能:整片擦除
*函数参数:
*返回值:
*说明:整片擦除时间为10秒左右
*********************************************************************************/
void Earse_Flash(void)
{
        U8 state = 0;
        CLS_CS;       
        SPI_WriteByte(WREN);
        SET_CS;
        CLS_CS;       
        SPI_WriteByte(CE);                 //60 or C7  to erase whole chip
        SET_CS;       
    CLS_CS;       
        SPI_WriteByte(RDSR);        //to read out the values of the status register
        do
        {
                state = SPI_ReadByte();
        }
        while(state&0x01);
        SET_CS;
}

///*********************************************************************************
//*函数原型:void Earse_Sector(U16 i)
//*函数功能:扇区擦除
//*函数参数:块地址
//*返回值:
//*说明:         4K-byte
//*********************************************************************************/
//void Earse_Sector(U16 i)
//{
//        U8 state = 0;
//        CLS_CS;
//        SPI_WriteByte(WREN);
//        SET_CS;
//
//        CLS_CS;       
//        SPI_WriteByte(SE);                  //to erase the selected sector
//        SPI_WriteByte(i>>4);
//        SPI_WriteByte(i<<4);
//        SPI_WriteByte(0x00);
//        SET_CS;
//       
//    CLS_CS;       
//        SPI_WriteByte(RDSR);        //to read out the values of the status register
//        do
//        {
//                state = SPI_ReadByte();
//        }
//        while(state&0x01);
//        SET_CS;       
//}

/*********************************************************************************
*函数原型:Flash_PageWrite(u16 page,u8 *Data_Buf)
*函数功能:
*函数参数:
*返回值:
*说明:         写一整页,页范围0-4095
*********************************************************************************/
void Flash_PageWrite(U16 page,U8 *Pdata)               
{
        U32 j=((U32)page<<8);
        U16 i;
        CLS_CS;       
        SPI_WriteByte(WREN);
        SET_CS;

        CLS_CS;
        SPI_WriteByte(PP);                  //to program the selected page
        SPI_WriteByte((U8)((j& 0x00FF0000)>>16));
//        SPI_WriteByte(0x00);       
        SPI_WriteByte((U8)((j& 0x0000FF00)>>8));
        SPI_WriteByte((U8)((j& 0x000000FF)));
//        SPI_WriteByte(0x00);
        for(i = 0; i< 256; i++)
        {
                SPI_WriteByte(Pdata);
//                _nop_();
        }
        SET_CS;
        Flash_WaitBusy();       
}

/*********************************************************************************
*函数原型:void Flash_PageRead(U16 page,U8 *Data_Buf)
*函数功能:
*函数参数:
*返回值:
*说明:
*********************************************************************************/
void Flash_PageRead(U16 page,U8 *Pdata)          //页读取
{
        U32 adr = ((U32)page<<8);
        U16  i  = 0;
        CLS_CS;       
        SPI_WriteByte(WREN);
        SET_CS;
       
        CLS_CS;
        SPI_WriteByte(FAST_READ);                //n bytes read out until CS# goes high
        SPI_WriteByte((U8)((adr& 0x00FF0000)>>16));
        SPI_WriteByte((U8)((adr& 0x0000FF00)>>8));
        SPI_WriteByte((U8)(adr& 0x000000FF));
        SPI_WriteByte((U8)0x00);               
        for(i = 0 ; i< 256; i++)
        {
                Pdata = SPI_ReadByte();       
        }
        SET_CS;
        Flash_WaitBusy();       
}


/*********************************************************************************
*函数原型:void SPI_Read(U16 page,U16 addr,U16 len,U8 *Data_Buf)
*函数功能:从指定页指定地址读出指定长度数据
*函数参数:
*返回值:
*说明:
*********************************************************************************/
void Flash_Read(U16 page,U16 addr,U16 len,U8 *Data_Buf)
{
        U32 adr = ((U32)page<<8)+addr;
        U16  i  = 0;
        CLS_CS;       
        SPI_WriteByte(WREN);                //sets the (WEL)write enable latch bit
        SET_CS;
       
        CLS_CS;
        SPI_WriteByte(FAST_READ);                //n bytes read out until CS# goes high
        SPI_WriteByte((U8)((adr& 0x00FF0000)>>16));        //AD1        send out the address, high byte, middle byte, then low byte
        SPI_WriteByte((U8)((adr& 0x0000FF00)>>8));
        SPI_WriteByte((U8)(adr& 0x000000FF));                       
        SPI_WriteByte((U8)0x00);        //Dummy       
        for(i = 0 ; i<len; i++)
        {
                Data_Buf = SPI_ReadByte();       
        }
        SET_CS;
        Flash_WaitBusy();       
}

出0入0汤圆

发表于 2011-1-3 22:49:14 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2011-7-13 13:15:52 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2012-1-17 23:40:51 | 显示全部楼层
标记

出0入0汤圆

发表于 2012-1-19 09:00:38 | 显示全部楼层
MX25L1605  之类的,兼容此程序么?看到报废的pc主板上有很多这个做bios芯片,米有用过啊,

出0入0汤圆

 楼主| 发表于 2012-1-28 22:08:22 | 显示全部楼层
回复【7楼】zaixian 来来
mx25l1605  之类的,兼容此程序么?看到报废的pc主板上有很多这个做bios芯片,米有用过啊,
-----------------------------------------------------------------------

基本上是兼容的。你可以下它的DS看下有哪些指令不兼容的。不过一般的基本读写指令还是兼容的。

出0入12汤圆

发表于 2015-2-4 16:22:06 | 显示全部楼层
谢谢分享记号备用

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-10-3 02:15

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

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