发新帖我要提问
12
返回列表
打印

有关于SRAM简单的读写程序有的发份

[复制链接]
楼主: mage心寒
手机看帖
扫描二维码
随时随地手机跟帖
21
mage心寒|  楼主 | 2011-10-26 16:49 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
#include    "config.h"
#define uint unsigned int
#define uchar unsigned char
//#define SRAM_ADDR  (uint16 *)0x80000000   //SRAM的起始地址分配在BANK0
#define SRAM_ADDR  0x80000000
//由于BS62LV16008001的A0与LPC2214的A1相连,所以addr要左移一位
//#define GetAddr(addr)   (volatile uint16 *)(SRAM_ADDR|(addr<<1))
#define LED  0x000f0000
uint16 a=0;

void delay_ms(uint z)
{
   uint x,y;
   for(x=3000;x>0;x--)
      for(y=z;y>0;y--);
}

void sram_init()
{
PINSEL2=0x0e002020;          //拉低WE OE CS0
// BCFG0=0x0000104f;            //存储器组配置寄存器
PINSEL2=PINSEL2&0xfffffff7;  //将P1.16-P1.25设置为GPIO口
IO1DIR=LED;                  //将P1.16-1.19设置为输出端
IO1SET=LED;

}

void write_data(uint32 Addr, uint8 data)
{
  volatile uint16  *ip;
//  PINSEL2=0x0e002020;          //拉低WE OE CS1
  ip=(volatile uint16 *)(SRAM_ADDR|Addr);
  *ip=data;  
//  delay_ms(10);
// PINSEL2=0x0e002030;          //拉高WE OE CS0送数据
}

/*uchar read_data(uint32 Addr)
{
  uchar k;
  volatile uint16 *ip;
  ip=(volatile uint16 *)(SRAM_ADDR+0);
  k=*ip;
  return(k);
}*/

int main()
{
  volatile uint16  *addr;
  sram_init();
  while(1)
  {
      write_data(0x0,0x01);
  //    delay_ms(20);
  //    PINSEL2=0x0e002020;          //拉低WE OE CS0
      addr=(volatile uint16 *)SRAM_ADDR+0;
   //   delay_ms(20);
      a=(*addr);  
          if(a==0x01)   
          {
            IO1CLR=LED;
          }
          else
          {
            IO1SET=LED;
          }
   }
    //  while(1);
  return(0);
}
现在可以读,但地址改变后就回出错。。我的寄存器BCFG配置有点问题。。。有高手可以说说这方面的资料吗

使用特权

评论回复
22
mage心寒|  楼主 | 2011-10-26 17:37 | 只看该作者
今天下班了明天继续,,希望有人路过可以指点下。。本人不胜感激。。由于我新手刚接触嵌入式半个多月,很多东西不会。。您的指点也许我能省些几天的时间摸索。。

使用特权

评论回复
23
mage心寒|  楼主 | 2011-10-27 09:34 | 只看该作者
新的一天开始,现在数据能读出来了,但地址改变后就不正确了,不知道什么原因。。再看一遍书寻找新的突破口。。从51到arm的转变从I/O、总线的转变我感觉压力好大。。总有那么点东西不懂。。不能超越。。也许我太心急了吧。。静下心来再看一遍书。。加油。。

使用特权

评论回复
24
mage心寒|  楼主 | 2011-10-27 09:54 | 只看该作者
各位新手们一起加油哇。。。先给自己鼓励下。。不气馁。。。**就是胜利。。。

使用特权

评论回复
25
mage心寒|  楼主 | 2011-10-27 10:56 | 只看该作者
#include    "config.h"
#define uint unsigned int
#define uchar unsigned char
//#define SRAM_ADDR  (uint16 *)0x80000000   //SRAM的起始地址分配在BANK0
#define SRAM_ADDR  0x80000000
//由于BS62LV16008001的A0与LPC2214的A1相连,所以addr要左移一位
//#define GetAddr(addr)   (volatile uint16 *)(SRAM_ADDR|(addr<<1))
#define LED  0x000f0000
uint16 a=0;

void delay_ms(uint z)
{
   uint x,y;
   for(x=3000;x>0;x--)
      for(y=z;y>0;y--);
}

