发 帖  
原厂入驻New
[问答]

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

105 c8051f500
分享
最近翻译一段汇编程序,使用的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 <compiler_defs.h>
#include <C8051F500_defs.h>            // SFR declarations
#include <absacc.h>

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]这句有没有啥问题?没读取到数,复用地址数据总线


0
快选.jpg
c8051f505.jpg
奖励10积分
2020-11-5 20:51:34   评论 分享淘帖 邀请回答

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
我要提问
关闭

站长推荐 上一条 /9 下一条

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