lkwslk1 发表于 2010-10-21 15:10:37

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

求助!!!
状态:以前开发板上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    D;         //数据信号

input    A;       //地址信号
output          led;      //LED输出

reg          led;

reg          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"

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

unsigned int Count,Flag;
/////////////////对应位低电平点亮该位发光二极管
const      Uint16      LedCode={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;                        //依次点亮灯,置相应位低电平
      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;

lkwslk1 发表于 2010-10-22 10:54:11

麻烦做过类似工作的朋友帮个忙,指导下啊,小弟不胜感激

lkwslk1 发表于 2010-10-25 08:54:17

依然没有人。。。哪个大侠来救救我吧

lkwslk1 发表于 2010-10-28 09:12:29

我邮箱:lkwslk@qq.com有谁也在做这一方面的,希望可以讨论下

happynewyear8 发表于 2010-11-1 23:44:58

同求同求,lz如果如果有突破的话,要请教下了~

astankvai 发表于 2010-11-2 07:55:07

2812的A12--A7怎么可能得到地址0x2800呢?按你程序的数据,得到的地址是0x0800啊。

lkwslk1 发表于 2010-11-5 09:03:13

cpld中cs01==1'b0,DSP对应的是ZONE0啊,起始地址为0x002000,加上这0x0800,不是刚好为0x2800吗

lkwslk1 发表于 2010-11-5 09:04:41

4楼不会是单纯为这个问题,特意注_册了个帐号吧,哈哈

astankvai 发表于 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等是异步的吧?是不是没有同步好?边沿错开了?你可以用示波器或是逻辑分析仪挂在总线上看下地址数据信息等是不是预期的结果。

lkwslk1 发表于 2010-11-5 10:28:27

可是,我给LED的值是缓存的啊,不要同步啊
页: [1]
查看完整版本: 2812通过CPLD用XINTF方式访问外部设备