void sram_init()
{
PINSEL2=0x0e002020;          //拉低WE OE CS0
// BCFG0=0x0000104f;            //存储器组配置寄存器
// BCFG0=0XFFE00000;
PINSEL2=PINSEL2&0xfffffff7;  //将P1.16-P1.25设置为GPIO口
IO1DIR=LED;                  //将P1.16-1.19设置为输出端
IO1SET=LED;

}

void write_data(uint32 Addr, uint8 data)
{
  volatile uint16  *ip;
//  PINSEL2=0x0e002020;          //拉低WE OE CS1
  ip=(volatile uint16 *)(SRAM_ADDR|(Addr<<1));
  *ip=data;  
//  delay_ms(10);
// PINSEL2=0x0e002030;          //拉高WE OE CS0送数据
}

/*uchar read_data(uint32 Addr)
{
  uchar k;
  volatile uint16 *ip;
  ip=(volatile uint16 *)(SRAM_ADDR+0);
  k=*ip;
  return(k);
}*/

int main()
{
  volatile uint16  *addr;
  sram_init();
  while(1)
  {
      write_data(0x000002,0x01);
  //    delay_ms(20);
  //    PINSEL2=0x0e002020;          //拉低WE OE CS0
      addr=(volatile uint16 *)(SRAM_ADDR+(0x000002<<1));
   //   delay_ms(20);
      a=(*addr);  
          if(a==0x01)   
          {
            IO1CLR=LED;
          }
          else
          {
            IO1SET=LED;
          }
   }
    //  while(1);
  return(0);
}
至此程序的读写没有问题了这个程序可以从SRAM里面读写了,但有个问题就是BCFG寄存器的设置问题,我用自己的就不行。用默认的可以正常读写。。。

使用特权

评论回复
26
mage心寒|  楼主 | 2011-10-28 08:42 | 只看该作者
又是新的一天过来签个到,昨天终于把寄存器BCFG搞的差不多了吧,起码这个程序我可以理解了,我最后算的是WST1和WST2的值都等于2,这个是没有错的,关键错的是我开发板上SRAM的A0和主芯片的A1相接,所以如果MW设置为0的话肯定读写不对,最起码是设置为16位的,也就是说MW的值最少为1.当让为2也可以,这个我还没有理解,今天把这个啃掉,再看看两个通信中间的时序怎么动。。

使用特权

评论回复
27
mage心寒|  楼主 | 2011-10-28 08:45 | 只看该作者
BCFG0的默认值是0x2000fbef里面的MW设置为2,32位数据宽度,WST1和WST2的值都设置为最大值,WST我没有争议能够理解,就是MW的设置问题。我最后按我的设置BCFG0的值为0x1000104F,程序也没有问题。希望路过的高手可以帮我解释下BCFG这个寄存器。谢谢

使用特权

评论回复
28
mage心寒|  楼主 | 2011-10-28 13:07 | 只看该作者
有个新问题SRAM的读写访问时间Tram 和Twrite是指哪个比如说写吧图中的哪个,我搞不清楚,有路过帮忙看下啊。。[img][/img]

使用特权

评论回复
29
mage心寒|  楼主 | 2011-10-28 14:19 | 只看该作者
刚问了人,现在终于明白了,我们通常理解的读比写快,比如说U盘,从U盘里面复制内容到电脑上肯定比从电脑上拷贝到U盘上快,因为U盘的结构是nandflash,写信号的时候要应答,而SRAM没有应答,所以写比读快正常,跟书上写的也想吻合,到此我的SRAM简单的读写以及与CPU的通信最快速率已经基本完成了,如果有问题我会上来更新的。多谢这段时间21IC的陪伴,希望每个新人一定要由耐心,沉下心来慢慢去研究,有些东西不是你时半会就能搞定的。。搞不出来不要心急,多问问人,多看看书。

使用特权

评论回复
30
wangkj| | 2011-10-28 15:44 | 只看该作者
奖励一条裤子

使用特权

评论回复
31
mage心寒|  楼主 | 2011-10-28 17:12 | 只看该作者
额。。谢谢。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则