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; 麻烦做过类似工作的朋友帮个忙,指导下啊,小弟不胜感激 依然没有人。。。哪个大侠来救救我吧 我邮箱:lkwslk@qq.com有谁也在做这一方面的,希望可以讨论下 同求同求,lz如果如果有突破的话,要请教下了~ 2812的A12--A7怎么可能得到地址0x2800呢?按你程序的数据,得到的地址是0x0800啊。 cpld中cs01==1'b0,DSP对应的是ZONE0啊,起始地址为0x002000,加上这0x0800,不是刚好为0x2800吗 4楼不会是单纯为这个问题,特意注_册了个帐号吧,哈哈 回复【6楼】lkwslk1
cpld中cs01==1'b0,dsp对应的是zone0啊,起始地址为0x002000,加上这0x0800,不是刚好为0x2800吗
-----------------------------------------------------------------------
always @ (posedge clk)
begin
led <= sram;
end
endmodule
这个CLK和WR,RD等是异步的吧?是不是没有同步好?边沿错开了?你可以用示波器或是逻辑分析仪挂在总线上看下地址数据信息等是不是预期的结果。 可是,我给LED的值是缓存的啊,不要同步啊
页:
[1]