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.

[参考译文] AM6442:定制电路板上的 OSPI 闪存问题

Guru**** 2390755 points
Other Parts Discussed in Thread: AM6442, UNIFLASH

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1488788/am6442-problems-with-ospi-flash-on-custom-board

器件型号:AM6442
Thread 中讨论的其他器件: UNIFLASH

工具/软件:

尊敬的 TI-Team:

一段时间前、我们使用 AM243x 芯片(电路板 A)构建了定制电路板。 我们使用 AM6442芯片(电路板 B)对该电路板进行了新版本。

板载 B 上的 OSPI 引导现在无法运行。 在新电路板上使用了完全相同的闪存、它与 AM243x 配合在电路板 A 上成功测试/使用。 组装好的闪存是一个 Micron MT35XU512ABA1G12-0AAT。
OSPI 闪存通常正常工作。 这意味着在 DEV-Boot 模式下引导并执行基本 SOC 初始化后、我可以使用 OSPI 闪存(如 OSPI 闪存 IO 或 OSPI 闪存诊断)成功执行程序。 我还能够通过修改后的 JTAG uniflash 程序来刷写引导加载程序。

以下是读取的 JEDEC 信息:

{

	"flashSize": 67108864,
	"flashPageSize": 256,
	"flashManfId": "0x2C",
	"flashDeviceId": "0x5B1A",
	"flashBlockSize": 131072,
	"flashSectorSize": 4096,
	"cmdBlockErase3B": "0xD8",
	"cmdBlockErase4B": "0xDC",
	"cmdSectorErase3B": "0x20",
	"cmdSectorErase4B": "0x21",
	"protos": {
		"p111": {
			"isDtr": false,
			"cmdRd": "0x03",
			"cmdWr": "0x02",
			"modeClksCmd": 0,
			"modeClksRd": 0,
			"dummyClksCmd": 0,
			"dummyClksRd": 0,
			"enableType": "0",
			"enableSeq": "0x00",
			"dummyCfg": null,
			"protoCfg": null,
			"strDtrCfg": null
		},
		"p112": null,
		"p114": null,
		"p118": {
			"isDtr": false,
			"cmdRd": "0x7C",
			"cmdWr": "0x84",
			"modeClksCmd": 0,
			"modeClksRd": 1,
			"dummyClksCmd": 0,
			"dummyClksRd": 7,
			"enableType": "0",
			"enableSeq": "0x00",
			"dummyCfg": null,
			"protoCfg": null,
			"strDtrCfg": null
		},
		"p444s": null,
		"p444d": null,
		"p888s": null,
		"p888d": {
			"isDtr": false,
			"cmdRd": "0x0B",
			"cmdWr": "0x12",
			"modeClksCmd": 0,
			"modeClksRd": 0,
			"dummyClksCmd": 8,
			"dummyClksRd": 20,
			"enableType": "0",
			"enableSeq": "0x00",
			"dummyCfg": {
				"isAddrReg": false,
				"cmdRegRd":"0x00",
				"cmdRegWr":"0x00",
				"cfgReg":"0x00000000",
				"shift":0,
				"mask":"0x00",
				"bitP":0
			},
			"protoCfg": {
				"isAddrReg": false,
				"cmdRegRd": "0x00",
				"cmdRegWr": "0x00",
				"cfgReg": "0x00000000",
				"shift": 0,
				"mask": "0x00",
				"bitP": 0
			},
			"strDtrCfg": {
				"isAddrReg": false,
				"cmdRegRd": "0x00",
				"cmdRegWr": "0x00",
				"cfgReg": "0x00000000",
				"shift": 0,
				"mask": "0x00",
				"bitP": 0
			}
		},
		"pCustom": { 
			"fxn": null
		}
	},
	"addrByteSupport": "1",
	"fourByteAddrEnSeq": "0xA1",
	"cmdExtType": "REPEAT",
	"resetType": "0x10",
	"deviceBusyType": "0",
	"cmdWren": "0x06",
	"cmdRdsr": "0x05",
	"srWip":  0,
	"srWel":  0,
	"cmdChipErase": "0xC7",
	"rdIdSettings": {
		"cmd": "0x9F",
		"numBytes": 5,
		"dummy4": 0,
		"dummy8": 0
	},
	"xspiWipRdCmd": "0x00",
	"xspiWipReg": "0x00000000",
	"xspiWipBit": 0,
	"flashDeviceBusyTimeout": 64000000,
	"flashPageProgTimeout": 120
}


但是、引导后、我不会进入 SBL NULL 引导加载程序、也无法在调试 UART 上看到任何消息打印。
我尝试通过直接在 main 中添加`loop_forever ()`来调试 SBL NULL。 但是、我将无法进入循环。 相反,我看到我被困在"奇怪"的地址。



因此、对我来说、芯片的 ROM 代码似乎无法在引导时成功访问 OSPI 闪存。
我是否还有其他调试功能?
是否有任何寄存器等、我可以在哪里找到问题所在?

提前感谢您的帮助或提示!


此致、
Dominik

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

    尊敬的 Dominik:

    这不是闪存有任何问题、我认为这是由于 SBL_NULL 中实现的热复位权变措施所致:

    出于测试目的、 可在 sbl_null 中定义此宏 DISABLE_WARM_REST_WA、以禁用此热复位权变措施。 然后重新编译并重新刷写 SBL、以检查您是否能够继续进行调试。

    此致、

    会面。

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

    尊敬的会议:

    首先感谢您的答复。 但是、我认为问题与热复位无关。 因为我的 loop_forever()在完成 warmreset 之前已被调用。 然而,我定义了这个宏,并再次尝试。 我有同样的行为,停在一个类似的地址。

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

    与此同时、我们取得了一些进展、但我们需要进一步的援助:
    -我们发现,组装在新的板上的闪存在 SFDP 表中提供了更多的数据
    -在旧版本中没有提供8D-8D-8D 的配置
    -如果我们在板上组装一个旧闪存,我们可以刷写引导加载程序,并看到引导加载程序输出

    因此、我们认为下面的勘误项与我们存在的问题相同:
    i2366:引导:ROM 无法理解8D-8D-8D 运行情况的特定 JEDEC SFDP 特性
    www.ti.com/.../sprz457i.pdf

    有一种权变措施描述:"存储器必须使用出厂时交换的字节顺序进行编程、或者使用 SoC 进行编程"

    这究竟意味着什么? 我们通过 JTAG uniflash 编程、但仍然存在问题、那么使用 SoC 进行编程是什么意思? 我们如何交换字节顺序?我们需要如何交换(我们交换的是4字节还是2字节)?

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

    更新:我尝试交换4字节和2字节"格式"的 sbl_null 引导加载程序的字节、但两个版本都无法成功引导。 您能否说明"存储器必须采用交换的字节顺序进行编程"的含义?

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

    我们通过将引导模式中的位9设置为0、从而阻止读取 SFDP 表、解决了该问题。 我们现在可以引导 SBL_NULL: