登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

有谁读过FM25C64

作者:janemxq 栏目:DSP技术
有谁读过FM25C64
我用2812EEPROM(FM25C64),通讯方式采用spi,但是写入一个数,读出的数总是
0xFF,
*************************************************************************/
#include "DSP28_Device.h"
unsigned int *ram_addr;
unsigned int flag,EEPROM_Addr11,Write_Length11;
unsigned CHAR Spi_VarRx[155];
void InitSpi(void)
{
    // Initialize SPI-A:
    GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;//SPISTEA high
    GpioDataRegs.GPFDAT.bit.GPIOF14=1; // 25LC_HOLD
    GpioDataRegs.GPADAT.bit.GPIOA4=1;  // 25LC_WP OUTPUT
    /* 8 bit data */
    // 47 C7 polarity =1 07 87 polarity=0
    // 16 phase =1   06 phase=0
    SpiaRegs.SPICCR.all = 0x07;       //上升沿8位长度  清 sw reset 位
    
    SpiaRegs.SPICTL.all = 0x06;          //信号不延迟.3/主机.2/使能发送.1/使能 int 0
    
    SpiaRegs.SPIBRR = 0x1e;              //低速外设BAUDRATE=150M/4/15=2.5M
    
    SpiaRegs.SPICCR.all = 0x87;          //准备下一字节收发 置 sw reset 位    
   
    //PieCtrl.PIEIER6.bit.INTx1 = 1;
   //PieCtrl.PIEIER6.bit.INTx2 = 1;
    
}

unsigned int Spi_TxReady(void)
{
    unsigned int i;
    if(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1)
    {
        i = 0;
    }
    else
    {
        i = 1;
    }
    return(i);
}

unsigned int Spi_RxReady(void)
{
    unsigned int i;
    if(SpiaRegs.SPISTS.bit.INT_FLAG == 1)
    {
        i = 1;
    }
    else
    {
        i = 0;
    }
    return(i);    
}
/*********************************************************************
    函数名:    void EEPROM_Write_Enable(void)
    目的:        EEPROM的写使能
    输入:        无
    输出:        无
*********************************************************************/
void EEPROM_Write_Enable(void)
{
//    unsigned int i;
    //判断SPI发送准备好
    while(Spi_TxReady() == 0);
    //
    GpioDataRegs.GPFDAT.bit.GPIOF3 = 0; //使能ste
    asm (" RPT #2 || NOP");
    //发送SPI
    SpiaRegs.SPITXBUF = WREN;
    //
    //判断SPI发送准备好
    while(Spi_TxReady() == 0);
    //
    delay_time(60);
    //
    GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
}

/*********************************************************************
    函数名:    void EEPROM_Write_Disable(void)
    目的:        EEPROM的写关闭
    输入:        无
    输出:        无
*********************************************************************/
void EEPROM_Write_Disable(void)
{
    //判断SPI发送准备好
    while(Spi_TxReady() == 0);
    //
    GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
    //发送SPI
    SpiaRegs.SPITXBUF = WRDI;
    //
    //判断SPI发送准备好
    while(Spi_TxReady() == 0);
    //
    delay_time(100);
    //
    GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
}

/*********************************************************************
    函数名:    unsigned int EEPROM_Read_Status(void)
    目的:        EEPROM的读状态
    输入:        无
    输出:        无
*********************************************************************/
unsigned int EEPROM_Read_Status(void)
{
    unsigned int i,data;
    //判断SPI发送准备好
    while(Spi_TxReady() == 0);
    //
    GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
    //发送SPI
    SpiaRegs.SPITXBUF = RDSR;
    //判断SPI发送准备好
//    while(Spi_TxReady() == 0);
    //发送SPI
//    SpiaRegs.SPITXBUF = 0xff;
    for(i = 0; i < 100; i++);
    //判断SPI发送准备好
    while(Spi_RxReady() == 0);
    //发送SPI
    data = SpiaRegs.SPIRXBUF;
    //判断SPI发送准备好
//    while(Spi_TxReady() == 0);
    //
    GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
    return data;
}

/*********************************************************************
    函数名:    void EEPROM_Write_Status(unsigned int write_status)
    目的:        EEPROM的写状态
    输入:        write_status    写状态寄存器的控制字
    输出:        无
*********************************************************************/
void EEPROM_Write_Status(unsigned int write_status)
{
    unsigned int i;
    //判断SPI发送准备好
    while(Spi_TxReady() == 0);
    GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
    asm (" RPT #2 || NOP");
    //发送SPI
    SpiaRegs.SPITXBUF = WRSR;
    //判断SPI发送准备好
    while(Spi_TxReady() == 0);
    //发送SPI
    SpiaRegs.SPITXBUF = write_status;
    //判断SPI发送准备好
    while(Spi_TxReady() == 0);
    //
    //delay_time(100);
  &nb
2楼: >>参与讨论
ssj
仔细看看datasheet
仔细读读25C64手册的读写时序,有可能是你的写过程没有严格按照他的要求作造成的。我就范过同样的毛病,查问题查的头疼。

3楼: >>参与讨论
f702p
还没解决呀?
其实你读的是伪数据呀,呵呵,
简单的说,每次spitx就有一个伪数据,这样说,懂不??

参与讨论
昵称:
讨论内容:
 
 
相关帖子
求救:6713板上(Emulator)计算结果与simulator不一致?
卷积计算不明白,x[n]卷h[n] = h[n]卷x[n],我用图解法卷的不对
关于中断和主程序之间的矛盾
CCS有BUG?
DSP刚开始学,碰到一个很奇怪的问题
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号