天嵌 ARM开发社区

 找回密码
 注册
查看: 3455|回复: 12

TQ2440 与DSP 的HPI16通信 地址线信号与预期不符。

[复制链接]
C调的笨娃娃 发表于 2013-5-23 14:43:50 | 显示全部楼层 |阅读模式
本帖最后由 C调的笨娃娃 于 2013-6-9 13:53 编辑

我现在用TQ2440的总线接口连接DM642的DSP开发板,使用HPI-16接口通信,连接图如下图所示。为了控制HPI寄存器的选择和读写,采用地址线方法控制,由于HPI接入到nGCS3,所以对应的是BANK3地址是从0x18000000开始的
那么对应的个地址我们入下图所示
*---------------------------------------------------------------------------------------------------------------------------
*           AD4       AD3        AD2         AD1        AD0    偏移地址                 说明
*           HR/W   HCNTL1   HCNTL0   HHWIL                                     (ADDR[0-4])   
*             0         0             0            0              X      0X00                控制寄存器HPIC 高字节
*             0         0             0            1              X      0X02                写控制寄存器HPIC 低字节
*             1         0             0            0              X      0X10                读控制寄存器HPIC 高字节
*             1         0             0            1              X      0X12                  读控制寄存器HPIC 低字节
*
*
*             0         1             0            0              X      0X08            写地址寄存器HPIA 高字节
*             0         1            0           1              X     0X0A            写地址寄存器HPIA 低字节
*             1         1             0            0              X     0X18            读地址寄存器HPIA 高字节
*             1         1             0            1              X     0X1A            读地址寄存器HPIA 低字节
*
*
*             0          0           1              0             X     0X04            写数据寄存器HPID 高字节  地址自增
*             0          0            1              1           X     0X06            写数据寄存器HPID 低字节  地址自增
*             1          0            1              0            X     0X14            读数据寄存器HPID 高字节  地址自增
*             1          0            1             1            X     0X16            读数据寄存器HPID 低字节  地址自增
*
*
*             0           1            1              0            X     0X0C            写数据寄存器HPID 高字节  
*             0          1            1             1            X     0X0E            写数据寄存器HPID 低字节  
*             1           1            1              0            X     0X1C            读数据寄存器HPID 高字节  
*             1          1            1              1            X     0X1E            读数据寄存器HPID 低字节  
*
*****************************************************************************************************/

那么当我对0x18000000+(addr)上述偏移地址读写的时候,nCGS3自动会变低, 相应的nOE nWE也会被ARM自动置低或高,同时,地址总线也会根据我们的地址内容去跳变。
但是我对0x18000000+0x00、0x02、0x10、0x12 进行读写的时候ADDR2 就为0,此时为正确的。
接下来我对 0x18000000+0x08 0xa 0x18 0x1a进行读写的时候ADDR2就为1,此时与我理论上的配置相反。(如下图所示,黄色为nGCS3,蓝色为ADDR2,图中的波形代表红色代码的波形)


部分代码:
#define HPI_BASE_ADDRESS  0x18000000

#define HPIC_WRITE_H  (*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x02)) //写控制寄存器HPIC 高字节
#define HPIC_WRITE_L  (*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x00)) //写控制寄存器HPIC 低字节
#define HPIC_READ_H   (*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x12)) //读控制寄存器HPIC 高字节
#define HPIC_READ_L   (*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x10)) //读控制寄存器HPIC 低字节


#define HPIA_WRITE_H  (*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x06)) //写地址寄存器HPIA 高字节
#define HPIA_WRITE_L  (*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x04)) //写地址寄存器HPIA 低字节
#define HPIA_READ_H   (*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x16)) //读地址寄存器HPIA 高字节
#define HPIA_READ_L   (*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x14)) //读地址寄存器HPIA 低字节



        rBWSCON=rBWSCON|(1<<14)|(0x01<<12);//使能BANK3 nWAIT 16位带宽
        rBANKCON3=(0x10<<13)|(0x100<<8)|(0x11<<6);
        ChangeRomCacheStatus(RW_NCNB);//关闭ARM CACHE

               HPIC_WRITE_L=0x0005;
        HPIC_WRITE_H=0x0005;
        a=HPIC_READ_L;   
        b=HPIC_READ_H;   
        HPIA_WRITE_L=0x1000;  
        HPIA_WRITE_H=0x8000;
        c=HPIA_READ_L;  
        d=HPIA_READ_H;






请问是我的偏移地址有问题吗?还是什么原因出现的这种情况?



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
亚瑟王 发表于 2013-5-23 15:25:59 | 显示全部楼层
亲,你把DM9000接到bank3上,然后用如下的代码可以测试总线的读写的:
#define        DM9000_BASE                        0x18000300
#define        DM9000_DATA_OFFSET        4

static U8 dm9000_ior(int reg)
{
        *(volatile U8 *)DM9000_BASE = reg;
        return *(volatile U8 *)(DM9000_BASE+DM9000_DATA_OFFSET);
}

static void rd_dm9000_id(void)
{
        U16 id;
       
        id = dm9000_ior(0x28) | (dm9000_ior(0x29)<<8);
        Uart_Printf("read dm9000 vid = 0x%x\n", id);
       
        id = dm9000_ior(0x2a) | (dm9000_ior(0x2b)<<8);
        Uart_Printf("read dm9000 pid = 0x%x\n", id);
       
        id = dm9000_ior(0x8) | (dm9000_ior(0x9)<<8);
        Uart_Printf("read dm9000 reg(0x09,0x08) = 0x%x\n", id);
       
        Uart_Printf("dm9000 isr = 0x%x\n", dm9000_ior(0xfe));
}
 楼主| C调的笨娃娃 发表于 2013-5-23 15:32:15 | 显示全部楼层
亚瑟王 发表于 2013-5-23 15:25
亲,你把DM9000接到bank3上,然后用如下的代码可以测试总线的读写的:
#define        DM9000_BASE                        0x18000300
...

怎么接呢?开发板上不是接好了吗?有跳线使能吗? 还有我现在就是想确认我的那个偏移地址是否定义正确。
 楼主| C调的笨娃娃 发表于 2013-5-23 16:13:01 | 显示全部楼层
本帖最后由 C调的笨娃娃 于 2013-5-23 16:18 编辑

偏移地址我操作的是00 02 10 12 08 0a 18 1a;

但是实际测出来的不是
因此我判断是偏移地址预定义错误;
 楼主| C调的笨娃娃 发表于 2013-5-23 17:31:10 | 显示全部楼层
亚瑟王 发表于 2013-5-23 15:25
亲,你把DM9000接到bank3上,然后用如下的代码可以测试总线的读写的:
#define        DM9000_BASE                        0x18000300
...

没找到吧DM9000接到BANK3上的方法 底板上的dm9000不是已经连接到BANK3了吗?
是不是这样我就不能使用bank3了呢?
亚瑟王 发表于 2013-5-24 10:35:45 | 显示全部楼层
C调的笨娃娃 发表于 2013-5-23 17:31
没找到吧DM9000接到BANK3上的方法 底板上的dm9000不是已经连接到BANK3了吗?
是不是这样我就不能使用ban ...

底板上的是bank4
 楼主| C调的笨娃娃 发表于 2013-5-27 09:39:34 | 显示全部楼层
亚瑟王 发表于 2013-5-24 10:35
底板上的是bank4

那需要割板子咯 还是BANK3直接可以搭接到bank4上面去呢?
 楼主| C调的笨娃娃 发表于 2013-5-27 10:08:00 | 显示全部楼层
现在地址线上的信号正确了,但是整个信号毛刺特别多 不知道是为什么,还有就是为什么我的连续操作,在nGCS线上会有比较随机的时间间隔呢?如下图所示:

我的代码是
*(volatile unsigned short *)(0x18000000+0x00)=0x0005;
*(volatile unsigned short *)(0x18000000+0x02)=0x0005;
*(volatile unsigned short *)(0x18000000+0x08)=0x0000;
*(volatile unsigned short *)(0x18000000+0x0a)=0x8000;

a=*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x14);
b=*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x16);
c=*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x14);
d=*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x16);
e=*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x14);
f=*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x16);

A1=*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x10);
A2=*(volatile unsigned short *)(HPI_BASE_ADDRESS+0x12);

也就是12次连续对BANK3内的地址进行读写操作,为什么nGCS信号不连续呢?是与中断有关系还是与什么有关系呢?
请会的人解答我这个问题,谢谢!






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
亚瑟王 发表于 2013-5-27 10:12:15 | 显示全部楼层
C调的笨娃娃 发表于 2013-5-27 10:08
现在地址线上的信号正确了,但是整个信号毛刺特别多 不知道是为什么,还有就是为什么我的连续操作,在nGCS线 ...

我认为是你的驱动有bug,建议你用dm9000的做对比。
同时建议你仔细阅读一下芯片手册的总线章节看一下是否有遗漏的地方。
 楼主| C调的笨娃娃 发表于 2013-5-27 10:22:22 | 显示全部楼层
亚瑟王 发表于 2013-5-27 10:12
我认为是你的驱动有bug,建议你用dm9000的做对比。
同时建议你仔细阅读一下芯片手册的总线章节看一下是否 ...

我这个是裸机做的测试,现在就是在访问总线的时候 会出现这种间断,不理解为什么会出现这个问题,我用的是开发板自带的测试程序修改的。
亚瑟王 发表于 2013-5-27 15:16:59 | 显示全部楼层
C调的笨娃娃 发表于 2013-5-27 10:22
我这个是裸机做的测试,现在就是在访问总线的时候 会出现这种间断,不理解为什么会出现这个问题,我用的是 ...

这种间断的事情就没有注意到了,建议你在Linux或WinCE跑起来之后,测试一下DM900读写时的总线信号看一下是怎么工作的吧。
 楼主| C调的笨娃娃 发表于 2013-6-8 11:03:56 | 显示全部楼层
亚瑟王 发表于 2013-5-27 15:16
这种间断的事情就没有注意到了,建议你在Linux或WinCE跑起来之后,测试一下DM900读写时的总线信号看一下是 ...

毛刺特别多是由于设置了 BANKCON3 跟BWSCON 造成的!
rBWSCON=rBWSCON|(1<<14)|(0x01<<12);//使能BANK3 nWAIT 16位带宽
        rBANKCON3=(0x10<<13)|(0x100<<8)|(0x11<<6);
如果使用启动代码里面的默认设置,就不会有毛刺了!
亚瑟王 发表于 2013-6-8 11:23:34 | 显示全部楼层
C调的笨娃娃 发表于 2013-6-8 11:03
毛刺特别多是由于设置了 BANKCON3 跟BWSCON 造成的!
rBWSCON=rBWSCON|(1

哦,调试dm9000时OK之后就没有去看波形。
如果问题解决了请将帖子类型修改为“已解决”(请参考:http://www.armbbs.net/forum.php?mod=viewthread&tid=15200)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-3 11:47 , Processed in 1.046875 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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