/*********************************************************************************************************
* 公司: 深圳市中远通电源技术开发有限公司
* 文件名: zyt_store_FM25CL64.c
* 描述: 用SPI来将数据丰储到铁电存储器上。
*
* 历史:
* -----------
* 版本:V1.0 作者:guolei 时间:2009/7/10
* 版本描述:无
*
*********************************************************************************************************/
/*********************************************************************************************************
* 头文件包含
*********************************************************************************************************/
#define IN_ZYT_DRIVERM
#define IN_STORE_FM25CL64_DRIVER
#include <string.h>
#include <zyt_driverm.h>
#include <LM3Sxxxx.H>
#include "ZYT_SC16IS740_SPI_UART.h"
/*********************************************************************************************************
* 宏定义
*********************************************************************************************************/
#define MAX_ADDR 0x1fff
#define FM_WREN 0x06 //set write enable latch
#define FM_WRDI 0x04 //write desable
#define FM_RDSR 0x05 //read states register
#define FM_WRSR 0x01 //write states register
#define FM_READ 0x03 //read memory data
#define FM_WRITE 0x02 //write memory data
#define DEV_NO_ERR 0
#define DEV_PARA_ERR -1
#define NO_SPACE -2
extern UART_ATTRIB lm3suart[4];
/*********************************************************************************************************
* 数据类型定义
*********************************************************************************************************/
/* 定义驱动管理空间 */
INT32U current_addr ;
/*********************************************************************************************************
* 函数或其它调用声明
*********************************************************************************************************/
/*********************************************************************************************************************
函数名称: select_chip()
功能描述: 选择fram
输 入: None
输 出: None
*********************************************************************************************************************/
static void select_chip(void)
{
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, ~GPIO_PIN_3);
}
/*********************************************************************************************************************
函数名称: unselect_chip()
功能描述: 禁能fram
输 入: None
输 出: None
*********************************************************************************************************************/
static void unselect_chip(void)
{
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3);
}
/*********************************************************************************************************************
函数名称: fram_write_enable
功能描述: fram 写使能
输 入: None
输 出: None
*********************************************************************************************************************/
static void fram_write_enable(void)
{
while(!(HWREG(SSI_BASE + SSI_O_SR) & SSI_SR_TNF));
HWREG(SSI_BASE + SSI_O_DR) = FM_WREN;
while((HWREG(SSI_BASE + SSI_O_SR) & SSI_SR_BSY));
}
/*********************************************************************************************************************
*函数名称: read_sc16is740_reg
*
*功能描述: 向SC16IS740寄存器写数据
*
*输 入: cmd 读具体的寄存器
*
* data 从寄存器读取的数据存放处
*
*输 出: 无
*********************************************************************************************************************/
static INT32S read_sc16is740_reg(INT8U cmd, INT8U *data,INT16U len)
{
INT32S err = 0;
INT8U address = 0;
INT16U i = 0;
if(0 == len) {
err = SC16IS740_LEN_ERR;
return err;
}
switch(cmd) {
case READ_LSR_REG:
address = 0x05;
break;
case READ_IIR_REG:
address = 0x02;
break;
case READ_RXLVL_REG:
address = 0x09;
break;
case READ_RHR_REG:
address = 0x00;
break;
case READ_DLL_REG:
address = 0x00;
break;
case READ_DLH_REG:
address = 0x01;
break;
case READ_LCR_REG:
address = 0x03;
break;
case READ_IER_REG:
address = 0x01;
break;
}
address = 0x80|(address << 3);
while(HWREG(SSI_BASE + SSI_O_SR) & SSI_SR_RNE)
HWREG(SSI_BASE + SSI_O_DR);
while(!(HWREG(SSI_BASE + SSI_O_SR) & SSI_SR_TNF));
select_chip();
HWREG(SSI_BASE + SSI_O_DR) = address;
for(i=0;i<1;i++) //读出SSI FIFO缓冲区中的无用数据
{
HWREG(SSI_BASE + SSI_O_DR) = 0xff;
while(!(HWREG(SSI_BASE + SSI_O_SR) & SSI_SR_RNE));
HWREG(SSI_BASE + SSI_O_DR);
}
for(i=0;i<len;i++)
{
HWREG(SSI_BASE + SSI_O_DR) = 0xff;
while(!(HWREG(SSI_BASE + SSI_O_SR) & SSI_SR_RNE));
data[i] = HWREG(SSI_BASE + SSI_O_DR);
}
while((HWREG(SSI_BASE + SSI_O_SR) & SSI_SR_BSY));
unselect_chip();
return len;
}
/*********************************************************************************************************************
*函数名称: write_sc16is740_reg
*
*功能描述: 向SC16IS740寄存器写数据
*
*输 入: cmd 写具体的寄存器
*
* data 写进寄存器的数据
*
*输 出: 无
*********************************************************************************************************************/
INT32S write_sc16is740_reg(INT8U cmd, INT8U *data,INT16U len)
{
INT32S err = 0;
INT8U address = 0;
INT16U i = 0;
if(0 == len) {
err = SC16IS740_LEN_ERR;
return err;
}
switch(cmd) {
case SET_DLL_REG:
address = 0x00;
break;
case SET_DLH_REG:
address = 0x01;
break;
case SET_LCR_REG:
address = 0x03;
break;
case SET_IER_REG:
address = 0x01;
break;
case SET_MCR_REG:
address = 0x04;
break;
case SET_FCR_REG:
address = 0x02;
break;
case SET_TCR_REG:
address = 0x06;
break;
case SET_EFR_REG:
address = 0x02;
break;
case SET_TLR_REG:
address = 0x07;
break;
case WRITE_THR_REG:
address = 0x00;
break;
default:
err = SC16IS740_CMD_ERR;
return err;
}
address = address << 3;//地址格式:R//W A3 A2 A1 A0 CH1 CH0 - 最高位为1表示读,为0表示写
//A3 A2 A1 A0 表示寄存器地址。CH1 CH0 表示通道都为0,最低位不使用
while(HWREG(SSI_BASE + SSI_O_SR) & SSI_SR_RNE)
HWREG(SSI_BASE + SSI_O_DR);
select_chip();
fram_write_enable();
unselect_chip();
while(!(HWREG(SSI_BASE + SSI_O_SR) & SSI_SR_TNF));
select_chip();
HWREG(SSI_BASE + SSI_O_DR) = address;
for(i=0;i<len;i++)
{
while(!(HWREG(SSI_BASE + SSI_O_SR) & SSI_SR_TNF));
HWREG(SSI_BASE + SSI_O_DR) = data[i];
}
while((HWREG(SSI_BASE + SSI_O_SR) & SSI_SR_BSY));
unselect_chip();
}
/*********************************************************************************************************
* 函数名称: send_sc16is740_data
*
* 功能简介: 向SC16IS740发送数据
*
* 详细描述: 无
*
* 输 入: data_buf 待发送的数据
* data_len 待发送的数据的长度
*
*
* 输 出: 0 数据没有发送出去
* >0 数据实际发出去的长度
*********************************************************************************************************/
INT16U send_sc16is740_data(INT8U *data_buf,INT16U data_len)
{
INT16U send_cnt = 0,i = 0;
INT8U *pdata = data_buf;
- 1
- 2
前往页