共2条
1/1 1 跳转至页
149,M29W022 我也来共享一段自己写的代码:149驱动闪存M29W022的驱动程序,保证好用
问
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: 谢谢!顶!
#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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |