?? mx25l1602drv.c
字號(hào):
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: MX25L1602.c
** Descriptions: SST25VF016B驅(qū)動(dòng)
**
**------------------------------------------------------------------------------------------------------
** Created by: Litiantian
** Created date: 2007-04-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
********************************************************************************************************/
#include "MX25L1602Drv.h"
/*
* 移植本軟件包時(shí)需要修改以下的函數(shù)或宏
*/
#define CE_Low() LPC_GPIO0->DATA &= ~SPI_CS;
#define CE_High() LPC_GPIO0->DATA |= SPI_CS;
/*********************************************************************************************************
** 函數(shù)名稱:SPIInit
** 功能說明:初始化SPI
** 輸入?yún)?shù):無
** 輸出參數(shù):無
*********************************************************************************************************/
void SSP_Init (void)
{
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 16); /* 配置IOCON模塊時(shí)鐘 */
LPC_IOCON->PIO0_2 &= ~0x07; /* 初始化SPI0引腳 */
LPC_GPIO0->DIR |= SPI_CS;
LPC_IOCON->PIO0_6 |= 0x02;
LPC_IOCON->PIO0_8 |= 0x01;
LPC_IOCON->PIO0_9 |= 0x01;
LPC_SYSCON->PRESETCTRL |= 0x01; /* 禁止SPI0復(fù)位 */
LPC_IOCON->SCK_LOC = 0x02; /* P0.6配置為SCK */
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 11); /* 打開SPI0外設(shè) */
LPC_SYSCON->SSP0CLKDIV = 0x01; /* SSP時(shí)鐘分頻 */
LPC_SSP0->CR0 = (0x01 << 8) | /* SCR 設(shè)置SPI時(shí)鐘分頻 */
(0x00 << 7) | /* CPHA 時(shí)鐘輸出相位, */
/* 僅SPI模式有效 */
(0x00 << 6) | /* CPOL 時(shí)鐘輸出極性, */
/* 僅SPI模式有效 */
(0x00 << 4) | /* FRF 幀格式 00=SPI,01=SSI, */
/* 10=Microwire,11=保留 */
(0x07 << 0); /* DSS 數(shù)據(jù)長度,0000-0010=保留,*/
/* 0011=4位,0111=8位,1111=16位 */
LPC_SSP0->CR1 = (0x00 << 3) | /* SOD 從機(jī)輸出禁能,1=禁止 */
(0x00 << 2) | /* MS 主從選擇,0=主機(jī),1=從機(jī) */
(0x01 << 1) | /* SSE SSP使能 */
(0x00 << 0); /* LBM 回寫模式 */
LPC_SSP0->CPSR = 2; /* PCLK分頻值 */
LPC_SSP0->ICR = 0x03; /* 中斷清除寄存器 */
}
/*********************************************************************************************************
** 函數(shù)名稱: Send_Byte
** 函數(shù)功能:通過硬件SPI發(fā)送一個(gè)字節(jié)到MX25L1602
** 輸入?yún)?shù): data
** 輸出參數(shù): 無
** 返 回 值:無
*********************************************************************************************************/
void Send_Byte (INT8U data)
{
LPC_SSP0->DR = data;
while( (LPC_SSP0->SR & 0x10) == 0x10); /* 等待TFE置位,即發(fā)送FIFO空 */
data = LPC_SSP0->DR;
}
/*********************************************************************************************************
** 函數(shù)名稱:Get_Byte
** 函數(shù)功能:通過硬件SPI接口接收一個(gè)字節(jié)到處理器
** 輸入?yún)?shù):無
** 輸出參數(shù):無
*********************************************************************************************************/
INT8U Get_Byte (void)
{
LPC_SSP0->DR = 0xFF; /* 發(fā)送該數(shù)據(jù)用以產(chǎn)生時(shí)鐘 */
while ( 0 == (LPC_SSP0->SR & 0x01)); /* 等待數(shù)據(jù)發(fā)送完畢 */
/*
* 判斷當(dāng)前是否空閑(是否處于TX Or RX)
*/
while( LPC_SSP0->SR & (1 << 4));
/*
* 判斷是否已接收到數(shù)據(jù),必須判斷是否接收完成,否則
* 新的TX發(fā)送再次寫入LPC_SSP0->DR寄存器
*/
while( LPC_SSP0->SR & (1 << 2) == 0x00);
return (INT8U)(LPC_SSP0->DR); /* 返回接收到的數(shù)據(jù) */
}
/*********************************************************************************************************
** 用戶接口層
** 以下函數(shù)在移植時(shí)無需修改
*********************************************************************************************************/
/********************************************************************************************************
** 函數(shù)名稱:MX25L1602_RD
** 函數(shù)功能:MX25L1602的讀函數(shù),可選擇讀ID和讀數(shù)據(jù)操作
** 輸入?yún)?shù):
** INT32U Dst:目標(biāo)地址,范圍 0x0 - MAX_ADDR(MAX_ADDR = 0x1FFFFF)
** INT32U NByte: 要讀取的數(shù)據(jù)字節(jié)數(shù)
** INT8U* RcvBufPt:接收緩存的指針
** 輸出參數(shù):操作成功則返回OK,失敗則返回ERROR
** 特殊說明:若某功能下,某一入口參數(shù)無效,可在該入口參數(shù)處填I(lǐng)nvalid,該參數(shù)將被忽略
**********************************************************************************************************/
INT8U MX25L1602_RD(INT32U Dst, INT32U NByte,INT8U* RcvBufPt)
{
INT32U i = 0;
if ((Dst+NByte > MAX_ADDR)||(NByte == 0)) return (ERROR); /* 檢查入口參數(shù) */
CE_Low();
Send_Byte(0x0B); /* 發(fā)送讀命令 */
Send_Byte(((Dst & 0xFFFFFF) >> 16)); /* 發(fā)送地址信息:該地址為3個(gè)字節(jié) */
Send_Byte(((Dst & 0xFFFF) >> 8));
Send_Byte(Dst & 0xFF);
Send_Byte(0xFF); /* 發(fā)送一個(gè)啞字節(jié)以讀取數(shù)據(jù) */
for (i = 0; i < NByte; i++) {
RcvBufPt[i] = Get_Byte();
}
CE_High();
return (OK);
}
/*********************************************************************************************************
** 函數(shù)名稱:MX25L1602_RdID
** 函數(shù)功能:MX25L1602的讀ID函數(shù),可選擇讀ID和讀數(shù)據(jù)操作
** 輸入?yún)?shù):
** idtype IDType:ID類型。用戶可在Jedec_ID,Dev_ID,Manu_ID三者里選擇
** INT32U* RcvbufPt:存儲(chǔ)ID變量的指針
** 輸出參數(shù):操作成功則返回OK,失敗則返回ERROR
** 特殊說明:若填入的參數(shù)不符合要求,則返回ERROR
*********************************************************************************************************/
INT8U MX25L1602_RdID(idtype IDType, INT32U* RcvbufPt)
{
INT32U temp = 0;
if (IDType == Jedec_ID) {
CE_Low();
Send_Byte(0x9F); /* 發(fā)送讀JEDEC ID命令(9Fh) */
temp = (temp | Get_Byte()) << 8; /* 接收數(shù)據(jù) */
temp = (temp | Get_Byte()) << 8;
temp = (temp | Get_Byte()); /* 在本例中,temp的值應(yīng)為0xBF2541*/
CE_High();
*RcvbufPt = temp;
return (OK);
}
if ((IDType == Manu_ID) || (IDType == Dev_ID) ) {
CE_Low();
Send_Byte(0x90); /* 發(fā)送讀ID命令 (90h or ABh) */
Send_Byte(0x00); /* 發(fā)送地址 */
Send_Byte(0x00); /* 發(fā)送地址 */
Send_Byte(IDType); /* 發(fā)送地址 - 不是00H就是01H */
temp = Get_Byte(); /* 接收獲取的數(shù)據(jù)字節(jié) */
CE_High();
*RcvbufPt = temp;
return (OK);
} else {
return (ERROR);
}
}
/*********************************************************************************************************
** 函數(shù)名稱:MX25L1602_WR
** 函數(shù)功能:MX25L1602的寫函數(shù),可寫1個(gè)和多個(gè)數(shù)據(jù)到指定地址
** 輸入?yún)?shù):
** INT32U Dst:目標(biāo)地址,范圍 0x0 - MAX_ADDR(MAX_ADDR = 0x1FFFFF)
** INT8U* SndbufPt:發(fā)送緩存區(qū)指針
** INT32U NByte:要寫的數(shù)據(jù)字節(jié)數(shù)
** 輸出參數(shù):操作成功則返回OK,失敗則返回ERROR
** 特殊說明:若某功能下,某一入口參數(shù)無效,可在該入口參數(shù)處填I(lǐng)nvalid,該參數(shù)將被忽略
*********************************************************************************************************/
INT8U MX25L1602_WR(INT32U Dst, INT8U* SndbufPt, INT32U NByte)
{
INT32U temp = 0,i = 0,StatRgVal = 0;
if (( (Dst+NByte-1 > MAX_ADDR)||(NByte == 0) )) {
return (ERROR); /* 檢查入口參數(shù) */
}
CE_Low();
Send_Byte(0x05); /* 發(fā)送讀狀態(tài)寄存器命令 */
temp = Get_Byte(); /* 保存讀得的狀態(tài)寄存器值 */
CE_High();
CE_Low();
Send_Byte(0x50); /* 使?fàn)顟B(tài)寄存器可寫 */
CE_High();
CE_Low();
Send_Byte(0x01); /* 發(fā)送寫狀態(tài)寄存器指令 */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -