搜索
bottom↓
回复: 9

2812通过CPLD用XINTF方式访问外部设备

[复制链接]

出0入0汤圆

发表于 2010-10-21 15:10:37 | 显示全部楼层 |阅读模式
求助!!!
状态:以前开发板上cpld配有与2812配套的 .pof文件,烧进去,可以用的,改为自己写的CPLD程序后完全没反应,下面是自己写的CPLD程序和开发板2812部分程序资料。
管脚连接:使用TOP2812开发板,cpld接2812的A12--A7,cs01,XWE#,RD#,R/W#,XREADY,数据D0--D7。
目的:2812 向0x2800的地址写数据,cpld 接受数据后相应的控制 led。
cpld部分代码:
module xintftest(cs01,xwe,xrd,clk,D,A,led);
input clk;                 //时钟输入,30M
input         xwe,xrd,cs01;         //写信号,读信号,片选
input   [7:0] D;         //数据信号

input   [12:7] A;       //地址信号
output         [7:0] led;        //LED输出

reg         [7:0] led;

reg         [7:0] sram;        //缓存

always @ (xwe or xrd or cs01 or D or A)
        begin
                if((cs01==1'b0) && (A==6'b010000))  //2812写数据的地址为0x2800,cpld接2812的A12--A7
                        begin
                                if( !xwe )
                                        begin
                                                
                                                        sram <= D;
                                                
                                        end
                        end
        end

always @ (posedge clk)
        begin
                led <= sram;
        end

endmodule

2812部分代码:


#include "DSP28_Device.h"

#define  LedADDR   *(unsigned int *)0x2800        //8个发光二极管寄存器地址

unsigned int Count,Flag;
/////////////////对应位低电平点亮该位发光二极管
const        Uint16        LedCode[9]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF};

interrupt void ISRTimer0(void);
                 
void main(void)
{
        InitSysCtrl();                                        //初始化系统

        DINT;                                                //关中断
        IER = 0x0000;
        IFR = 0x0000;

        InitPieCtrl();                                        //初始化PIE
        InitPieVectTable();                                //初始化PIE中断矢量表
        InitPeripherals();                                //初始化外设
    InitGpio();
        EALLOW;        
        PieVectTable.TINT0 = &ISRTimer0;
        EDIS;   
        
        Count = 0;                                        //初始化变量
    Flag=0;
        ConfigCpuTimer(&CpuTimer0, 10, 1000000);        //设置CPU
        StartCpuTimer0();
   
        IER |= M_INT1;                                        //开中断
        PieCtrl.PIEIER1.bit.INTx7=1;

        EINT;                                                // 允许INTM
        ERTM;                                                // 允许DBGM

        LedADDR=0x00;                                        // 点亮全部8个LED灯
        for(;;)
        {        ;        }

}         

interrupt void ISRTimer0(void)
{
        PieCtrl.PIEACK.bit.ACK7=1;
        LedADDR = LedCode[Count];                        //依次点亮灯,置相应位低电平
        if (Flag==0) Count++; else Count--;
        if (Count>=8)//循环        
        {
           Flag=1;  }
        if (Count<=0)//循环        
        {
           Flag=0;
           }               
}

Xintf初始化:
  // All Zones:
    // Timing for all zones based on XTIMCLK = SYSCLKOUT/2
    XintfRegs.XINTCNF2.bit.XTIMCLK = 1;  // XTIMCLK = SYSCLKOUT/2
    XintfRegs.XINTCNF2.bit.CLKOFF = 1;   // DISABLE XCLKOUT
        XintfRegs.XINTCNF2.bit.WRBUFF = 0;   // NO WRITE BUFFER
        XintfRegs.XINTCNF2.bit.CLKMODE = 1;  // XCLKOUT = XTIMCLK/2
        // Zone 0
        // Ignore XREADY for Zone 1 accesses
        // Change read access lead/active/trail timing
        XintfRegs.XTIMING0.bit.USEREADY = 0;
        XintfRegs.XTIMING0.bit.XSIZE = 3;                // ALWAYS WRITE TO 11BIT
        XintfRegs.XTIMING0.bit.XWRACTIVE = 3;
        XintfRegs.XTIMING0.bit.XWRTRAIL=7;
        XintfRegs.XTIMING0.bit.XWRLEAD=3;
        XintfRegs.XTIMING0.bit.XRDLEAD = 3;
        XintfRegs.XTIMING0.bit.XRDACTIVE =7;
        XintfRegs.XTIMING0.bit.XRDTRAIL = 3;
        // Double lead/active/trial timing for Zone 1
        XintfRegs.XTIMING0.bit.X2TIMING=1;

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2010-10-22 10:54:11 | 显示全部楼层
麻烦做过类似工作的朋友帮个忙,指导下啊,小弟不胜感激

出0入0汤圆

 楼主| 发表于 2010-10-25 08:54:17 | 显示全部楼层
依然没有人。。。哪个大侠来救救我吧

出0入0汤圆

 楼主| 发表于 2010-10-28 09:12:29 | 显示全部楼层
我邮箱:lkwslk@qq.com  有谁也在做这一方面的,希望可以讨论下

出0入0汤圆

发表于 2010-11-1 23:44:58 | 显示全部楼层
同求同求,lz如果如果有突破的话,要请教下了~

出0入0汤圆

发表于 2010-11-2 07:55:07 | 显示全部楼层
2812的A12--A7怎么可能得到地址0x2800呢?按你程序的数据,得到的地址是0x0800啊。

出0入0汤圆

 楼主| 发表于 2010-11-5 09:03:13 | 显示全部楼层
cpld中cs01==1'b0,DSP对应的是ZONE0啊,起始地址为0x002000,加上这0x0800,不是刚好为0x2800吗

出0入0汤圆

 楼主| 发表于 2010-11-5 09:04:41 | 显示全部楼层
4楼不会是单纯为这个问题,特意注_册了个帐号吧,哈哈

出0入0汤圆

发表于 2010-11-5 09:18:56 | 显示全部楼层
回复【6楼】lkwslk1
cpld中cs01==1'b0,dsp对应的是zone0啊,起始地址为0x002000,加上这0x0800,不是刚好为0x2800吗
-----------------------------------------------------------------------

always @ (posedge clk)
        begin
                led <= sram;
        end

endmodule
这个CLK和WR,RD等是异步的吧?是不是没有同步好?边沿错开了?你可以用示波器或是逻辑分析仪挂在总线上看下地址数据信息等是不是预期的结果。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 15:22

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

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