📄 fram.c
字号:
#include "G:\CJQ_LM3S1968\config.h"
#include "fram.h"
/*********************************************************************************************************
** Function name: InitFram
**
** Descriptions: 初始化控制SSI的管脚
**
** input parameters: NONE
** output parameters: NONE
**
** Returned value: NONE
**
** Created by: Zhao shimin
** Created Date: 2007/09/07
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void InitFram(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); /* 为SSI提供时钟*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); /* 使能GPIOA */
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); /* 使能GPIOC */
/* 配置SPI为模式0,主机模式,波特率,数据宽度为8位 */
SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, FRAM_BIT_RATE, FRAM_DATA_WIDTH);
/* 允许对SSI进行操作 */
SSIEnable(SSI0_BASE);
/* 设置GPIOA2,4,5引脚为SSI配置功能 */
GPIOPinTypeSSI(GPIO_PORTA_BASE, (FSLK | FSO | FSI));
/* 配置片选管脚为输出*/
GPIODirModeSet(GPIO_PORTA_BASE, nFCS , GPIO_DIR_MODE_OUT);
GPIODirModeSet(GPIO_PORTC_BASE, nFWP | nFHOLD, GPIO_DIR_MODE_OUT);
/* 配置片选管脚为上拉,2MA输出*/
GPIOPadConfigSet(GPIO_PORTA_BASE, nFCS , GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD);
GPIOPadConfigSet(GPIO_PORTC_BASE, nFWP | nFHOLD, GPIO_STRENGTH_4MA,GPIO_PIN_TYPE_STD);
GPIOPinWrite(GPIO_PORTC_BASE, nFHOLD, 0xff);//
GPIOPinWrite(GPIO_PORTC_BASE, nFWP, 0xff);//
FCS_HIGH();
}
/*********************************************************************************************************
** Function name: SendByteToFram
**
** Descriptions: 通过硬件SPI发送一个字节到fram
**
** input parameters: tempChar 发送的数据
** output parameters: NONE
**
** Returned value: NONE
**
** Created by: Zhao shimin
** Created Date: 2007/09/07
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void SendByteToFram(uint8 tempChar)
{
uint32 nullData;
WatchdogIntClear(WATCHDOG_BASE);//FEED DOG
SSIDataPut(SSI0_BASE, tempChar);
SSIDataGet(SSI0_BASE, &nullData);
}
/*********************************************************************************************************
** Function name: GetByteFromFram
**
** Descriptions: 通过硬件SPI接口接收一个字节到处理器
**
** input parameters: NONE
** output parameters: NONE
**
** Returned value: ReadData 读回的数据
**
** Created by: Zhao shimin
** Created Date: 2007/09/07
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint8 GetByteFromFram(void)
{
uint32 readData;
SSIDataPut(SSI0_BASE, 0xFF);/* 发送一个无效字节,以产生接收时钟*/
SSIDataGet(SSI0_BASE, &readData);
return (uint8)readData;
}
/************************************************************************
** 函数名称:SSTF016B_WR
** 函数功能:SST25VF016B的写函数,可写1个和多个数据到指定地址
** 入口参数:
** uint32 Dst:目标地址,范围 0x0 - MAX_ADDR(MAX_ADDR = 0x1FFFFF)
** uint8* SndbufPt:发送缓存区指针
** uint32 NByte:要写的数据字节数
** 出口参数:操作成功则返回OK,失败则返回ERROR
** 注 意:若某功能下,某一入口参数无效,可在该入口参数处填Invalid,该参数将被忽略
************************************************************************/
uint8 WrFram(uint32 Dst,uint8* SndbufPt,uint32 NByte)
{
unsigned char i = 0;
if ((((Dst + NByte - 1) > FRAM_MAX_ADDR) || (NByte == 0)))
{
return (ERROR); // 检查入口参数
}
for (i = 0; i < 20; i++);
FCS_LOW();
for (i = 0; i < 20; i++);
SendByteToFram(WREN); // 使状态寄存器可写
FCS_HIGH();
for (i = 0; i < 20; i++);
FCS_LOW();
for (i = 0; i < 20; i++);
SendByteToFram(WRSR); // 发送写状态寄存器指令
SendByteToFram(0); // 清0 BPx位,使Fram芯片全区可写
FCS_HIGH();
for(i = 0; i < NByte; i++)
{
FCS_LOW();
SendByteToFram(WREN); // 使状态寄存器可写
FCS_HIGH();
FCS_LOW();
SendByteToFram(WRITE); // 发送page program数据烧写命令
SendByteToFram(((Dst + i) & 0xff) >> 8);
SendByteToFram((Dst + i) & 0xff);
WatchdogIntClear(WATCHDOG_BASE);//FEED DOG
SendByteToFram(*(SndbufPt++)); // 发送被烧写的数据
FCS_HIGH();
}
return (OK);
}
/* 以下函数在移植时无需修改 */
/************************************************************************
** 函数名称:RdFram
** 函数功能:FM25L256B的读函数,可选择读ID和读数据操作
** 入口参数:
** uint32 Dst:目标地址,范围 0x0 - MAX_ADDR(MAX_ADDR = 0x1FFFFF)
** uint32 NByte: 要读取的数据字节数
** uint8* RcvBufPt:接收缓存的指针
** 出口参数:操作成功则返回OK,失败则返回ERROR
** 注 意:若某功能下,某一入口参数无效,可在该入口参数处填Invalid,该参数将被忽略
************************************************************************/
uint8 RdFram(uint32 Dst, uint32 NByte,uint8* RcvBufPt)
{
uint32 i = 0;
if (((Dst + NByte) > FRAM_MAX_ADDR)||(NByte == 0))
return (ERROR); // 检查入口参数
WatchdogIntClear(WATCHDOG_BASE);
FCS_LOW();
SendByteToFram(READ); // 发送读命令
//发送地址信息
SendByteToFram(((Dst ) & 0xff) >> 8);
SendByteToFram((Dst) & 0xff);
for (i = 0; i < NByte; i++)
{
*(RcvBufPt + i) = GetByteFromFram();
}
FCS_HIGH();
return (OK);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -