搜索
bottom↓
回复: 7

25aa512系列SPI EEPROM连续写问题

[复制链接]

出0入0汤圆

发表于 2009-12-9 17:39:08 | 显示全部楼层 |阅读模式
按照数据手册,连续写不能跨页,页大小128,但我即使没有跨页,连续写只能是123字节以内,附文件包,请高手指教,万分感谢
点击此处下载 ourdev_512431.rar(文件大小:82K) (原文件名:spieepromZC.rar)
#include <avr\io.h>
#include <util/delay.h>
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
/*******************************************************
SPI通讯程序
********************************************************
部分接口定义
***************************************************/
#define DCLK         PB7     //SCK-1
#define DIN          PB6     //MISO-0
#define DOUT         PB5     //MOSI-1
#define CS           PB4     //SS-1
#define SelectMemory1()   PORTB&=~(1<<PB4)
#define DeselectMemory1() PORTB|=(1<<PB4)
#define ClrHoldMemory1()  PORTB&=~(1<<PB3)
#define SetHoldMemory1()  PORTB|=(1<<PB3)
#define WREN  0x06   // set write enable latch 设置写使能锁存
#define WRDI  0x04   // reset write enable latch 写使能锁存器复位
#define RDSR  0x05   // read status register 读状态寄存器
#define WRSR  0x01   // write status register 写状态寄存器
#define READ  0x03   // read data from memory array 从内存读取数据阵列
#define WRIT  0x02   // write data to memory array 数据写入存储器阵列
uchar spi_RDYCHK(void) ;
/*****************************************************
SPI初始化,接口初始化,中断初始化
******************************************************/
void spi_init(void)
{
    PORTB|= (1<<CS)|(1<<DOUT)|(1<<DIN); //ss设置为输出,主动控制总线选择,从设备每台一条SS线
        DDRB |= (1<<CS)|(1<<DOUT)|(1<<DCLK);//ss(低)、sck、mosi 输出方式,
        SPCR |= (1<<SPE)|(1<<MSTR)|(1<<CPHA); //使能spi、主机模式、高位在先、采样模式0(起始沿采样)、fosc/4
}
/****************************************************************
SPI基础函数,输出数据到MOSI,函数不具备接收方一定能接收到
******************************************************************/
void SPI_WriteByte(uchar data)
{
    SPDR = data;                                      //启动数据传输
    while(!(SPSR & (1<<SPIF)));                      //等待传输结束
}
/****************************************************************
SPI基础函数,接收MISO的数据,函数不具备一定能接收到需要的数据
******************************************************************/
uchar SPI_ReadByte(void)
{
  SPDR = 0xff;
  while(!(SPSR & (1<<SPIF)));                      //等待接收结束
  return SPDR;                                      //返回数据
}
/****************************************************************
eeprom spi基础函数,写允许使能
******************************************************************/
void spi_WREN(void)  
{
    SelectMemory1();   //选中设备
    SPI_WriteByte(WREN);
    DeselectMemory1();
}
/****************************************************************
eeprom SPI基础函数, 读状态寄存器
******************************************************************/
uchar spi_RDSR(void)      
{
    uchar Temp;
    SPI_WriteByte(RDSR);
    Temp = SPI_ReadByte();
    return Temp;
}
/****************************************************************
eepromSPI基础函数,检查RDY位,闲则返回1
******************************************************************/
uchar spi_RDYCHK(void)      
{
    uchar Temp;
        Temp = spi_RDSR();
    if (!(Temp&0x01))Temp=1;
        return Temp;
}  
/****************************************************************
EEPROM SPI基础函数,写状态寄存器
******************************************************************/
void spi_WRSR(uchar sdata)
{
    SPI_WriteByte(WRSR);
    SPI_WriteByte(sdata);
    while(!spi_RDYCHK());
}
/****************************************************************
SPI基础函数,读多个字节,读取开始地址eep_ADD,共读datalenth个数据,存于pdata
******************************************************************/
void ReadBytes(uint eep_ADD,uchar* pdata,uint datalenth) //读多个字节
{
    uint i;
    while(!spi_RDYCHK());
    SelectMemory1();
    SPI_WriteByte(READ);
    SPI_WriteByte(eep_ADD>>8);
    SPI_WriteByte(eep_ADD);
        for(i=0;i<datalenth;i++)
    {
        pdata = SPI_ReadByte();
    }
    DeselectMemory1();
}
/****************************************************************
SPI基础函数,写adrr开始5个字节
******************************************************************/
void Writebyte(uint adrr,uchar *pdata) //写多个字节
{
    uchar i;
        spi_WREN();
    SelectMemory1();  
    SPI_WriteByte(WRIT);
        SPI_WriteByte(adrr>>8);
    SPI_WriteByte(adrr);
        for (i=0;i<5;i++)
    {  
       SPI_WriteByte(pdata);
        }
        while(!spi_RDYCHK());
        SPI_WriteByte(WRDI);
    while(!spi_RDYCHK());
    DeselectMemory1();   
}
/****************************************************************
SPI基础函数,页写(25AA512一页128字节)写开始地址page,被写数据存于pdata
******************************************************************/
void Writeend(uint page,uchar *pdata) //写多个字节
{
    uchar i,ptr[5];
        uint eep_ADD;
        eep_ADD=128*page;
        spi_WREN();
    SelectMemory1();  
    SPI_WriteByte(WRIT);
        SPI_WriteByte(eep_ADD>>8);
    SPI_WriteByte(eep_ADD);
        for (i=0;i<128;i++)
    {  
       SPI_WriteByte(pdata);
        }
        while(!spi_RDYCHK());
        SPI_WriteByte(WRDI);
    while(!spi_RDYCHK());
    DeselectMemory1();
       
}
/****************************************************************
主函数
******************************************************************/
int main(void)
{
   uint i;
   uchar  rbuf[256],wbuf[256];
   DDRA=0XFF;
   PORTA=0X00;
   spi_init();
   for(i=0;i<256;i++)
   {
       wbuf=i+1;
   }
   
   while(1)
   {
      Writeend(0,wbuf);
          //Writebyte(123,wbuf);
      _delay_ms(100);
          // Writeend(1,wbuf);
          //Writebyte(123,wbuf);
     // _delay_ms(100);
          ReadBytes(0, rbuf,124);
      for(i=0;i<124;i++)  
      {
             PORTA=rbuf;_delay_ms(200);
          }
          /*Writezpage(0,wbuf); //写多个字节
          _delay_ms(100);
      ReadBytes(0, rbuf,64);
      for(i=0;i<64;i++)  
      {
            PORTA=rbuf;_delay_ms(200);
          }*/
        
   }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2009-12-16 17:09:58 | 显示全部楼层
问题已经解决:页内写,只要是不夸页,在写完所需数据后,芯片会自动进入写禁止,所以void Writeend(uint page,uchar *pdata) 函数里的SPI_WriteByte(WRDI); 是多余的。去掉
while(!spi_RDYCHK();
SPI_WriteByte(WRDI); 两句,问题即解决。

出0入0汤圆

发表于 2009-12-16 20:30:19 | 显示全部楼层
谢谢,看看

出0入0汤圆

发表于 2010-8-8 22:04:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-19 16:08:50 | 显示全部楼层
Mark

出0入0汤圆

发表于 2013-6-18 08:55:02 | 显示全部楼层
刚好用得上 谢谢分享

出0入0汤圆

发表于 2017-6-22 18:30:38 | 显示全部楼层
下载学习 谢谢分享和讨论 正在用

出0入0汤圆

发表于 2017-6-22 21:35:49 来自手机 | 显示全部楼层
谢谢,备用
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 04:48

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表