OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 149,M29W022 我也来共享一段自己写的代码:149驱动闪存M29W022

共2条 1/1 1 跳转至

149,M29W022 我也来共享一段自己写的代码:149驱动闪存M29W022的驱动程序,保证好用

院士
2006-12-22 22:43:00    评分
149,M29W022 我也来共享一段自己写的代码:149驱动闪存M29W022的驱动程序,保证好用



关键词: M29W022     也来     共享     一段     自己     写的     代码    

院士
2006-12-22 22:43:00    评分
2楼
问 E文水平有限,部分函数名是按命令表命名的,有错当改。

#include <MSP430x14x.h>
#include "INCLUDES.H"
#include "CONSTANT.H"
#include "FUNCTION.H"
#include "GLOBLE.H"

#define USE_M29W022BT

#ifdef USE_M29W022BT
const unsigned long BlockOffset[] ={
0x00000L, /* Start offset of block 0 */
0x10000L, /* Start offset of block 1 */
0x20000L, /* Start offset of block 2 */
0x30000L, /* Start offset of block 3 */
0x38000L, /* Start offset of block 4 */
0x3A000L, /* Start offset of block 5 */
0x3C000L /* Start offset of block 6 */
};
#endif
#ifdef USE_M29W022BB
const unsigned long BlockOffset[] ={
0x00000L, /* Start offset of block 0 */
0x04000L, /* Start offset of block 1 */
0x06000L, /* Start offset of block 2 */
0x08000L, /* Start offset of block 3 */
0x10000L, /* Start offset of block 4 */
0x20000L, /* Start offset of block 5 */
0x30000L /* Start offset of block 6 */
};
#endif
#define FLASH_SIZE (0x40000L)
/**** M29W022BT Driver *******************************/
#define A0 BIT0
#define A1 BIT1
#define A2 BIT2
#define A3 BIT3
#define A4 BIT4
#define A5 BIT5
#define A6 BIT6
#define A7 BIT7
#define A8 BIT0
#define A9 BIT1
#define A10 BIT2
#define A11 BIT3
#define A12 BIT4
#define A13 BIT5
#define A14 BIT6
#define A15 BIT7
#define A16 BIT0
#define A17 BIT1
/***************************************************/
#define ChipEnable BIT5 //P5
#define WE BIT3 //P5
#define OutEnable BIT4 //P5
/****************************************************/
#define Disable_M29W022BT() P5OUT|=ChipEnable
#define Enable_M29W022BT() P5OUT&=~ChipEnable
#define DisableWrite_M29W022BT() P5OUT|=WE
#define EnableWrite_M29W022BT() P5OUT&=~WE
#define EnableOutput_M29W022BT() P5OUT&=~OutEnable
#define DisableOuput_M29W022BT() P5OUT|=OutEnable
/****************************************************/
#define D0 BIT0
#define D1 BIT1
#define D2 BIT2
#define D3 BIT3
#define D4 BIT4
#define D5 BIT5
#define D6 BIT6
#define D7 BIT7
/****************************************************/
#define M29W022_DataIn P4DIR=0X00
#define M29W022_DataOut P4DIR=0XFF
/*********************************************
函数名: SetM29W022Address()
功能: 设置M29W022BT的操作地址
参数: M29W022BTAddress:地址
返回: 无
*********************************************/
void SetM29W022Address(ulong M29W022BTAddress){
P1OUT=(uchar)(M29W022BTAddress);
M29W022BTAddress>>=8;
P2OUT=(uchar)(M29W022BTAddress);
M29W022BTAddress>>=8;
P3OUT|=M29W022BTAddress;
}
/*********************************************
函数名: ResetM29W022BT()
功能: 设置/复位M29W022BT到读模式下
参数: 无
返回: 无
*********************************************/
void ResetM29W022BT(void){
WriteM29W022(0x555,0xaa);
WriteM29W022(0x2aa,0x55);
WriteM29W022(0x0,0xf0);
delay(10);
}
/*********************************************
函数名: AutoSelect()
功能: 器件自动选择命令
参数: 无
返回: 无
*********************************************/
void AutoSelect(void){
WriteM29W022(0x555,0xaa);
WriteM29W022(0x2aa,0x55);
WriteM29W022(0x555,0x90);
}
/*********************************************
函数名: Programming()
功能: 器件单字节编程命令
参数: DataLength:数据长度
ProgramAddress:编程地址
ProgramData:被编程数据指针
返回: 无
*********************************************/
void Programming(uchar DataLength,ulong ProgramAddress,uchar *ProgramData){
do
{
WriteM29W022(0x555,0xaa);
WriteM29W022(0x2aa,0x55);
WriteM29W022(0x555,0xA0);
WriteM29W022(ProgramAddress,*ProgramData);
ProgramAddress++;
*ProgramData++;
}while(DataLength--);
}
/*********************************************
函数名: UnlockBypass()
功能: 编程解锁旁路命令
参数: 无
返回: 无
*********************************************/
void UnlockBypass(void){
WriteM29W022(0x555,0xaa);
WriteM29W022(0x2aa,0x55);
WriteM29W022(0x555,0x20);
}
/*********************************************
函数名: UnlockBypassProgram()
功能: 编程块解锁旁路编程命令
参数: ProgramAddress:编程地址
ProgramData:编程数据
DataLength:数据长度
返回: 无
*********************************************/
void UnlockBypassProgram(uchar DataLength,ulong ProgramAddress,uchar *ProgramData){
WriteM29W022(0x0,0xa0);
do
{
WriteM29W022(ProgramAddress,*ProgramData);
}while(DataLength--);
}
/*********************************************
函数名: UnlockBypassReset()
功能: 编程块解锁复位命令
参数: 无
返回: 无
*********************************************/
void UnlockBypassReset(void){
WriteM29W022(0x0,0x90);
WriteM29W022(0x0,0x0);
}
/*********************************************
函数名: EraseChip()
功能: 擦除整片命令
参数: 无
返回: 无
*********************************************/
void EraseChip(void){
WriteM29W022(0x555,0xaa);
WriteM29W022(0x2aa,0x55);
WriteM29W022(0x555,0x80);
WriteM29W022(0x555,0xaa);
WriteM29W022(0x2aa,0x55);
WriteM29W022(0x555,0x10);
}
/*********************************************
函数名: EraseBlock()
功能: 块擦除命令
参数: BlockAddress:块中的任一有效地址
返回: 无
*********************************************/
void EraseBlock(ulong BlockAddress){
WriteM29W022(0x555,0xaa);
WriteM29W022(0x2aa,0x55);
WriteM29W022(0x555,0x80);
WriteM29W022(0x555,0xaa);
WriteM29W022(0x2aa,0x55);
WriteM29W022(BlockAddress,0x30);
}
/*********************************************
函数名: EraseSuspend()
功能: 悬挂擦除命令
参数: 无
返回: 无
*********************************************/
void EraseSuspend(void){
WriteM29W022(0x0,0xb0);
}
/*********************************************
函数名: EraseResume()
功能: 快速擦除命令
参数: 无
返回: 无
*********************************************/
void EraseResume(void){
WriteM29W022(0x0,0x30);
}
/*********************************************
函数名: WriteM29W022()
功能: 写数据/命令到M29W022BT指定地址中
参数: M29W022Addr:地址
WriteData:数据
返回: 无
*********************************************/
void WriteM29W022(ulong M29W022Addr,uchar WriteData){
DisableOuput_M29W022BT();
_NOP();
SetM29W022Address(M29W022Addr);
_NOP();
Enable_M29W022BT();
_NOP();
EnableWrite_M29W022BT();
_NOP();
M29W022_DataOut;
_NOP();
P4OUT=WriteData;
delay(1);
DisableWrite_M29W022BT();
_NOP();
Disable_M29W022BT();
_NOP();
}
/*********************************************
函数名: ReadM29W022()
功能: 读M29W022BT指定地址中的数据
参数: M29W022Address:地址
返回: 指定地址中的数据
*********************************************/
uchar ReadM29W022(ulong M29W022Address){
uchar M29W022BT=0;
SetM29W022Address(M29W022Address);
_NOP();
Enable_M29W022BT();
_NOP();
EnableOutput_M29W022BT();
_NOP();
M29W022_DataIn;
_NOP();
M29W022BT=P4IN;
_NOP();
Disable_M29W022BT();
DisableOuput_M29W022BT();
return M29W022BT;
}

/*####################################################
Example for Flash Operating

InternalBuffer[0]=1;
InternalBuffer[1]=2;
InternalBuffer[2]=3;
InternalBuffer[3]=4;
ResetM29W022BT(); 复位
EraseBlock(0); 擦除0块内的数据
ResetM29W022BT();
AutoSelect(); 命令自动选择模式
InternalBuffer[8]=ReadM29W022(0); 制造商代码
ResetM29W022BT();
AutoSelect();
InternalBuffer[9]=ReadM29W022(1); 器件代码
ResetM29W022BT();
AutoSelect();
InternalBuffer[10]=ReadM29W022(2); 0块的状态位
ResetM29W022BT();
AutoSelect();
InternalBuffer[11]=ReadM29W022(0x3c002); 6块的状态位

ResetM29W022BT();
Programming(4,0,InternalBuffer); 写入

InternalBuffer[4]=ReadM29W022(0);
InternalBuffer[5]=ReadM29W022(1);
InternalBuffer[6]=ReadM29W022(2);
InternalBuffer[7]=ReadM29W022(3);
InternalBuffer[12]=ReadM29W022(4);
InternalBuffer[13]=ReadM29W022(5);
InternalBuffer[14]=ReadM29W022(6);
InternalBuffer[15]=ReadM29W022(7);
InternalBuffer[16]=ReadM29W022(8);
InternalBuffer[17]=ReadM29W022(9);
InternalBuffer[18]=ReadM29W022(10);
#####################################################*/ 1: 谢谢!顶!

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]