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.

[参考译文] TMS570LS3137:EMIF A0至 A15 (地址线 EMIF Ba1至 EMIF A14)的示波器图,我发现与 TMS570LS3137上的技术规格有偏差

Guru**** 2539500 points
Other Parts Discussed in Thread: TMS570LS3137, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/820411/tms570ls3137-oscilloscope-plots-of-emif-a0-to-a15-address-line-emif-ba1-to-emif-a14-and-i-found-an-deviation-from-specification-on-tms570ls3137

主题中讨论的其他器件:TMS570LS3137HALCOGEN

ART 编号:TMS570LS3137

您好,

在我的电路板上或闪存器件上均未连接、如 TMS570LS31x/21x TRM 中的图17.8b 所示、EMIF 寄存器设置为:

实际上,我看到的是我们#的两篇文章,而不是一篇。

例如、当我在外部异步存储器区域(0x60000000)的地址"0006"处写入一个简单的16位字时、

TMS 首先使用 W#在地址"0005"处写入另一个16位字、然后使用另一个 W#在地址"0006"处写入好的16位字。

因此、TMS 似乎会自动在正常字旁边的地址写入另一个字、然后在良好地址正确写入。

您是否认为在好的地址旁边的这个额外写入可能是由 HalCoGen 中的一个其它设置引起的? 还是 Code Composer Studio 中的设置?

生成到 NOR 闪存 A1和 NOR 闪存 A0 (TMS570LS3137的 EMIF_B1和 EMIF_A0线路)的地址信号 不正确。

 EMIF A0至 A15 (地址线 EMIF Ba1至 EMIF A14)的示波器波形图,我发现 与 TMS570LS3137上的技术规格有偏差  

A1和 A0上生成的地址信号不正确。

以下示波器图显示了为3个低半字节发送相同值以及读取 A0和 A1的执行情况,该值应遵循 A4和 A5,且应遵循 A8& A9。   

附加了我用于执行测试的测试项目,并在主 系统 REG1->GPREG1 |= 0x80000000中添加了对行的勘误修复;

找到错误 的 NOR 闪存 地址 A0和 A1切换 * ((uint16_t *) base_addr + 0x000C)= 0x00AA;  预期为1100二进制文件

A2为1

A1为1

A0 是1错误的位设置

Ba1为0

找到错误 NOR 闪存 地址 A0和 A1 切换  * ((uint16_t *) base_addr + 0x0005)= 0x00AA 时出错;   预期为0101二进制

A2为0

A1为1

A0是1错误的位设置

Ba1为0错误位复位

针对  *((uint16_t *) base_addr + 0x000A)= 0x00AA 正常工作;   

A2为1

A1为0

A0为1

Ba1为0

针对  *((uint16_t *) base_addr + 0x000F)= 0x00AA 正常工作;   

A2为1

A1为0

A0为1

Ba1为0

在 HALCOGEN PINMUX 上没有组装 L17 EMIF_NCS2 。 K17 EMIF_nCS3和 M17 EMIF_nCS4被组装。

HalCoGen 是否应该   连接到 NOR 闪存的 NOR EMIF addr 信号生成正确的代码?

EMIF_BA[1]连接到 NOR 闪存 A[0]、EMIF A[x]连接到存储器 A[x+1]。 如以下原理图所示。

以下主题中提到了类似的问题、但没有解决方案

https://e2e.ti.com/support/microcontrollers/hercules/f/312/t/284785?EMIF-16-bit-async-write-generates-multiple-writes

第二个线程

https://e2e.ti.com/support/microcontrollers/hercules/f/312/t/788623?TMS570LS3137-EMIF-Asynchronous-Timing-unable-to-Write-Read-device-properly

执行了以下建议  

请确保正确配置引脚多路复用器。


2.对于存储器接口、EMIF 地址引脚 EMIF_A[0]始终提供32位字地址的最低有效位。 因此、当连接到16位异步器件时、EMIF_BA[1]引脚提供半字的最低有效位。 EMIF_BA[1]应连接到存储器 A[0]引脚。


3.建议先尝试 CE2FFG 寄存器中 Setup、STROBE 和 HOLD 域的最大值、确保设置正常。

最可能的问题是由计时引起的。 EMIF 器件的设置、选通和保持是否有任何特殊要求? 您也可以将 EMIF 时钟降低到16MHz 吗?

正确的做法是、要正确地将数据写入 EMIF 异步存储器、必须使用 MPU 将存储器配置为器件类型或严格排序类型

6)

我还必须添加以下代码行、可能是 用于切换 EMIF 数据行和 EMIF 地址行的 Halcogen 故障。

systemREG1->GPREG1 |= 0x8000000;

DmmREG->PC1 = 1/* DATA[0]*/*!!! 应该是1 << 2!!*/
|(1 << 1)/*数据[1]*//*!!! 应该是1 << 3!!*/
|(1 << 2)/*数据[2]*//*!!! 等等!!!*/
|(1 << 3)/*数据[3]*/
|(1 << 4)/*数据[4]*/
|(1 << 5)/* data[5]*/
|(1 << 6)/* data[6]*/
|(0 << 7)/* data[7]*/
|(0 < 8)/* data[8]*/
|(0 << 9)/* data[9]*/
|(0 < 10)/* data[10]*/
|(1 << 11)/* data[11]*/
|(0 < 12)/*数据[12]*/
|(1 << 13)/* data[13]*/
|(1 << 14)/*数据[14]*/
|(0 < 15)/* data[15]*/
|(0 < 16)/* DMM 同步*
|(1 << 17)/* DMM CLK */
|(1 << 18);// DMM ENA */

7) 7) EMIF、45MHz

8) mpuInit()。

9) 9) EMIF 时钟应< 50MHz。 90MHz 超出有效范围。

10)还设置了 MPU 设置中0x6000_0000存储器区域的"器件模式"。 如果使用正常模式、则一个 nCS 周期中有多个新脉冲。

11) 11)是否可以确保从主例程中实际调用 MPU 初始化函数 mpuInit()? 该初始化不是由 HALCoGen 生成的默认启动序列完成的。

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

    您好、Chandre、

    引脚 L17专用于 NCS2。 NCS2无需引脚多路复用配置。 nCS3和 nCS4与 NHET 和 RTP 进行多路复用、因此在使用它们之前需要引脚多路复用配置。  EMIF 上没有芯片错误。

    EMIF 的原理图看起来不错。 nDQM[1:0](字节启用)不用于 NOR 闪存吗?

    3.您能否尝试正常模式而不是选择选通模式?

    读取示波器显示屏时。 示波器上的第一个地址位是字节(DQM[1:0])、第二个位是 BA[1](半字)、第三个位是 EMIF_addr[0]

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

    您好,Q J Wang 先生,

    感谢您提供详细信息,以下说明中有4个部分

    第1节:

     从 TMS570LS3137可以看到、单个写入命令对应3个写入周期。 请参阅下图。

    这是源代码中写入操作的范围。

    FLASH_WR (base_addr、LLD_UNLOD_ADDR1、NOR_UNLOD_DATA1);

    (*(((volatile FLASHDATA*)(base_addr))+((0x00000555)))=((((0xAA)*0x00000001)))

    我在36MHz 和90MHz 的不同 EMIF 频率下重复此操作,我得到相同的3个写入周期。  

    对于单个写入操作、这是预期的还是应该有3个写入周期(WC1..3)?

    我尝试过不同的 MPU 区设置、但它没有改变任何东西。 我最后取消了从第一个到最后一个(第12个)的所有"启用 MPU 区"、但额外的 Nwe 脉冲仍然存在。 因此、这似乎不是第五个区域被其他区域覆盖的问题。


    实际上,我有两篇文章,而不是一篇。 例如、当我在外部异步存储器区域(0x60000000)的地址"0006"处写入一个简单的16位字时、TMS 首先在地址"0005"处写入一个其他16位字、然后在地址"0006"处写入一个良好的16位字。 因此、TMS 似乎会自动在正常字旁边的地址写入另一个字、然后在良好地址正确写入。  

    第2节:

    生成到 NOR 闪存 A0和 NOR 闪存 A1 (TMS570LS3137的 EMIF_B1和 EMIF_A0线路)的地址信号 不正确。

    说明 NOR 闪存 A0和 NOR 闪存 A1 (TMS570LS3137中的 EMIF_BA1和 EMIF_A0行)中的问题 设置不正确如果我在整个硬件或固件中出现任何错误,请更正我的问题。

    NOR 闪存器 件 S29GL256S10DHV020是16Mx16 (32MB) 不需要 nDQM、因为它是16位器件、它从不切换到字节寻址、如果我说错了、请纠正我们的错误。  

    根据下面显示的示波器图,在地址0x60000555和0x60000CCC 上设置命令时,这些地址行在信号0 (NOR 闪存的 A0、TMS570的 EMIF_BA1)和信号1 (NOR 闪存的 A1)上探测。 TMS570的 EMIF_A0请参考上面的原理图快照) 错误地设置为地址0x60000556和0x60000CCE (根据下面的示波器图)。  

    如示波器图所示,该示波器图探测连接到 TMS570LS3137 EMIF_BA1和 EMIF_A0的 NOR 闪存的 A0和 A1 。

    1.感谢澄清了引脚 L17的详细信息。

    2. NOR 闪 存 S29GL256S10DHV020是16位可访问的,且 IC 上没有特定的 DQM 引脚 。 我们是否应该仍然使用 nDQM[1:0] ? 。 NOR 闪存,16Mx16 (32MB) 。 这是正确的,还是我们应该采用不同的方法?  

    3.是的,我尝试了正常模式而不是选择选通模式,并得到相同的响应。

    4.很抱歉 我不理解你的说法 。 根据规范,我们不使用第一位 nDQM[1:0] ,配置为16位异步 ,如下面的 EMIF_connections 快照所示。

    数据宽度始终为16位,因此 CEnCFG 设置为16_bit。

    EMIF_S29GL256S10DHV020汽车 NOR 闪存的连接、16Mx16 (32MB)

     

      

    第3节:选通信号模式打开

    我无法访问生产板上的线路。 我们有一个 TMS570LS3137 HDK,它可以访问所有线路 。  

    base_addr 为0x60000000

    空 EMIF_ASINNC1Init (空)


    emifREG->CE2CFG = 0x000000000000U;
    emifREG->CE2CFG =(uint32)((uint32) 1U << 31U)|
    (uint32)((uint32) 0U << 30U)|
    (uint32)((uint32) 2U << 26U)|
    (uint32)((uint32) 6U << 20U)|
    (uint32)((uint32) 1U <<17U)|
    (uint32)((uint32) 1U <<13U)|
    (uint32)((uint32) 11U << 7U)|
    (uint32)((uint32) 3U << 4U)|
    (uint32)((uint32) 3U << 2U)|
    (uint32)(((uint32) EMIF_16_bit_port);

    emifREG->AWCC =(emifREG->AWCC & 0xC0FF0000U)|
    (uint32)(((uint32) EMIF_PIN_LOW << 29U)|
    (uint32)(((uint32) EMIF_PIN_LOW << 28U)|
    (uint32)(((uint32) EMIF_WAIT_pin1 << 16U)|
    (uint32)((uint32) 0U);

    emifREG->PMCR =(emifREG->PMCR & 0xFFFFFF00U)|
    (uint32)((uint32) 0U << 2U)|
    (uint32)(((uint32) EMIF_8_words << 1U)|
    (uint32)((uint32) 0U);

    示波器图1:

    FLASH_WR (base_addr、LLD_UNLOD_ADDR1、NOR_UNLOD_DATA1);

    (*(((volatile FLASHDATA*)(base_addr))+((0x00000555)))=((((0xAA)*0x00000001)))

    写入操作:

    SIGNAL7 =数据1

    SIGNAL6= DATA0、

    信号5= W#、

    信号4= CS2、

    信号3= A2 (闪存的 A3)、

    信号2= A1 (闪存的 A2)、

    信号1 = A0 (闪存的 A1)、

    信号0 = Ba1 (闪存的 A0)、

    tek0000.png

    缩放100倍

    tek0001.png

    示波器图2:

     FLASH_WR (base_addr、LLD_UNLOD_ADDR2、NOR_UNLOD_DATA2);

    (*((((volatile FLASHDATA*)(base_addr)))+((0x000002AA))=((((0x55)*0x00000001)))

    tek0000.png

    放大100倍

    tek0001.png

    读取操作:  

    示波器图3:

    FLASH_WR (base_addr、LLD_UNLOD_ADDR1、NOR_UNLOD_DATA1);

    (*(((volatile FLASHDATA*)(base_addr))+((0x00000555)))=((((0xAA)*0x00000001)))

    读取操作:

    SIGNAL7 =数据1

    SIGNAL6= DATA0、

    信号5= OE#、

    信号4= CS2、

    信号3= A2 (闪存的 A3)、

    信号2= A1 (闪存的 A2)、

    信号1 = A0 (闪存的 A1)、

    信号0 = Ba1 (闪存的 A0)、

    (*(((volatile FLASHDATA*)(base_addr))+((0x008E))))

    tek0000.png

    缩放100倍

    tek0001.png

    第4节: 选通信号模式关闭

     空 EMIF_ASINNC1Init (空)



    emifREG->CE2CFG = 0x000000000000U;
    emifREG->CE2CFG =(uint32)((uint32) 0U << 31U)|
    (uint32)((uint32) 0U << 30U)|
    (uint32)((uint32) 2U << 26U)|
    (uint32)((uint32) 6U << 20U)|
    (uint32)((uint32) 1U <<17U)|
    (uint32)((uint32) 1U <<13U)|
    (uint32)((uint32) 11U << 7U)|
    (uint32)((uint32) 3U << 4U)|
    (uint32)((uint32) 3U << 2U)|
    (uint32)(((uint32) EMIF_16_bit_port);

    emifREG->AWCC =(emifREG->AWCC & 0xC0FF0000U)|
    (uint32)(((uint32) EMIF_PIN_LOW << 29U)|
    (uint32)(((uint32) EMIF_PIN_LOW << 28U)|
    (uint32)(((uint32) EMIF_WAIT_pin1 << 16U)|
    (uint32)((uint32) 0U);

    emifREG->PMCR =(emifREG->PMCR & 0xFFFFFF00U)|
    (uint32)((uint32) 0U << 2U)|
    (uint32)(((uint32) EMIF_8_words << 1U)|
    (uint32)((uint32) 0U);

     

    FLASH_WR (base_addr、LLD_UNLOD_ADDR1、NOR_UNLOD_DATA1);

    (*(((volatile FLASHDATA*)(base_addr))+((0x00000555)))=((((0xAA)*0x00000001)))

    写入操作:

    SIGNAL7 =数据1

    SIGNAL6= DATA0、

    信号5= W#、

    信号4= CS2、

    信号3= A2 (闪存的 A3)、

    信号2= A1 (闪存的 A2)、

    信号1 = A0 (闪存的 A1)、

    信号0 = Ba1 (闪存的 A0)、

     


     

     

    示波器图2:

     FLASH_WR (base_addr、LLD_UNLOD_ADDR2、NOR_UNLOD_DATA2);

    (*((((volatile FLASHDATA*)(base_addr)))+((0x000002AA))=((((0x55)*0x00000001)))

     

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

    您好!

    第1节:

    捕获的图看起来不正确。 只需一个写入周期(nCS 低电平)即可写入一个字节、半字(16位)或一个字(32位)。 当您写入32位数据时、新信号在写入第一个16位数据后失效、然后在写入第二个16位数据时失效。 NCS 在整个字节(字节写入)、整个半字(16位写入)和整个字(32位写入)中保持低电平。

    EMIF 时钟应< 50MHz。 90MHz 超出有效范围。

    当我在 地址0x6000_0006写入16位半字时、BA[1]=1、A0=1、A1=0、A2=0、 A3=0。 但您的捕获图显示 A3始终处于高电平

    请在 MPU 设置中为0x6000_0000存储器区域使用器件模式。 如果使用正常模式、则一个 nCS 周期中有多个新脉冲。

    我的理解是、您 在 WC1中写入一个16位数据、在 WC2中写入另一个16位数据、在 WC3中写入第三个16位数据。

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

    第2节:

    如果存储器没有启用字节、则可以将信号保持打开或下拉状态。 原理图中的信号连接正确:EMIF_A[0]- Memory_A[1]、EMIF_BA[1]- Memory_A[0]、...

    EMIF 系统总线宽度为32位宽。 A[0]始终是存储器地址的第3位(32位字)、BA[1]是第2位(16位)。 如果您将数据写入0x6000_0552、则 BA[1]=1、A[0]=0、A[1]=0、A[2]=1、 A[3]=0、A[4]=1、……

    这就是我在 NOR 闪存示例代码中混合闪存 CMD 和 CMD 地址的原因。

    我稍后将回答其他部分

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

    您好,王 Q J 先生,

    感谢您的澄清。

    对于 任何 MPU 区设置、EMIF 频率、数据宽度 、TMS570LS3137中至少有2个写入周期对应于单个写入命令。 请参见下图。

    我的结论:所以,TMS 似乎自动在 Good 旁边的地址写入(多于1个字)一个其他字。

    您是否认为在好的地址旁边的这个额外写入可能是由 HalCoGen 中的一个其它设置引起的? 还是 Code Composer Studio 中的设置?

    我运行了多个测试。  

    我在11MHz 和45MHz 的不同 EMIF 频率下重复此操作,我没有得到1个写入周期。  

    这是因为 单次写入操作有2个写入周期(WC1..2)还是3个写入周期(WC1..3)吗?

    我尝试过不同的 MPU 区设置、但它没有改变任何东西。 我最后取消了从第一个到最后一个(第12个)的所有"启用 MPU 区域"、但额外的 Nwe 脉冲仍然存在。 因此、这似乎不是第五个区域被其他区域覆盖的问题。

    因此、结果是正确的、但具有不必要的额外写入周期。  即使写入16位地址也会出现这种预期行为、是否可以将其修改为单次写入?

    这是源代码中写入操作的示波器图。

    (*(((volatile unsigned short*)((0x60000000)))+((0x00000555)))=((((0xAA)*0x00000001)))

    这是源代码中写入操作的示波器图。

    (*(((volatile unsigned long*)((0x60000000)))+((0x00000555)))=((((0xAA)*0x00000001)))

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

    您好!

    是否可以确保从主例程中调用 MPU 初始化函数 mpuInit()? 该初始化不是由 HALCoGen 生成的默认启动序列完成的。

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

    您好,Sunil,

     

    感谢您发送4个必需的更改。  您建议的这4个修复已实现、我可以在 W#上看到"单次写入"信号

    1) 1) EMIF 为45MHz

    2) mpuInit()。

    3) 3) EMIF 时钟应< 50MHz。 90MHz 超出有效范围。

    4) 4)还设置了 MPU 设置中0x6000_0000存储器区域的"器件模式"。 如果使用正常模式、则一个 nCS 周期中有多个新脉冲。

    TMS570LS3137能够写入器件并从 NOR 闪存读取 。 (我仍然没有验证所有时序图、也没有写入值和读取值)

    我将致力于实现低级驱动程序、以向 NOR 闪存器件写入数据并从 NOR 闪存器件读取数据。  

    我还必须添加以下代码行、可能是 用于切换 EMIF 数据行和 EMIF 地址行的 Halcogen 故障。

    systemREG1->GPREG1 |= 0x8000000;

    DmmREG->PC1 = 1/* DATA[0]*/*!!! 应该是1 << 2!!*/
    |(1 << 1)/*数据[1]*//*!!! 应该是1 << 3!!*/
    |(1 << 2)/*数据[2]*//*!!! 等等!!!*/
    |(1 << 3)/*数据[3]*/
    |(1 << 4)/*数据[4]*/
    |(1 << 5)/* data[5]*/
    |(1 << 6)/* data[6]*/
    |(0 << 7)/* data[7]*/
    |(0 < 8)/* data[8]*/
    |(0 << 9)/* data[9]*/
    |(0 < 10)/* data[10]*/
    |(1 << 11)/* data[11]*/
    |(0 < 12)/*数据[12]*/
    |(1 << 13)/* data[13]*/
    |(1 << 14)/*数据[14]*/
    |(0 < 15)/* data[15]*/
    |(0 < 16)/* DMM 同步*
    |(1 << 17)/* DMM CLK */
    |(1 << 18);// DMM ENA */

    下面是示波器图和 NOR 闪存读取值:-

    下面是使用通用闪存接口进行 NOR 闪存区域写入和读取以及器件识别

    再次感谢您花时间解决 EMIF 相关的问题。  

    以下是  使用通用闪存接口进行 NOR 闪存区域写入和读取以及器件识别的源代码

    if (ENABLE_NOR_FLASH_COMMAND = 0xEA8EEA8E)

    BASE_ADDRESS_EMIF_SDRAM =(无符号短整型*) 0x8000000;
    base_address_nor_flash =(无符号短整型*) 0x60000000;

    //读取外部 SDRAM 的 NOR 闪存内容  

    对于(读取=0;读取<65535;读取++)  

    base_address_EMIF_SDRAM = base_address_nor_flash;
    BASE_ADDRESS_EMIF_SDRAM++;
    base_address_nor_flash++;

    BASE_ADDRESS_EMIF_SDRAM =(无符号短整型*) 0x8000000;
    base_address_nor_flash =(无符号短整型*) 0x60000000;

    if (Erase_Sect_COMMAND = 0xEA8EEA8E)
    //完成芯片擦除命令需要70个 SECODNS

    (*(((volatile unsigned short*)((0x60000000)))+((0))))=((((0xF0*0x00000001)));
    (*(((volatile unsigned short*)((0x60000000)))+((0x00000555)))=((((0xAA)*0x00000001)));
    (*(((volatile unsigned short*)(0x60000000)))+((0x000002AA))=((((0x55)*0x00000001)));
    (*(((volatile unsigned short*)((0x60000000)))+((0x00000555)))=((((0x80)*0x00000001)));
    (*(((volatile unsigned short*)((0x60000000)))+((0x00000555)))=((((0xAA)*0x00000001)));
    (*(((volatile unsigned short*)(0x60000000)))+((0x000002AA))=((((0x55)*0x00000001)));
    (*(((volatile unsigned short*)(0x60000000))))=((((0x30)*0x00000001));//扇区擦除
    //(*((((volatile unsigned short*)(0x60000000)))+(0x00000555))=((((0x10)*0x00000001)));//芯片擦除
    for (delay=0;delay<65535;delay++);
    (*(((volatile unsigned short*)((0x60000000)))+((0))))=((((0xF0*0x00000001)));

    对于(read=0;read<19;read++)//按 CFI 读取设备 ID

    (*(((volatile unsigned short*)((0x60000000)))+((0x00000555)))=((((0xAA)*0x00000001)));
    (*(((volatile unsigned short*)(0x60000000)))+((0x000002AA))=((((0x55)*0x00000001)));
    (*(((volatile unsigned short*)((0x60000000)))+((0x00000555)))=((((0x90)*0x00000001)));
    DEVICE_ID[READ]=(unsigned char)(*(((volatile unsigned short*)(0x60000000)))+((0x0080+read))&0x000000FF);
    (*(((volatile unsigned short*)((0x60000000)))+((0))))=((((0xF0*0x00000001)));

    //LLD_ProgramCmd (base_address_nor_flash、offset++、source_address++);
    for (Write_NOL=0;Write_NOR <65535;Write_NOV++)

    (*(((volatile unsigned short*)((0x60000000)))+((0x00000555)))=((((0xAA)*0x00000001)));
    (*(((volatile unsigned short*)(0x60000000)))+((0x000002AA))=((((0x55)*0x00000001)));
    (*(((volatile unsigned short*)((0x60000000)))+((0x00000555)))=((((0xA0)*0x00000001)));
    (((((volatile unsigned short*)(0x60000000)))+((Write_NOR))))) = Write_NOR;

    for (delay=0;delay<5000;delay++);
    (*(((volatile unsigned short*)((0x60000000)))+((0))))=((((0xF0*0x00000001)));


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

    您好!

    第3节:

    很抱歉、我不熟悉您的代码:

    (*((((volatile FLASHDATA*)(base_addr)))+((0x000002AA))=((((0x55)*0x00000001)))

    您捕获的图不是写入一个字节或一个16位字或一个32位字的预期图。  

    您能否按照以下说明捕获用于写入字节、半字和字的波形:

    *(char *)  0x60000652 = 0x11;
    *(short *) 0x60000752 = 0x2233;
    *(int *)    0x60000954 = 0x44556677;

     

    1.*(char *)  0x60000652 = 0x11;  

    一个 NCS 和 Nwe

    EMIF_A[x:0]=基址地址+ 0x0652 >> 2 =  基址地址+ 0x0194

    BA[1]= 1

    2. *(short *) 0x60000752 = 0x2233;

    一个 NCS 和 Nwe

    EMIF_A[x:0]=基址地址+ 0x0752 >> 2 =  基址地址+ 0x01D4

    BA[1]= 1

    3. *(int *)    0x60000954 = 0x44556677;

    一个 nCS、但2个 Nwe。 第1个 Nwe 声明周期为0x4455、第2个声明周期为0x6677

    EMIF_A[x:0]=基址地址+ 0x0952 >> 2 =  基址地址+ 0x0254

    BA[1]= 1

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

    第4节:

    您的 EMIF 配置对我来说很合适。

    另一个要尝试的方法是增加 Setup、STROBE 和 HOLD 的周期数。 这些数字应满足渐近内存芯片的最低要求。

    从 S20GLx NOR 闪存数据表中、用于向闪存写入数据的 CMD 为:0x555-AA、0x2AA-55、0x555-A0、A-PD

    0x555是闪存地址、而不是 EMIF 地址。 请参阅我几周前给出的示例代码。

    闪存0x555 --> EMIF 0xAAA

    闪存0x2AA --> EMIF 0x554

    BTW、请检查汇编代码以了解:

    (*(((volatile FLASHDATA*)(base_addr))+((0x00000555)))=((((0xAA)*0x00000001)))

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

    尊敬的王先生:

    对 第3节的答复:

    所有示波器 图都具有以下信号信息  

    SIGNAL7 =数据1

    SIGNAL6= DATA0、

    信号5= W#、

    信号4= CS2、

    信号3= A2 (闪存的 A3)、

    信号2= A1 (闪存的 A2)、

    信号1 = A0 (闪存的 A1)、

    信号0 = Ba1 (闪存的 A0)、

    *(char *) 0x60000652 = 0x11;

    预期为1。 *(char *)  0x60000652 = 0x11;  

    一个 NCS 和 Nwe

    EMIF_A[x:0]=基址地址+ 0x0652 >> 2 =  基址地址+ 0x0194

    BA[1]= 1

    *(short *) 0x60000752 = 0x2233;

    预期2.  *(short *) 0x60000752 = 0x2233;

    一个 NCS 和 Nwe

    EMIF_A[x:0]=基址地址+ 0x0752 >> 2 =  基址地址+ 0x01D4

    BA[1]= 1

    *(int *) 0x60000954 = 0x44556677;

    预期3.  *(int *)    0x60000954 = 0x44556677;

    一个 nCS、但2个 Nwe。

    第1个 Nwe 声明周期为0x4455>> 2 =  基址地址+ 0x1115

    BA[1]= 0

    第二个是0x6677

    EMIF_A[x:0]=基址地址+ 0x0952 >> 2 =  基址地址+ 0x0254

    BA[1]= 1

    (*(((volatile FLASHDATA*)(base_addr))+((0x00000555)))=((((0xAA)*0x00000001)))

    扩展到  

    (*(((volatile unsigned short*)((0x60000000)))+((0x00000555)))=((((0xAA)*0x00000001)));

    等效的汇编语言为  

    (*(((volatile unsigned short*)((0x60000000)))+((0x00000555)))=((((0xAA)*0x00000001)));
    E59F0200  LDR R0、$C$CON23         领域64__TO_Real32:
    E3A0C0AA  MOV R12、#170
    E1C0B0  STRH R12、[R0]

    请查看以下 EMIF.C 设置、并让我知道 这些设置对于 S29GL256S10DHV020是正确的

    以下是 EMIF.c 中的设置  

    emifREG->CE2CFG = 0x000000000000U;

    emifREG->CE2CFG =(uint32)((uint32) 0U << 31U)|
    (uint32)((uint32) 0U << 30U)|
    (uint32)((uint32) 16U << 26U)|
    (uint32)((uint32) 48U << 20U)|
    (uint32)((uint32) 8U << 17U)|
    (uint32)((uint32) 8U << 13U)|
    (uint32)((uint32) 88U << 7U)|
    (uint32)((uint32) 24U << 4U)|
    (uint32)((uint32) 24U << 2U)|
    (uint32)(((uint32) EMIF_16_bit_port);

    emifREG->AWCC =(emifREG->AWCC & 0xC0FF0000U)|
    (uint32)(((uint32) EMIF_PIN_HIGH << 29U)|
    (uint32)(((uint32) EMIF_PIN_LOW << 28U)|
    (uint32)(((uint32) EMIF_WAIT_pin0 << 16U)|
    (uint32)((uint32) 0U);

    emifREG->PMCR =(emifREG->PMCR & 0xFFFFFF00U)|
    (uint32)((uint32) 0U << 2U)|
    (uint32)(((uint32) EMIF_4_words << 1U)|
    (uint32)((uint32) 0U);

    e2e.ti.com/.../8463.S29GL256S10DHV020.pdf

    您好,王 Q J 先生,  

    再次感谢您建议的所有解决方案,这些解决方案有助于解决 NOR 闪存实现问题。

    感谢您花时间并为您提供有关此问题的支持。

    对于任何在 EMIF 或闪存接口上寻找解决方案的用户,请遵循下面提到的主题。  

    现在、通过将正确的 MPU 设置作为 CS2地址0x60000000至0x61FFFFFF (32 MB)的器件来解决该问题。

    谢谢、致以诚挚的问候  

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

    您好!

    您为我为您提供的说明捕获的图表看起来不错。

    有关使用异步存储器的 EMIF 配置、请参阅第17.4.3.2节。

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

    您好,王 Q J 先生,  

    再次感谢您建议的所有解决方案,这些解决方案有助于解决 NOR 闪存实现问题。

    感谢您花时间并为您提供有关此问题的支持。

    对于任何在 EMIF 或闪存接口上寻找解决方案的用户,请遵循下面提到的主题。  

    https://e2e.ti.com/support/microcontrollers/hercules/f/312/t/820411

    现在、通过将正确的 MPU 设置作为 CS2地址0x60000000至0x61FFFFFF (32 MB)的器件来解决该问题。

    谢谢、致以诚挚的问候