This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/RM57L843:NOR 闪存读取和写入

Guru**** 2484615 points
Other Parts Discussed in Thread: RM57L843, HALCOGEN

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/712728/ccs-rm57l843-nor-flash-read-and-write

器件型号:RM57L843
主题中讨论的其他器件: HALCOGEN

工具/软件:Code Composer Studio

你好

我需要一个用于 读取和写入 NOR 闪存"S29GL512T"的示例代码(HALCoGen 和 Code Composer Studio)、它与 CS3上的 RM57L843并行连接。

此致

Zain

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Zain、

    我在 NOR 闪存上执行了一些读/写测试。 尝试找到我的测试用例。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Zain、

    很抱歉耽误你的回答。 我找到了 NOR 闪存的测试用例。 以下是 NOR 闪存擦除/读取/写入和初始化函数:

    /*
    * NOR 闪存代码
    *由 QJ Wang 提供
    * 2012年3月19日
    *

    #include "EMIF_norFlash.h"
    #include "hL_sys_common.h"
    #include "HL_EMIF.h"

    uint32_t timeout = 0x00100000;


    /*---------------------------------------------- *
    * *
    * flash_init() *
    * *
    * 设置闪存 *
    * *
    ******************************************************************************************************* *
    uint16_t flash_init()

    /*----------------- *
    * *
    * NOR 闪存(插座) *
    * S29Gl512N 设置- 110ns - 64MB *
    * *
    ******--------------------------------------------------------------------------------------- *

    EMIF_ASYNC3Init();
    FLASH_BASE_PTR8 = FLASH_RESET;
    返回0;


    /*---------------------------------------------- *
    * *
    * flash_waitWhileErasing() *
    * *
    * 擦除时等待(Spansion Flash) *
    * *
    ******************************************************************************************************* *
    uint16_t _flash_waitWhileErasing( uint32_t addr、uint32_t timeout )

    uint8_t* pdata =(uint8_t*) addr;

    while (--timeout >0)
    如果(*pdata ==0xFF)
    返回0;/*正常、擦除完成*/

    /*发生超时*/
    FLASH_BASE_PTR8 = FLASH_RESET;
    返回1;


    /*---------------------------------------------- *
    * *
    * flash_waitWhileProgramming() *
    * *
    * 编程时等待(Spansion Flash) *
    * *
    ******************************************************************************************************* *
    uint16_t _flash_waitWhileProgramming( uint32_t addr、uint16_t data、uint32_t timeout )

    uint16_t* pdata =( uint16_t*) addr;

    while (--timeout >0)
    if (*pdata == data)(如果(*pdata ==数据)
    返回0;/*正常,编程完成*/

    /*发生超时*/
    FLASH_BASE_PTR8 = FLASH_RESET;

    返回1;



    /*---------------------------------------------- *
    * *
    * flash_erase (start、length) *
    * 擦除包含地址(开始)到(开始+长度)的闪存。 *
    * 闪存只能擦除包含此范围的整个块。 *
    * *
    * START <-起始地址 *
    * length <-以字节为单位的长度 *
    * *
    ******************************************************************************************************* *
    uint16_t flash_erase (uint32_t start、uint32_t length)

    uint32_t addr;
    uint32_t end;
    volatile uint16_t* addr16;

    结束=开始+长度- 1; //计算范围的末尾
    START &= 0xFFFFFFFE; //与16位字对齐

    /*
    *擦除范围内的每个闪存块
    *
    对于(addr = start;addr <= end;addr += flash_pagesize)

    addr16=( volatile uint16_t*) addr;
    * addr16 = flash_reset; //重置闪存
    FLASH_CTL555 = FLASH_CMD_AA;
    FLASH_CTL2AA = FLASH_CMD_55;
    FLASH_CTL555 = FLASH_ERASE; //擦除扇区命令
    FLASH_CTL555 = FLASH_CMD_AA;
    FLASH_CTL2AA = FLASH_CMD_55;
    * addr16 = flash_erase_sector;//擦除扇区确认

    #ifdef EMIF_USE_REORDER 修复
    EMIF_REVID = 0;
    #endif

    if (_flash_waitWhileErasing( addr,timeout))

    * addr16 = flash_reset;
    返回-1;



    返回0;

    /*---------------------------------------------- *
    * *
    * flash_write( src、dst、length ) *
    * 写入闪存地址[dst]非闪存地址[src]*上的数据
    * 对于[length]#bytes。 *
    * *
    * 源 源地址 *
    * 目的<-目的地址 *
    * length <-以字节为单位的长度 *
    * *
    ******************************************************************************************************* *
    uint16_t flash_write (uint32_t src、uint32_t dst、uint32_t length)

    uint32_t i;
    uint8_t* psrc8;
    uint16_t* pdst16;

    uint8_t extra 字节到写入;
    uint16_t full_word_to write = 0;
    uint8_t* lower byte_to write =(uint8_t*)(&full_word_to write);
    uint8_t* UPPER 字节至写入=(uint8_t*)(&full_word_to 写入+ 1);

    /*与16位闪存对齐*/
    if ((dst & 1)==1)

    *LOW_BYTE_TO_WRITE =*(uint8_t*)(dst-1);
    *UPLOAD_BYTE_TO_WRITE =*(uint8_t*)(src);
    flash_write((( uint32_t )&full_word_to write,dst-1,2 );
    dst=dst+1;
    src = src + 1;
    length = length - 1;


    /*
    *对齐到8或16位
    *
    extra byte_TO_WRITE =长度和1;

    psrc8 =(uint8_t*) src;
    pdst16 =( uint16_t*) dst;
    长度&= 0xFFFFFFFE;
    对于(i = 0;i < length;i += 2)

    /*
    *将16位源数据读取为2 x 8位字节。
    *这看起来相当奇怪,但可以避免出现任何寻呼问题
    *数据跨越多个高速缓存页,MMU 处于活动状态。
    *
    full_word_to _write =*psrc8 |(*(uint8_t*)(psrc8 + 1)<< 8);
    psrc8 += 2;

    /*编程一个16位字*/
    FLASH_CTL555 = FLASH_CMD_AA;
    FLASH_CTL2AA = FLASH_CMD_55;
    FLASH_CTL555 = FLASH_PROGRAM;
    *pdst16 = full_word_to write;

    /*等待编程完成*/
    if (_flash_waitWhileProgramming ((uint32_t) pdst16、full_word_to write、timeout))
    返回-1;

    pdst16++;


    /*对齐16位 SRC 最后*/
    if (extra byte_TO_WRITE = 1)

    *LOW_BYTE_TO_WRITE =*psrc8;
    *UPLOAD_BYTE_TO_WRITE =(*pdst16 )>>8;
    flash_write((( uint32_t )&full_word_to write ( uint32_t )pdst16、2 );


    /*
    *设置为读取模式
    *
    FLASH_BASE_PTR8 = FLASH_RESET;

    返回0;


    /*---------------------------------------------- *
    * *
    * flash_read (src、dst、length) *
    * 从闪存地址( src )读取到非闪存地址*上的数据
    * ( dst )表示( length )字节。 *
    * *
    * 源 源地址 *
    * 目的<-目的地址 *
    * length <-以字节为单位的长度 *
    * *
    ******************************************************************************************************* *
    uint16_t flash_read (uint32_t src、uint32_t dst、uint32_t length)

    uint32_t i;
    uint16_t* psrc16 =( uint16_t*) src;
    uint16_t* pdst16 =(uint16_t*) dst;

    /*
    *设置为读取模式
    *
    FLASH_BASE_PTR8 = FLASH_RESET;

    /*
    *将数据读取到缓冲区
    *
    对于(i = 0;i < length;i += 2)
    *pdst16++=*psrc16++;

    返回0;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 Wang

    很抱歉耽误你的回答。 我需要执行 HALCoGEN 步骤以在正常模式下配置并行闪存或任何其他异步存储器。

    此致

    Zain

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Zain、

    HALCoGen 中的 EMIF 异步配置非常简单。
    1.启用异步模块(
    2.如果需要外部等待
    EMIF 时钟
    4、异步模式
    5、时序:您可以先使用最大值、然后根据存储器器件的数据表调整该值。