[技术问答]

N76E003读取flash(eeprom)例程中,为什么要右移8位的?

[复制链接]
1629|12
手机看帖
扫描二维码
随时随地手机跟帖
xxh0201|  楼主 | 2019-4-20 16:40 | 显示全部楼层 |阅读模式
//***********************************************************************************************************
//  File Function: N76E003 APROM program DATAFLASH as EEPROM way
//***********************************************************************************************************
#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"

#define ADDR_BASE 0x4700

#define FLASH_L_LOW                        ADDR_BASE+1
#define FLASH_L_HIGH                ADDR_BASE+2
#define FLASH_H_LOW                        ADDR_BASE+3
#define FLASH_H_HIGH                ADDR_BASE+4

volatile unsigned char xdata page_buffer[128];


UINT8 Read_APROM_BYTE(UINT16 code *u16_addr)
{
    UINT8 rdata;
    rdata = *u16_addr>>8;
    return rdata;
}

*u16_addr>>8;为什么要右移的?

使用特权

评论回复
mcu5i51| | 2019-4-21 08:41 | 显示全部楼层
这个就是大小端的问题了,在不同的编译器上可能不同

使用特权

评论回复
zhuotuzi| | 2019-4-21 11:09 | 显示全部楼层
手册有没有讲?

使用特权

评论回复
zhuotuzi| | 2019-4-21 11:09 | 显示全部楼层
这种只要有实现目的了,我就懒得问为何这样

使用特权

评论回复
jasontu| | 2019-4-22 08:06 | 显示全部楼层
是的,是大小端問題

使用特权

评论回复
xxh0201|  楼主 | 2019-4-22 09:19 | 显示全部楼层
jasontu 发表于 2019-4-22 08:06
是的,是大小端問題

搞不懂大小端是什么回事。

N76E003里面,flash中某个地址里的数据不是一个8位数的吗?难道读出来的是16位的数。

用keil编译的。

使用特权

评论回复
xxh0201|  楼主 | 2019-4-22 09:20 | 显示全部楼层

手册里没有找到这方面的解释。

使用特权

评论回复
xxh0201|  楼主 | 2019-4-22 09:31 | 显示全部楼层
而手册上的  21.3  节里,却是这样的:下面红色的那句。

C 语言例程如下:
//******************************************************************************
// This code illustrates how to use IAP to make APROM 201h as a byte of
// Data Flash when user code is executed in APROM.
//******************************************************************************
#define PAGE_ERASE_AP 0x22
#define BYTE_PROGRAM_AP 0x21
/*Data Flash, as part of APROM, is read by MOVC. Data Flash can be defined as
128-element array in “code” area from absolute address 0x0200 */
volatile unsigned char code Data_Flash[128] _at_ 0x0200;
Main (void)
{
TA = 0xAA; //CHPCON is TA protected
TA = 0x55;
CHPCON |= 0x01; //IAPEN = 1, enable IAP mode
TA = 0xAA; //IAPUEN is TA protected
TA = 0x55;
IAPUEN |= 0x01; //APUEN = 1, enable APROM update
IAPCN = PAGE_ERASE_AP; //Erase page 200h~27Fh
IAPAH = 0x02;
IAPAL = 0x00;
IAPFD = 0xFF;
TA = 0xAA; //IAPTRG is TA protected
TA = 0x55;
IAPTRG |= 0x01; //write ‘1’ to IAPGO to trigger IAP process
IAPCN = BYTE_PROGRAM_AP; // Program 201h with 55h
IAPAH = 0x02;
IAPAL = 0x01;
IAPFD = 0x55;
TA = 0xAA;
TA = 0x55;
IAPTRG |= 0x01; //write ‘1’ to IAPGO to trigger IAP process
TA = 0xAA; //IAPUEN is TA protected
TA = 0x55;
IAPUEN &= ~0x01; //APUEN = 0, disable APROM update
TA = 0xAA; //CHPCON is TA protected
TA = 0x55;
CHPCON &= ~0x01; //IAPEN = 0, disable IAP mode
P0 = Data_Flash[1]; //Read content of address 200h+1
while(1);
}

使用特权

评论回复
qiangtech| | 2019-4-22 09:32 | 显示全部楼层
楼主可以试下不移,返回16位数看看。

使用特权

评论回复
xxh0201|  楼主 | 2019-4-22 16:08 | 显示全部楼层
//**********************************************************
下面是用两种方法,读flash的内容:

volatile unsigned char code data_flash[128] _at_ 0x4700;

unsigned int Read_APROM_BYTE(unsigned int code *u16_addr)
{
    unsigned int rdata;
    rdata = *u16_addr;           //>>8,不移位
    return rdata;
}
//*********************************************************

//*********************************************************
下面是主函数写,并读,再显示出来
    while(1)
    {
        for(i=0;i<128;i++)
        {
            showshuzi_8X16( 32, 12, (data_flash>>4)&0x0F,BLACK,WHITE);
            showshuzi_8X16( 40, 12,  data_flash&0x0F,BLACK,WHITE);          //这两行是直接显示数组的数据
                                                                       
            rus_read_eeprom = Read_APROM_BYTE((unsigned int code *)(0x4700+i));//读地址方法
            showshuzi_8X16( 16, 30, (rus_read_eeprom>>12)&0x0F,RED,WHITE);
            showshuzi_8X16( 24, 30, (rus_read_eeprom>>8)&0x0F,RED,WHITE);
            showshuzi_8X16( 32, 30, (rus_read_eeprom>>4)&0x0F,RED,WHITE);
            showshuzi_8X16( 40, 30,  rus_read_eeprom&0x0F,RED,WHITE);          //这四行是读地址,显示数组的数据

            HOLD_DISP();//等待,按下按键再运行
        }
    }

736245cbd764936945.png

625225cbd765fa73be.png

使用特权

评论回复
zhuotuzi| | 2019-4-22 18:24 | 显示全部楼层
是不是不移位就错了

使用特权

评论回复
lomo1316| | 2019-4-23 08:50 | 显示全部楼层

使用特权

评论回复
lomo1316| | 2019-4-23 09:41 | 显示全部楼层
UINT8 Read_APROM_BYTE(UINT8 code *u16_addr)
{
    UINT8 rdata;
    rdata = *u16_addr;
    return rdata;
}
这样改就不用移位了,跟大小端有点关系,但不是问题所在。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

17

帖子

1

粉丝