📄 flash.c
字号:
////////////////////////////////////////////////////////////////
// 无线传感器网络节点程序 //
// Flash部分 //
// 编写:蒋路茸 //
// 日期:2008.6 //
// 版本:0.1 //
////////////////////////////////////////////////////////////////
// P46 FLASH_BUSY //
// P47 FLASH_RESET //
// P50 FLASH_CS STE1 //
// P51 SPI_SIMO SIMO1 //
// P52 SPI_SOMI SOMI1 //
// P53 SPI_UCLK UCLK1 //
////////////////////////////////////////////////////////////////
#include <msp430x14x.h>
#include "flash.h"
///////////////////////////////////////////////////
// 名称:Init_Spi
// 功能:SPI接口初始化
// 输入:null
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Init_Spi(void)
{
P5SEL = 0x0E; //设置P5为SPI模式
P5DIR |= 0x01; // 片选位为输出模式
P4DIR &= ~BIT6; // BUSY为输入模式
P3SEL &= ~BIT6; //取消设置UART1的相应管脚功能
P3SEL &= ~BIT7;
U1CTL = CHAR + SYNC + MM + SWRST; // 8位,SPI模式,主机控制模式
U1TCTL = CKPL + SSEL1 + STC; //SMCLK,3线制
U1BR0 = 0x02; // 时钟配置 SPICLK = SMCLK/2
U1BR1 = 0x00;
U1MCTL = 0x00;
ME2 = USPIE1; //模块使能
U1CTL &= ~SWRST; // SPI使能
FLASH_CS_HI; // 置高不选中
// BCSCTL2 += SELM1; //MCLK的时钟源为时钟晶振
// BCSCTL2 += SELM0;
// BCSCTL2 &= ~SELS; // 辅助时钟设为dco
}
///////////////////////////////////////////////////
// 名称:Exit_Spi
// 功能:退出SPI
// 输入:null
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Exit_Spi(void)
{
BCSCTL2 |= SELS; // 辅助时钟设为xt2
P5SEL = 0x00; // P5相应管脚的复用功能取消
/*
U1CTL = 0x10; //8bit数据,无校验位
U1TCTL = 0x20; //波特率发生器选择SMCLK 16M Hz
UBR0_1 = 0x82; //选择波特率 9600 kbps
UBR1_1 = 0x06;
UMCTL_1 = 0x00;
ME2 |= UTXE1 + URXE1; //使能Uart1的TXD和RXD
IE2 |= URXIE1; //使能Uart1的RX中断
// IE2 |= UTXIE1; //使能Uart1的TX中断
P3SEL |= BIT6; //设置P3.6为Uart0的TXD
P3SEL |= BIT7; //设置P3.7为Uart0的RXD
P3DIR |= BIT6; // P3.4输出
P3DIR &= (~(BIT7)); // P3.5输入
*/
}
///////////////////////////////////////////////////
// 名称:Flash_Send_Byte
// 功能:SPI接口初始化
// 输入:null
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Flash_Send_Byte(unsigned char byte) //通过SPI发送一个字节至Flash
{
while(FLASH_BUSY == 0); //等待AT45DB081空闲
U1TXBUF = byte; //发送一个字节数据
while((U1TCTL & 0x01) == 0); // 等待发送完毕
}
///////////////////////////////////////////////////
// 名称:Flash_Busy
// 功能:检查flash是否忙
// 输入:null
// 输出:null
// 返回:如果忙返回1,不忙返回0
///////////////////////////////////////////////////
unsigned char Flash_Busy(void)
{
unsigned char flag_busy;
FLASH_CS_LO; //置cs低选中
Flash_Send_Byte(0xD7);
Flash_Send_Byte(0xFF); //写字节数据,使字节数据从SO移出
flag_busy = U1RXBUF; //Receive_Byte();
FLASH_CS_HI; //置cs高不选中
if (flag_busy & 0x80)
flag_busy = 0;
else
flag_busy = 1;
return flag_busy;
}
///////////////////////////////////////////////////
// 名称:Flash_Write_Buffer1
// 功能:向flash缓冲区buffer1或写入指定数量的数据
// 输入:null
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Flash_Write_Buffer1(unsigned char *inbuffer,unsigned int buffer_offset,unsigned int count)
// offset和count都必须小于264
{
unsigned int i;
unsigned char *tempbuffer;
tempbuffer = inbuffer;
FLASH_CS_LO; // 置cs低选中
Flash_Send_Byte(0x84); // 写buffer1指令
Flash_Send_Byte(0x00); // 写无关位
Flash_Send_Byte((unsigned char) (buffer_offset >> 8));// 强制转换高位
Flash_Send_Byte((unsigned char) buffer_offset); // 强制转换低位
for(i=0;i<count;i++) // 将count个字节写入FLASH Buffer1
{
Flash_Send_Byte(*tempbuffer);
tempbuffer++;
}
FLASH_CS_HI; //置cs高不选中
}
///////////////////////////////////////////////////
// 名称:Flash_Read_Buffer1
// 功能:从buffer1向datasave_buff数组读指定数量的数据
// 输入:null
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Flash_Read_Buffer1(unsigned char *inbuffer,unsigned int buffer_offset,unsigned count)
// offset和count都必须小于264
{
unsigned int i;
unsigned char *tempbuffer;
tempbuffer = inbuffer;
FLASH_CS_LO; //置cs低选中
Flash_Send_Byte(0xD4);
Flash_Send_Byte(0X00);
Flash_Send_Byte((unsigned char) (buffer_offset >> 8));// 强制转换高位
Flash_Send_Byte((unsigned char) buffer_offset); // 强制转换低位
Flash_Send_Byte(0);
for(i=0;i<count;i++)
{
Flash_Send_Byte(0x11);
*tempbuffer= U1RXBUF; //Receive_Byte
tempbuffer++;
}
FLASH_CS_HI; //置cs高不选中
}
///////////////////////////////////////////////////
// 名称:Flash_Read_Page
// 功能:从flash存贮区向buffer1写一页
// 输入:null
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Flash_Read_Page_Buffer1(unsigned int page_address)
{
FLASH_CS_LO; //置cs低选中
Flash_Send_Byte(0x53);
page_address = page_address << 1;
Flash_Send_Byte((unsigned char)(page_address>>8));
Flash_Send_Byte((unsigned char)page_address);
Flash_Send_Byte(0); //写无关位
FLASH_CS_HI; //置cs高不选中
while(Flash_Busy()); //等待器件写完结束
}
///////////////////////////////////////////////////
// 名称:Flash_Write_Page
// 功能:从buffer1向flash存贮区带擦除
// 输入:null
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Flash_Write_Page_Buffer1(unsigned int page_address)
{
FLASH_CS_LO; //置cs低选中
Flash_Send_Byte(0x83);
page_address = page_address << 1;
Flash_Send_Byte((unsigned char)(page_address>>8));
Flash_Send_Byte((unsigned char)page_address);
Flash_Send_Byte(0); //写无关位
FLASH_CS_HI; //置cs高不选中
while(Flash_Busy()); //等待器件写完结束
}
///////////////////////////////////////////////////
// 名称:Flash_Write_Buffer2
// 功能:向flash缓冲区buffer2或写入指定数量的数据
// 输入:null
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Flash_Write_Buffer2(unsigned char *inbuffer,unsigned int buffer_offset,unsigned int count)
// offset和count都必须小于264
{
unsigned int i;
unsigned char *tempbuffer;
tempbuffer = inbuffer;
FLASH_CS_LO; // 置cs低选中
Flash_Send_Byte(0x87); // 写buffer1指令
Flash_Send_Byte(0x00); // 写无关位
Flash_Send_Byte((unsigned char) (buffer_offset >> 8));// 强制转换高位
Flash_Send_Byte((unsigned char) buffer_offset); // 强制转换低位
for(i=0;i<count;i++) // 将count个字节写入FLASH Buffer1
{
Flash_Send_Byte(*tempbuffer);
tempbuffer++;
}
FLASH_CS_HI; //置cs高不选中
}
///////////////////////////////////////////////////
// 名称:Flash_Read_Buffer2
// 功能:从buffer2向datasave_buff数组读指定数量的数据
// 输入:null
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Flash_Read_Buffer2(unsigned char *inbuffer,unsigned int buffer_offset,unsigned count)
// offset和count都必须小于264
{
unsigned int i;
unsigned char *tempbuffer;
tempbuffer = inbuffer;
FLASH_CS_LO; //置cs低选中
Flash_Send_Byte(0xD6);
Flash_Send_Byte(0X00);
Flash_Send_Byte((unsigned char) (buffer_offset >> 8));// 强制转换高位
Flash_Send_Byte((unsigned char) buffer_offset); // 强制转换低位
Flash_Send_Byte(0);
for(i=0;i<count;i++)
{
Flash_Send_Byte(0x11);
*tempbuffer= U1RXBUF; //Receive_Byte
tempbuffer++;
}
FLASH_CS_HI; //置cs高不选中
}
///////////////////////////////////////////////////
// 名称:Flash_Read_Page
// 功能:从flash存贮区向buffer2写一页
// 输入:null
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Flash_Read_Page_Buffer2(unsigned int page_address)
{
FLASH_CS_LO; //置cs低选中
Flash_Send_Byte(0x55);
page_address = page_address << 1;
Flash_Send_Byte((unsigned char)(page_address>>8));
Flash_Send_Byte((unsigned char)page_address);
Flash_Send_Byte(0); //写无关位
FLASH_CS_HI; //置cs高不选中
while(Flash_Busy()); //等待器件写完结束
}
///////////////////////////////////////////////////
// 名称:Flash_Write_Page
// 功能:从buffer1向flash存贮区带擦除
// 输入:null
// 输出:null
// 返回:null
///////////////////////////////////////////////////
void Flash_Write_Page_Buffer2(unsigned int page_address)
{
FLASH_CS_LO; //置cs低选中
Flash_Send_Byte(0x86);
page_address = page_address << 1;
Flash_Send_Byte((unsigned char)(page_address>>8));
Flash_Send_Byte((unsigned char)page_address);
Flash_Send_Byte(0); //写无关位
FLASH_CS_HI; //置cs高不选中
while(Flash_Busy()); //等待器件写完结束
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -