单片机/MCU论坛
直播中

李东国

12年用户 18经验值
擅长:测量仪表
私信 关注
[问答]

求大神指点c8051f505带片选复用EMIF读取外部XRAM数据问题

最近翻译一段汇编程序,使用的c8051f505单片机,与FPGA之间是地址数据总线通讯,通过中断在地址中读取数据,汇编程序能顺利跑起来,我翻译成c后发现进入中断怎么也读取不到地址的数据,求大神指点,汇编代码如下:
               LJMP    MAIN
            ORG    000BH
        LJMP    A1CDF
        ORG    001BH
        LJMP    A1CC8
         

MAIN:           
                    ANL  PCA0MD,    #0BFh
  
         
                MOV     SFRPAGE, #CONFIG_PAGE
                MOV     OSCICN, #0C5H
                MOV     P0SKIP,  #03H
                MOV     P1SKIP , #0E0H
                MOV      0, #00H             ;交叉开关使能
                MOV     XBR1, #0C0H
                MOV     XBR2, #040H   
                MOV     P2MDIN,    #0FH   ;端口配置,P0开漏,p1,P4口为推挽输出
                MOV     P1MDOUT,   #0E7H
                MOV     P2MDOUT,   #0FH
                MOV     P3MDOUT,   #0FFH    ;P0-p4端口为数字输入,p2四位模拟输入端口     
                MOV     P4MDOUT,   #0FFH
                MOV  EMI0CF,    #09H
                MOV   EMI0TC,    #045H
                                MOV SFRPAGE,   #ACtiVE_PAGE ;外部储存器设置
               
      CLR      P1.1            
      LCALL    A1D30
    CLR    P1.0        ;15530主复位
    CLR      P1.4        ;开接收
        SETB    EA        ;清中断屏蔽位,开CPU中断
A1CC8:        PUSH    DPL        ;接收中断服务子程(T1中断)
        PUSH    DPH
        PUSH    ACC
        MOV    DPTR,#02001H
        MOVX    A,@DPTR
        JB    B.0,A1D19
        MOV    RMSB,A
        MOV    COM_DATA,#00H
      ;SETB    P2.1
        JNB    P1.3,A1D1D
        MOV    COM_DATA,#0FFH
    A1D1D:    SETB    B.0
        SJMP    LP5
    A1D19:    MOV    RLSB,A
        SETB    B.3
    SJMP    LP5
翻译成c后
#include
#include             // SFR declarations
#include

void Oscillator_Init(void)
{
    SFRPAGE   = CONFIG_PAGE;
    OSCICN    = 0xC5;
    SFRPAGE = ACTIVE_PAGE;

}
//定时器初始化//A1D30
void Timer_Init(void)                       
{
    ET0=1;
    ET1=1;
    TR0=1;
    TR1=1;
    TMOD=0x66;
    TL0=0xF8;
    TH0=0xF8;
    TL1=0xF8;
    TH1=0xF8;
}
void EMI_IN(void)
{
    SFRPAG=CONFIG_PAGE;
    EMI0CF   = 0x09;                    //配置EMIF端口复用方式,带块选择的分片方式,<4k用内存,>4k用外存
    EMI0TC    = 0x45;                    //最小地址建立时间、最大保持时间。原值55H
    SFRPAGE=ACTIVE_PAGE ;
}
void Port_IO_Init(void)
{
    SFRPAGE   = CONFIG_PAGE;
    P0SKIP = 0x03;                    // Skip P0.0 and P0.1
    P1SKIP = 0xE0;  
    XBR0      = 0x00;
    XBR1      = 0xC0;                       //T2、T1、T0连接到端口引脚
    XBR2      = 0x40;                       //使能交叉开关
    P2MDIN    = 0x0F;                       //设置P2口没有模拟输入
    P1MDOUT   = 0xE7;                       //推挽输出带负载能力强
    P2MDOUT   = 0x0F;
    P3MDOUT   = 0xFF;
    P4MDOUT   = 0xFF;
    SFRPAGE=ACTIVE_PAGE ;
}
INTERRUPT(TIMER1_ISR, INTERRUPT_TIMER1)
{
    if(BB0)
    {
    RLSB=XBYTE[0X2001];
        BB3=1;
    }

    else
    {
        RMSB=XBYTE[0X2001];
        COM_DATA=0x00;
        if(P13==0)BB0=1;
        else
        {
            COM_DATA=0xff;
            BB0=1;
        }   
    }
}
在c中RMSB=XBYTE[0X2001]这句有没有啥问题?没读取到数,复用地址数据总线


  • 快选.jpg
  • c8051f505.jpg
已退回10积分

更多回帖

发帖
×
20
完善资料,
赚取积分