技术的乐趣在于分享,欢迎多多交流,多多沟通。
全部博文(877)
分类: 嵌入式
2014-08-29 16:35:10
M25P80 的模拟SPI 总线读写程序
MCU:MSP430.
存储器:M25P80(SPI总线)
虽然MSP430本身自带SPI总线模块.但下面的程序并没有用此.而是
用普通I/O模拟总线时序进行操作的.详细代码如下:
在调试时,犯了超级无敌白痴错误.我竟然把FLASHRAM编程写入只
能有1 变0,不能从0 到1,结果在调式的时候不断的向首地址写数,然
后都给变成0,接下来回读数据全0,当时还以为是自己的时序没搞定
呢.无意间换了个地址重写重读,数据正常。/于是乎"天才的"我认为是
首地址已经被我写坏(调试的时候不停的循环写入).接着我象改变的
地址重新写一个新数,读出比较,发现数据还是不对.才想起FLASH
RAM的这个特点,不象E2RAM可以随改随写.FLASH 要先擦除再
写..!切记
/****************************************************************
*****
*公司名称: *
*模块 名: SPI总线FLASHRAM读写模块*
*创建 人: 日期: *
*修改 人: 日期: *
*功能描述: *
*其他说明: *
*版本:VER 1.0
*****************************************************************
*****/
#define M25_CLK_0 P4OUT&=~BIT2 //时钟置0
#define M25_CLK_1 P4OUT|=BIT2 //时钟置1
#define M25_SI_0 P4OUT&=~BIT3 //输入0,上升沿写数据
#define M25_SI_1 P4OUT|=BIT3 //输入1
#define M25_SO (P4IN & 0X80)>>7 //读出数据,下降沿读数
#define M25_CS_0 P5OUT&=~BIT2 //片选有效
#define M25_CS_1 P5OUT|=BIT2 //片选无效
#define M25_WP_0 P4OUT&=~BIT5
#define M25_WP_1 P4OUT|=BIT5
#define M25_HD_0 P4OUT&=~BIT4 //C为低电平
时,HOLD下降沿,HOLD模式
#define M25_HD_1 P4OUT|=BIT4
#define WREN 0X06 //写使能
#define WRDI 0X04 //写禁止
#define RDSR 0X05 //读状态寄存器
#define WRSR 0X01 //写状态寄存器,WEL为0不允许写
#define READ 0X03 //读字节
#define FAST_READ 0X0B //快读指令
#define PP 0X02 //页写指令
#define SE 0XD8 //区域擦除
#define BE 0XC7 //批擦除
#define DP 0XB9 //深度掉电模式
#define RES 0XAB //从深度掉电模式苏醒
#define uchar unsigned char
#define uint unsigned int
/****************************************************************
*****
*
* 函数 名:Delay
* 功能描述: 延时子程序
* 函数说明:
* 调用函数:
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者 : 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
void MDelay(uint ui_temp)
{
uint ui_i;
for(ui_i=ui_temp;ui_i>0;ui_i--)
{
;
}
}
/****************************************************************
*****
*
* 函数 名:M25P80_SPI_Write8
* 功能描述: 基于SPI总线的8位数据写操作
* 函数说明: 实现SPI总线的8位数据写操作,上升沿写数据
* 调用函数:
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
void M25P80_SPI_Write8(uchar temp8)
{
uchar i;
for(i=8;i>0;i--)
{
if( ( temp8 & 0X80 ) == 0x80 )
{
M25_SI_1; //写入1
}
else
{
M25_SI_0; //写入0
}
M25_CLK_0;
MDelay(5);
M25_CLK_1;
temp8<<=1; //左移
}
}
/****************************************************************
*****
*
* 函数 名:MP25_WriteEnable
* 功能描述: 写使能
* 函数说明: PP,SE,BE,WRSR之前必须进行写使能
* 调用函数:M25P80_SPI_Write8
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
void MP25_WriteEnable(void)
{
M25_CS_0; //片选
M25P80_SPI_Write8(WREN); //写使能
M25_CS_1; //禁止片选
//
MDelay(10);
}
/****************************************************************
*****
*
* 函数 名:SPI_Write24
* 功能描述: 基于SPI总线的24 位数据写操作
* 函数说明: 实现SPI总线的24 位数据写操作
* 调用函数:
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
void M25P80_SPI_Write24(long temp24)
{
uchar i;
for(i=24;i>0;i--)
{
if( ( temp24 & 0X800000 ) == 0x800000 )
{
M25_SI_1; //写入1
}
else
{
M25_SI_0; //写入0
}
M25_CLK_0;
MDelay(5);
M25_CLK_1;
temp24<<=1; //左移
}
}
/****************************************************************
*****
*
* 函数 名:M25P80_Read
* 功能描述: 基于SPI总线的8位数据读操作
* 函数说明: 实现SPI总线的8位数据读操作
* 调用函数:
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
uchar M25P80_Read(void)
{
uchar i,tempbit;
uchar tempData8;
M25_CLK_0;
for(i=8;i>0;i--)
{
if(M25_SO == 0X01)
{
tempbit=1; //置1
}
else
{
tempbit=0; //置0
}
M25_CLK_1;
MDelay(5);
M25_CLK_0;
tempData8= ( (tempData8<<1) | tempbit ); //数据读
出操作
}
return (tempData8);
}
/****************************************************************
*****
*
* 函数 名:MP25_ReadReg
* 功能描述: 读功能寄存器
* 函数说明:
* 调用函数:M25P80_SPI_Write8,MP25_WriteEnable
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
uchar MP25_ReadReg(void)
{
uchar Reg_Temp;
M25_CS_0; //片选
M25P80_SPI_Write8(RDSR); //写指令
Reg_Temp=M25P80_Read(); //数据读出
M25_CS_1; //禁止片选
MDelay(10);
return(Reg_Temp); //返回值
}
/****************************************************************
*****
*
* 函数 名:MP25_Check
* 功能描述: WIP 位检查
* 函数说明: 1,表示写操作未完成,0 表示写操作完成
* 调用函数:MP25_ReadReg
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
void MP25_Check(void)
{
while(MP25_ReadReg() & 0X01)
{
;
}
}
/****************************************************************
*****
*
* 函数 名:MP25_WriteDis
* 功能描述: 写禁止
* 函数说明:
* 调用函数:M25P80_SPI_Write8
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
void MP25_WriteDis(void)
{
M25_CS_0; //片选
M25P80_SPI_Write8(WRDI); //写禁止
M25_CS_1; //禁止片选
//
MDelay(10);
}
/****************************************************************
*****
*
* 函数 名:MP25_WriteReg
* 功能描述: 写功能寄存器
* 函数说明:
* 调用函数:M25P80_SPI_Write8,MP25_WriteEnable
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
void MP25_WriteReg(uchar comm)
{
MP25_WriteEnable(); //写使能
M25_CS_0; //片选
M25P80_SPI_Write8(WRSR); //写指令
M25P80_SPI_Write8(comm); //写数据
M25_CS_1; //禁止片选
MP25_Check();
MP25_WriteDis(); //写禁止
}
/****************************************************************
*****
*
* 函数 名:M25P80_SPI_Read
* 功能描述: 从M25P80的指定地址读出一字节数
* 函数说明:
* 调用函数:M25P80_Read
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
uchar M25P80_SPI_Read(long ADDR)
{
uchar Data_Temp;
M25_CS_0; //片选
M25P80_SPI_Write8(READ); //写指令
M25P80_SPI_Write24(ADDR); //写地址
Data_Temp = M25P80_Read(); //数据读出操作
M25_CS_1; //禁止片选
MDelay(10);
return (Data_Temp);
}
/****************************************************************
*****
*
* 函数 名:MP25_Write_Byte
* 功能描述: 存储单字节数据
* 函数说明:
* 调用函数:M25P80_SPI_Write8,MP25_WriteEnable,
M25PWriteWait
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
void MP25_Write_Byte(long Addr,uchar data)
{
MP25_WriteEnable(); //写使能
M25_CS_0; //片选
M25P80_SPI_Write8(PP); //页写指令
M25P80_SPI_Write24(Addr); //写指令
M25P80_SPI_Write8(data); //写数据
M25_CS_1; //禁止片选
MDelay(10);
MP25_Check();
MDelay(10);
MP25_WriteDis(); //写禁止
}
/****************************************************************
*****
*
* 函数 名:MP25_Write_nByte
* 功能描述: 存储多字节子程序
* 函数说明:
* 调用函数:M25P80_SPI_Write8,MP25_WriteEnable,
M25PWriteWait
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
void MP25_Write_nByte(long Addr,uchar *buffer,uchar nByte)
//double 改为uchar
{
uchar i;
MP25_WriteEnable(); //写使能
M25_CS_0; //片选
M25P80_SPI_Write8(PP); //页写指令
M25P80_SPI_Write24(Addr); //写指令
for(i=0 ; i
{
M25P80_SPI_Write8(*(buffer+i)); //写数据
}
M25_CS_1; //禁止片选
MDelay(10);
MP25_Check();
MP25_WriteDis(); //写禁止
}
/****************************************************************
*****
*
* 函数 名:MP25_EraseSector
* 功能描述: 扇区擦除
* 函数说明:
* 调用函数:M25P80_SPI_Write8,MP25_WriteEnable,
M25PWriteWait
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
void MP25_EraseSector(long Addr)
{
MP25_WriteEnable(); //写使能
M25_CS_0; //片选
M25P80_SPI_Write8(SE); //扇区擦除指令
M25P80_SPI_Write24(Addr); //写指令
M25_CS_1; //禁止片选
MP25_Check();
MP25_WriteDis(); //写禁止
}
/****************************************************************
*****
*
* 函数 名:MP25_EraseBulk
* 功能描述: 批擦除
* 函数说明:
* 调用函数:M25P80_SPI_Write8,MP25_WriteEnable,
M25PWriteWait,MP25_WriteDis
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
void MP25_EraseBulk(void)
{
MP25_WriteEnable(); //写使能
M25_CS_0; //片选
M25P80_SPI_Write8(BE); //批擦除指令
M25_CS_1; //禁止片选
MP25_Check(); //等待操作完毕
MP25_WriteDis(); //写禁止
}
/****************************************************************
*****
*
* 函数 名:M25P80_SPI_NRead
* 功能描述: 从M25P80的指定地址读出N个字节
* 函数说明:
* 调用函数:M25P80_Read
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
void M25P80_SPI_NRead(long ADDR,uchar *buffer,uchar
nByte)
{
uchar i;
M25_CS_0; //片选
M25P80_SPI_Write8(READ); //写指令
M25P80_SPI_Write24(ADDR); //写地址
//Data_Temp = M25P80_Read(); //数据读出操作
for(i=0 ; i
{
*(buffer+i)=M25P80_Read(); //读取数据
}
M25_CS_1; //禁止片选
MDelay(10);
}
/****************************************************************
*****
*
* 函数 名:M25PWriteStatus
* 功能描述:写状态寄存器
* 函数说明:
* 调用函数:
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
void M25PWriteStatus(uchar databyte)
{
MP25_WriteEnable(); // Must enable write
latch first
M25_CS_0; // Set CS_N low
M25P80_SPI_Write8(WRSR);
//MP25_Check();
M25P80_SPI_Write8(databyte);
//MP25_Check();
M25_CS_1; // Set CS_N high
MDelay(10);
MP25_Check();
MP25_WriteDis();
}
/****************************************************************
*****
*
* 函数 名:Init_m25p80
* 功能描述: 初始化M25P80
* 函数说明:
* 调用函数:
* 全局变量:无
* 输入: 无
* 返回: 无
* 设计 者: 日期:
* 修改 者: 日期:
* 版本:VER 1.0
*****************************************************************
******/
void Init_m25p80(void)
{
M25_CS_1;
M25_CLK_0;
M25PWriteStatus(0x00);
}
copyright by 沉思的鱼__
MCU:MSP430.
存储器:M25P80(SPI总线)
虽然MSP430本身自带SPI总线模块.但下面的程序并没有用此.而是
用普通I/O模拟总线时序进行操作的.详细代码如下:
在调试时,犯了超级无敌白痴错误.我竟然把FLASHRAM编程写入只
能有1 变0,不能从0 到1,结果在调式的时候不断的向首地址写数,然
后都给变成0,接下来回读数据全0,当时还以为是自己的时序没搞定
呢.无意间换了个地址重写重读,数据正常。/于是乎"天才的"我认为是
首地址已经被我写坏(调试的时候不停的循环写入).接着我象改变的
地址重新写一个新数,读出比较,发现数据还是不对.才想起FLASH
RAM的这个特点,不象E2RAM可以随改随写.FLASH 要先擦除再
写..!切记
/****************************************************************
*****
*公司名称: *
*模块 名: SPI总线FLASHRAM读写模块*
*创建 人: 日期: *
*修改 人: 日期: *
*功能描述: *
*其他说明: *
*版本:VER 1.0
*****************************************************************
*****/
#define M25_CLK_0 P4OUT&=~BIT2 //时钟置0
#define M25_CLK_1 P4OUT|=BIT2 //时钟置1
#define M25_SI_0 P4OUT&=~BIT3 //输入0,上升沿写数据
#define M25_SI_1 P4OUT|=BIT3 //输入1
#define M25_SO (P4IN & 0X80)>>7 //读出数据,下降沿读数
#define M25_CS_0 P5OUT&=~BIT2 //片选有效
#define M25_CS_1 P5OUT|=BIT2 //片选无效
#define M25_WP_0 P4OUT&=~BIT5
#define M25_WP_1 P4OUT|=BIT5
#define M25_CLK_0 P4OUT&=~BIT2 //时钟置 0
#define M25_CLK_1 P4OUT|=BIT2 //时钟置 1
#define M25_SI_0 P4OUT&=~BIT3 //输入 0,上升沿写数据
#define M25_SI_1 P4OUT|=BIT3 //输入 1
#define M25_SO (P4IN & 0X80)>>7 //读出数据,下降沿读数
#define M25_CS_0 P5OUT&=~BIT2 //片选有效
#define M25_CS_1 P5OUT|=BIT2 //片选无效
#define M25_WP_0 P4OUT&=~BIT5
#define M25_WP_1 P4OUT|=BIT5
#define M25_HD_0 P4OUT&=~BIT4 //C 为低电平
时,HOLD 下降沿,HOLD 模式
#define M25_HD_1 P4OUT|=BIT4
#define WREN 0X06 //写使能
#define WRDI 0X04 //写禁止
#define RDSR 0X05 //读状态寄存器
#define WRSR 0X01 //写状态寄存器,WEL 为 0 不允许写
#define READ 0X03 //读字节
#define FAST_READ 0X0B //快读指令
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
M25P80 的模拟SPI 总线读写程序
#define PP 0X02 //页写指令
#define SE 0XD8 //区域擦除
#define BE 0XC7 //批擦除
#define DP 0XB9 //深度掉电模式
#define RES 0XAB //从深度掉电模式苏醒
#define uchar unsigned char
#define uint unsigned int
/****************************************************************
*****
*
* 函 数 名:Delay
* 功能描述: 延时子程序
* 函数说明:
* 调用函数:
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者 : 日期:
* 修 改 者:
* 版 本:VER 1.0
日期:
*****************************************************************
******/
void MDelay(uint ui_temp)
{
uint ui_i;
for(ui_i=ui_temp;ui_i>0;ui_i--)
{
;
}
}
/****************************************************************
*****
*
* 函 数 名:M25P80_SPI_Write8
* 功能描述: 基于 SPI 总线的 8 位数据写操作
* 函数说明: 实现 SPI 总线的 8 位数据写操作,上升沿写数据
* 调用函数:
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
* 版 本:VER 1.0
日期:
日期:
*****************************************************************
******/
void M25P80_SPI_Write8(uchar temp8)
{
uchar i;
for(i=8;i>0;i--)
{
if( ( temp8 & 0X80 ) == 0x80 )
{
M25_SI_1; //写入 1
}
else
{
M25_SI_0; //写入 0
}
M25_CLK_0;
MDelay(5);
M25_CLK_1;
temp8<<=1; //左移
}
}
/****************************************************************
*****
*
* 函 数 名:MP25_WriteEnable
* 功能描述: 写使能
* 函数说明: PP,SE,BE,WRSR 之前必须进行写使能
* 调用函数:M25P80_SPI_Write8
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
* 版 本:VER 1.0
日期:
日期:
*****************************************************************
******/
void MP25_WriteEnable(void)
{
M25_CS_0; //片选
M25P80_SPI_Write8(WREN); //写使能
M25_CS_1; //禁止片选
//
MDelay(10);
}
/****************************************************************
*****
*
* 函 数 名:SPI_Write24
* 功能描述: 基于 SPI 总线的 24 位数据写操作
* 函数说明: 实现 SPI 总线的 24 位数据写操作
* 调用函数:
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
* 版 本:VER 1.0
日期:
日期:
*****************************************************************
******/
void M25P80_SPI_Write24(long temp24)
{
uchar i;
for(i=24;i>0;i--)
{
if( ( temp24 & 0X800000 ) == 0x800000 )
{
M25_SI_1; //写入 1
}
else
{
M25_SI_0; //写入 0
}
M25_CLK_0;
MDelay(5);
M25_CLK_1;
temp24<<=1; //左移
}
}
/****************************************************************
*****
*
* 函 数 名:M25P80_Read
* 功能描述: 基于 SPI 总线的 8 位数据读操作
* 函数说明: 实现 SPI 总线的 8 位数据读操作
* 调用函数:
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
日期:
日期:
* 版 本:VER 1.0
*****************************************************************
******/
uchar M25P80_Read(void)
{
uchar i,tempbit;
uchar tempData8;
M25_CLK_0;
for(i=8;i>0;i--)
{
if(M25_SO == 0X01)
{
tempbit=1; //置 1
}
else
{
tempbit=0; //置 0
}
M25_CLK_1;
MDelay(5);
M25_CLK_0;
tempData8= ( (tempData8<<1) | tempbit ); //数据读
出操作
}
return (tempData8);
}
/****************************************************************
*****
*
* 函 数 名:MP25_ReadReg
* 功能描述: 读功能寄存器
* 函数说明:
* 调用函数:M25P80_SPI_Write8,MP25_WriteEnable
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
* 版 本:VER 1.0
日期:
日期:
*****************************************************************
******/
uchar MP25_ReadReg(void)
{
uchar Reg_Temp;
M25_CS_0; //片选
M25P80_SPI_Write8(RDSR); //写指令
Reg_Temp=M25P80_Read(); //数据读出
M25_CS_1; //禁止片选
MDelay(10);
return(Reg_Temp); //返回值
}
/****************************************************************
*****
*
* 函 数 名:MP25_Check
* 功能描述: WIP 位检查
* 函数说明: 1,表示写操作未完成,0 表示写操作完成
* 调用函数:MP25_ReadReg
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
* 版 本:VER 1.0
日期:
日期:
*****************************************************************
******/
void MP25_Check(void)
{
while(MP25_ReadReg() & 0X01)
{
;
}
}
/****************************************************************
*****
*
* 函 数 名:MP25_WriteDis
* 功能描述: 写禁止
* 函数说明:
* 调用函数:M25P80_SPI_Write8
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
* 版 本:VER 1.0
日期:
日期:
*****************************************************************
******/
void MP25_WriteDis(void)
{
M25_CS_0; //片选
M25P80_SPI_Write8(WRDI); //写禁止
M25_CS_1; //禁止片选
//
MDelay(10);
}
/****************************************************************
*****
*
* 函 数 名:MP25_WriteReg
* 功能描述: 写功能寄存器
* 函数说明:
* 调用函数:M25P80_SPI_Write8,MP25_WriteEnable
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
* 版 本:VER 1.0
日期:
日期:
*****************************************************************
******/
void MP25_WriteReg(uchar comm)
{
MP25_WriteEnable(); //写使能
M25_CS_0; //片选
M25P80_SPI_Write8(WRSR); //写指令
M25P80_SPI_Write8(comm); //写数据
M25_CS_1; //禁止片选
MP25_Check();
MP25_WriteDis(); //写禁止
}
/****************************************************************
*****
*
* 函 数 名:M25P80_SPI_Read
* 功能描述: 从 M25P80 的指定地址读出一字节数
* 函数说明:
* 调用函数:M25P80_Read
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
* 版 本:VER 1.0
日期:
日期:
*****************************************************************
******/
uchar M25P80_SPI_Read(long ADDR)
{
uchar Data_Temp;
M25_CS_0; //片选
M25P80_SPI_Write8(READ); //写指令
M25P80_SPI_Write24(ADDR); //写地址
Data_Temp = M25P80_Read(); //数据读出操作
M25_CS_1; //禁止片选
MDelay(10);
return (Data_Temp);
}
/****************************************************************
*****
*
* 函 数 名:MP25_Write_Byte
* 功能描述: 存储单字节数据
* 函数说明:
* 调用函数:M25P80_SPI_Write8,MP25_WriteEnable,
M25PWriteWait
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
* 版 本:VER 1.0
日期:
日期:
*****************************************************************
******/
void MP25_Write_Byte(long Addr,uchar data)
{
MP25_WriteEnable(); //写使能
M25_CS_0; //片选
M25P80_SPI_Write8(PP); //页写指令
M25P80_SPI_Write24(Addr); //写指令
M25P80_SPI_Write8(data); //写数据
M25_CS_1; //禁止片选
MDelay(10);
MP25_Check();
MDelay(10);
MP25_WriteDis(); //写禁止
}
/****************************************************************
*****
*
* 函 数 名:MP25_Write_nByte
* 功能描述: 存储多字节子程序
* 函数说明:
* 调用函数:M25P80_SPI_Write8,MP25_WriteEnable,
M25PWriteWait
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
* 版 本:VER 1.0
日期:
日期:
*****************************************************************
******/
void MP25_Write_nByte(long Addr,uchar *buffer,uchar nByte)
//double 改为 uchar
{
uchar i;
MP25_WriteEnable(); //写使能
M25_CS_0; //片选
M25P80_SPI_Write8(PP); //页写指令
M25P80_SPI_Write24(Addr); //写指令
for(i=0 ; i
{
M25P80_SPI_Write8(*(buffer+i)); //写数据
}
M25_CS_1; //禁止片选
MDelay(10);
MP25_Check();
MP25_WriteDis(); //写禁止
}
/****************************************************************
*****
*
* 函 数 名:MP25_EraseSector
* 功能描述: 扇区擦除
* 函数说明:
* 调用函数:M25P80_SPI_Write8,MP25_WriteEnable,
M25PWriteWait
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
* 版 本:VER 1.0
日期:
日期:
*****************************************************************
******/
void MP25_EraseSector(long Addr)
{
MP25_WriteEnable(); //写使能
M25_CS_0; //片选
M25P80_SPI_Write8(SE); //扇区擦除指令
M25P80_SPI_Write24(Addr); //写指令
M25_CS_1; //禁止片选
MP25_Check();
MP25_WriteDis(); //写禁止
}
/****************************************************************
*****
*
* 函 数 名:MP25_EraseBulk
* 功能描述: 批擦除
* 函数说明:
* 调用函数:M25P80_SPI_Write8,MP25_WriteEnable,
M25PWriteWait,MP25_WriteDis
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
* 版 本:VER 1.0
日期:
日期:
*****************************************************************
******/
void MP25_EraseBulk(void)
{
MP25_WriteEnable(); //写使能
M25_CS_0; //片选
M25P80_SPI_Write8(BE); //批擦除指令
M25_CS_1; //禁止片选
MP25_Check(); //等待操作完毕
MP25_WriteDis(); //写禁止
}
/****************************************************************
*****
*
* 函 数 名:M25P80_SPI_NRead
* 功能描述: 从 M25P80 的指定地址读出 N 个字节
* 函数说明:
* 调用函数:M25P80_Read
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
* 版 本:VER 1.0
日期:
日期:
*****************************************************************
******/
void M25P80_SPI_NRead(long ADDR,uchar *buffer,uchar
nByte)
{
uchar i;
M25_CS_0; //片选
M25P80_SPI_Write8(READ); //写指令
M25P80_SPI_Write24(ADDR); //写地址
//Data_Temp = M25P80_Read(); //数据读出操作
for(i=0 ; i
{
*(buffer+i)=M25P80_Read(); //读取数据
}
M25_CS_1; //禁止片选
MDelay(10);
}
/****************************************************************
*****
*
* 函 数 名:M25PWriteStatus
* 功能描述:写状态寄存器
* 函数说明:
* 调用函数:
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
* 版 本:VER 1.0
日期:
日期:
*****************************************************************
******/
void M25PWriteStatus(uchar databyte)
{
MP25_WriteEnable(); // Must enable write
latch first
M25_CS_0; // Set CS_N low
M25P80_SPI_Write8(WRSR);
//MP25_Check();
M25P80_SPI_Write8(databyte);
//MP25_Check();
M25_CS_1; // Set CS_N high
MDelay(10);
MP25_Check();
MP25_WriteDis();
}
/****************************************************************
*****
*
* 函 数 名:Init_m25p80
* 功能描述: 初始化 M25P80
* 函数说明:
* 调用函数:
* 全局变量:无
* 输 入: 无
* 返 回: 无
* 设 计 者:
* 修 改 者:
* 版 本:VER 1.0
日期:
日期:
*****************************************************************
******/
void Init_m25p80(void)
{
M25_CS_1;
M25_CLK_0;
M25PWriteStatus(0x00);
}