?? m25p80程序.txt
字號:
轉自:http://dreamingdewdrop1980.spaces.live.com/blog/cns!FBA4D341BFAE0326!1245.entry
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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -