⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mx25l1602drv.c

📁 LPC1114_例程和教程
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************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_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复位                 */

    LPC_IOCON->SCK_LOC         = 0x02;                                  /* P0.6配置为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);                                        /* 返回接收到的数据             */
}
 
/*********************************************************************************************************
** 用户接口层
** 以下函数在移植时无需修改
*********************************************************************************************************/
/********************************************************************************************************
** 函数名称: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();

  CE_Low();
  Send_Byte(0x50);                                                      /* 使状态寄存器可写             */
  CE_High();
  CE_Low();
  Send_Byte(0x01);                                                      /* 发送写状态寄存器指令         */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -