|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
有谁读过FM25C64 |
作者:janemxq 栏目:DSP技术 |
我用2812读EEPROM(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 于 2006/7/18 10:46:00 发布:
仔细看看datasheet 仔细读读25C64手册的读写时序,有可能是你的写过程没有严格按照他的要求作造成的。我就范过同样的毛病,查问题查的头疼。 |
3楼: | >>参与讨论 |
作者: f702p 于 2006/7/18 15:27:00 发布:
还没解决呀? 其实你读的是伪数据呀,呵呵, 简单的说,每次spitx就有一个伪数据,这样说,懂不?? |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |