打印

LPC2378以太网与外部存储器访问冲突怎么回事?

[复制链接]
2169|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我用的是LPC2378(ARM7)处理器;通过EMC接口外扩了一片SRAM,单独访问SRAM时正常,但是以太网初始化后,就不能访问SRAM了,不知道怎么回事?请大家帮忙分析下,谢谢了!!!

如下,init_network()之前访问SRAM正常;
int main (void) {
  /* Main Thread of the TcpNet */
        U8 cnt,i;
        U8 buf[30];
        U8 *temp;
        U8 *temp2;
       
        init_led();   
        init_serial();
        EmcInit();
       
        sendchar('a');
        sendchar('b');
        temp=  (BYTE *)0x80000000;
        temp2=  (BYTE *)0x80000000;
        for (i=0;i<26;i++)
        {
                *(temp+i) = 'a'+i;
        }
        for (i=0;i<26;i++)
        {
                sendchar(*(temp2+i));/*串口发送a~z正常*/
        }         
        memcpy (buf, temp2, 26);   
        init_network();
        cnt=0;
        while (1)
        {
                timer_poll ();
                main_TcpNet ();
                if (tick == __TRUE) {
                  if (++cnt == SPEED) {       
                    net_Send_Data(buf,26);/*以太网发送a~z正常*/
                    cnt = 0;
                  }
                  tick = __FALSE;
                }  
        }
}

但是把init_network()往前放,放到EmcInit()后,就不能正常访问SRAM了,读出来都是0.如下
int main (void) {
  /* Main Thread of the TcpNet */
        U8 cnt,i;
        U8 buf[30];
        U8 *temp;
        U8 *temp2;
       
        init_led();   
        init_serial();
        EmcInit();
                init_network();/*移到前面*/
       
        sendchar('a');
        sendchar('b');
        temp=  (BYTE *)0x80000000;
        temp2=  (BYTE *)0x80000000;
        for (i=0;i<26;i++)
        {
                *(temp+i) = 'a'+i;
        }
        for (i=0;i<26;i++)
        {
                sendchar(*(temp2+i));/*串口发送全是0x00*/
        }         
        memcpy (buf, temp2, 26);   
        cnt=0;
        while (1)
        {
                timer_poll ();
                main_TcpNet ();
                if (tick == __TRUE) {
                  if (++cnt == SPEED) {       
                    net_Send_Data(buf,26);/*以太网发送全是0x00*/
                    cnt = 0;
                  }
                  tick = __FALSE;
                }  
        }
}

相关帖子

沙发
jlass| | 2013-1-4 09:21 | 只看该作者
是不是用了同一个片选信号。

使用特权

评论回复
板凳
zchong| | 2013-1-4 13:17 | 只看该作者
把原理图贴上来,初始化看一下哟没有公用的地方

使用特权

评论回复
地板
sjtuhcx|  楼主 | 2013-1-4 21:11 | 只看该作者
jlass 发表于 2013-1-4 09:21
是不是用了同一个片选信号。

以太网不需要片选信号,
EMC用的是CS0,好像没有冲突的引脚

使用特权

评论回复
5
sjtuhcx|  楼主 | 2013-1-4 21:23 | 只看该作者
jlass 发表于 2013-1-4 09:21
是不是用了同一个片选信号。

以太网不需要片选信号,
EMC接SRAM用的是CS0
好像相互之间没有直接冲突

使用特权

评论回复
6
sjtuhcx|  楼主 | 2013-1-4 21:34 | 只看该作者
zchong 发表于 2013-1-4 13:17
把原理图贴上来,初始化看一下哟没有公用的地方

EMC与SRAM接口电路,片选信号,经过CPLD将CS0与SRAM_CS连接,SRAM_A16置低电平。

以太网接口电路



相互直接没有冲突的引脚。

下面是一个更简单的测试例,init_TcpNet()是RTX自带的以太网初始化函数,不写该函数,SRAM访问正常,插入该函数,SRAM输出全是0x00.
int main (void) {
   U8 cnt,i;
   U8 *temp;
   U8 *temp2;

   init_serial();
   EmcInit();
  init_TcpNet ();//不加该函数,发送a~z正常,加后,读出来发送的都是0x00.

   sendchar('#');
   temp=  (BYTE *)0x80000000;
   temp2=  (BYTE *)0x80000000;
   for (i=0;i<26;i++)
   {
      *(temp+i) = 'a'+i;
   }
   for (i=0;i<26;i++)
   {
      sendchar(*(temp2+i));
   }   
   sendchar('#');

}

net2.jpg (242.92 KB )

net2.jpg

net.jpg (500.5 KB )

net.jpg

使用特权

评论回复
7
sjtuhcx|  楼主 | 2013-1-4 21:36 | 只看该作者
void EmcInit( void )
{
  /**************************************************************************
   * Initialize EMC
  **************************************************************************/
  U32 tmp;          
  
  SCS    |= 0x01;           
  PCONP  |= 0x00000800;                /* Turn On EMC PCLK */
  EMC_CTRL = 0x00000001;
  PINSEL6 = 0x00005555;
  PINSEL8 = 0x55555555;

  tmp                 = PINSEL9;
  tmp            &= 0x0FF0FFFF;
  PINSEL9  = tmp | 0x50090000;

  EMC_STA_CFG0      = 0x0;          /*8bit*/
  EMC_STA_WAITWEN0  = 0x0;
  EMC_STA_WAITOEN0  = 0x0;
  EMC_STA_WAITRD0   = 0x1f;
  EMC_STA_WAITPAGE0 = 0x0;
  EMC_STA_WAITWR0   = 0x1f;
  EMC_STA_WAITTURN0 = 0x0;

  EMC_STA_CFG1      = 0x00000000;          /*8bit*/
  EMC_STA_WAITWEN1  = 0x2;
  EMC_STA_WAITOEN1  = 0x2;
  EMC_STA_WAITRD1   = 0x1f;
  EMC_STA_WAITPAGE1 = 0x1f;
  EMC_STA_WAITWR1   = 0x1f;
  EMC_STA_WAITTURN1 = 0xf;
  return;
}

使用特权

评论回复
8
jlass| | 2013-1-5 08:39 | 只看该作者
原来接的是PHY芯片,我还以为是MAC+PHY呢,这样的话硬件上的冲突确实不大,你可以查一下init_TcpNet()改了哪些寄存器。看看有没有帮助。

使用特权

评论回复
9
sjtuhcx|  楼主 | 2013-1-5 09:28 | 只看该作者
jlass 发表于 2013-1-5 08:39
原来接的是PHY芯片,我还以为是MAC+PHY呢,这样的话硬件上的冲突确实不大,你可以查一下init_TcpNet()改了 ...

init_TcpNet()是RTX操作系统自带的函数,只知道它的功能,看不到具体代码。
LPC2378会不会有硬件Bug啊?找不到NXP的技术支持。。

使用特权

评论回复
10
sjtuhcx|  楼主 | 2013-1-6 09:56 | 只看该作者
怎么没人回复了,急啊啊!
我想用sRAM缓存外部数据,然后经以太网发送到上位机,这应该是很常用的方法啊!怎么不行呢?
请高手帮忙分析下,怎么排除这个问题呢?

使用特权

评论回复
11
jlass| | 2013-1-6 10:00 | 只看该作者
教楼主一招釜底抽薪的办法,在init_TcpNet()之前把所有的寄存器打印出来,然后运行init_TcpNet(),之后再把所有的寄存器打印出来,比较两者之间的差异。

当然,我必须说明一点,这会花费你比较多的时间,但结果可能毫无进展,所以你自己决定是否使用。

使用特权

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

本版积分规则

0

主题

0

帖子

0

粉丝