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