Multi Source Translation Content

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

Multi Source Translation Content

ディスカッション

ソート順:
Custom S32G399A board: No frames cross switch-facing RGMII bus in either direction Board: Custom S32G399A based module, derived from S32G-VNP-RDB3. PFE_MAC1 connected via RGMII (PE_02–PE_13) to an NXP SJA1110A switch port 2, configured as the DSA CPU port (in-tree sja1105 driver, kernel 6.x BSP43.0). Topology: - PFE_MAC0: SGMII via SerDes1 lane1, Mode 1 - PFE_MAC1: RGMII to SJA1110A port 2 (DSA CPU port) — the port in question - PFE_MAC2: SGMII via SerDes0 lane1 The S32G MACs are configured as follows: +---------+--------------+------------------+ |                    | LANE 0               | LANE 1                        | +---------+--------------+------------------+ | SERDES0    | GMAC (SGMII) | PFE_MAC2 (SGMII)  | | SERDES1      | NOT USED        | PFE_MAC0 (SGMII) | +---------+--------------+------------------+ Full U-Boot hwconfig: hwconfig=pcie0:mode=sgmii,clock=ext,fmhz=100,xpcs_mode=both;pcie1:mode=sgmii,clock=ext,fmhz=100,xpcs_mode=0 pfeng_mode=enable,sgmii,rgmii,sgmii DTS for port@2 (switch side): port@2 { reg = <2>; label = "OBC-1"; ethernet = <&pfe_netif1>; phy-mode = "rgmii"; rx-internal-delay-ps = <0>; tx-internal-delay-ps = <0>; fixed-link { speed = <1000>; full-duplex; }; }; DTS for pfe_netif1 (MAC side): &pfe_netif1 { phy-mode = "rgmii"; status = "okay"; fixed-link { speed = <1000>; full-duplex; }; }; PFE_MAC1 (pfe1) link state — confirmed up and correctly configured at the Linux/driver level: dmesg at boot: [ 5.264108] pfeng 46000000.pfe: netif name: pfe1 [ 5.274127] pfeng 46000000.pfe: netif(pfe1) linked phyif: 1 [ 5.279692] pfeng 46000000.pfe: netif(pfe1) mode: std [ 5.284853] pfeng 46000000.pfe: netif(pfe1) HIFs: count 1 map 02 [ 6.012884] pfeng 46000000.pfe pfe1 (uninitialized): Subscribe to HIF1 [ 6.019438] pfeng 46000000.pfe pfe1 (uninitialized): Host LLTX disabled [ 6.026270] pfeng 46000000.pfe pfe1 (uninitialized): Enable HIF1 [ 6.032374] pfeng 46000000.pfe pfe1 (uninitialized): setting MAC addr: 00:04:9f:be:ef:01 [ 6.040545] pfeng 46000000.pfe pfe1 (uninitialized): PTP HW addend 0x80000000, max_adj configured to 46566128 ppb [ 6.060939] pfeng 46000000.pfe pfe1 (uninitialized): Registered PTP HW clock successfully on EMAC1 [ 6.070441] pfeng 46000000.pfe pfe1: registered [ 6.207482] pfeng 46000000.pfe pfe1: configuring for fixed/rgmii link mode [ 6.214306] pfeng 46000000.pfe pfe1: Set TX clock to 125000000Hz [ 6.220158] pfeng 46000000.pfe pfe1: Link is Up - 1Gbps/Full - flow control off [ 5.257995] pfeng 46000000.pfe: EMAC0 interface mode: 4 [ 5.290707] pfeng 46000000.pfe: EMAC1 interface mode: 9 [ 5.323320] pfeng 46000000.pfe: EMAC2 interface mode: 4 [ 5.354571] pfeng 46000000.pfe: Interface selected: EMAC0: 0x4 EMAC1: 0x9 EMAC2: 0x4 [ 5.382609] pfeng 46000000.pfe: TX clock on EMAC0 for interface sgmii installed [ 5.390050] pfeng 46000000.pfe: RX clock on EMAC0 for interface sgmii installed [ 5.404998] pfeng 46000000.pfe: TX clock on EMAC1 for interface rgmii installed [ 5.419918] pfeng 46000000.pfe: Defer enabling of RX clock on EMAC1 for interface rgmii (ret: -5) [ 5.434235] pfeng 46000000.pfe: TX clock on EMAC2 for interface sgmii installed [ 5.448374] pfeng 46000000.pfe: RX clock on EMAC2 for interface sgmii installed [ 5.667058] pfeng 46000000.pfe: EMAC timestamp external mode bitmap: 0 [ 5.998447] pfeng 46000000.pfe pfe0 (uninitialized): Registered PTP HW clock successfully on EMAC0 [ 6.060939] pfeng 46000000.pfe pfe1 (uninitialized): Registered PTP HW clock successfully on EMAC1 [ 6.130296] pfeng 46000000.pfe pfe2 (uninitialized): Registered PTP HW clock successfully on EMAC2 [ 6.215040] pfeng 46000000.pfe: RX clock on EMAC1 for interface rgmii installed Live DTB confirms the kernel matches the source DTS: # cat /proc/device-tree/soc/pfe@46000000/ethernet@11/phy-mode rgmii ip a output: 6: pfe1: mtu 1536 qdisc mq state UP group default qlen 1000 link/ether 00:04:9f:be:ef:01 brd ff:ff:ff:ff:ff:ff inet6 fe80::204:9fff:febe:ef01/64 scope link All SJA1110 DSA slave ports correctly enumerated. This confirms the sja1105 DSA driver bound successfully to pfe1 as the CPU port/DSA master and parsed the static config without error. Clock tree: both TX and RX RGMII clocks enabled and attached to the correct consumer: # cat /sys/kernel/debug/clk/clk_summary | grep pfe1 pfe1_tx_mii 0 0 0 125000000 0 0 50000 Y deviceless no_connection_id pfe1_rx_mii 0 0 0 125000000 0 0 50000 Y deviceless no_connection_id pfe1_tx_rmii 0 0 0 125000000 0 0 50000 Y deviceless no_connection_id pfe1_rx_rmii 0 0 0 125000000 0 0 50000 Y deviceless no_connection_id pfe1_tx_rgmii 1 1 0 125000000 0 0 50000 Y ethernet@11 tx_rgmii pfe1_rx_rgmii 1 1 0 125000000 0 0 50000 Y ethernet@11 rx_rgmii pfe1_tx_sgmii 0 0 0 125000000 0 0 50000 Y deviceless no_connection_id pfe1_rx_sgmii 0 0 0 125000000 0 0 50000 Y deviceless no_connection_id So pfe1 is UP, LOWER_UP, correctly bound to the SJA1110 as DSA master, running in RGMII mode with both clocks enabled — this rules out pfe1 being down, unbound, or misconfigured at the Linux/driver level. The open question is specifically whether frames actually cross the physical RGMII pins between PFE_MAC1 and SJA1110 port 2. Issue: No traffic appears to cross the RGMII bus between PFE_MAC1 and SJA1110 port 2 in either direction, despite everything on both sides of that bus being independently up: Test 1 — S32G -> switch direction Setup: ip addr add 192.168.1.100/24 dev EPS-100bt1-9 ethtool -S pfe1 | grep '^ p02_' > before tcpdump -i pfe1 -e -nn -c 20 > capture.txt & arping -c 10 -I EPS-100bt1-9 192.168.1.6 ethtool -S pfe1 | grep '^ p02_' > after # arping -c 10 -I EPS-100bt1-9 192.168.1.6 ARPING 192.168.1.6 from 192.168.1.100 EPS-100bt1-9 Sent 10 probes (10 broadcast(s)) Received 0 response(s) $ cat capture.txt tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on pfe1, link-type NULL (BSD loopback), snapshot length 262144 bytes 18:08:36.352535 AF Unknown (4294967295), length 64: 0x0000: ffff 0004 9fbe ef01 dadb 0c09 0806 0001 ................ 0x0010: 0800 0604 0001 0004 9fbe ef01 c0a8 0164 ...............d 0x0020: ffff ffff ffff c0a8 0106 0000 0000 0000 ................ 0x0030: 0000 0000 0000 0000 0000 0000 ............ [... 9 more identical ARP frames, all correctly DSA-tagged (dadb 0c09) and well-formed, plus one unrelated IPv6 background frame interleaved ...] # diff before after --- before +++ after @@ -1,4 +1,4 @@ - p02_: 1 + p02_: 0 p02_n_runt: 0 p02_n_soferr: 0 p02_n_alignerr: 0 # grep n_rxfrm before after before: p02_n_rxfrm: 0 after: p02_n_rxfrm: 0 Test 2 — switch -> S32G direction Setup Partner board is a separate SJA1105 switch based board. # ping -c 10 -I t1-6 192.168.1.100 (run on a separate SJA1105/1110-family switch board connected to our port 9 / 100BASE-T1 / EPS-100bt1-9) # diff before after (ethtool -S EPS-100bt1-9) - n_rxfrm: 0 + n_rxfrm: 9 <- port 9 physically received 9 frames from the wire # diff before after - p02_n_txfrm: 0 + p02_n_txfrm: 9 <- switch fabric forwarded all 9 toward the CPU port # tcpdump -i pfe1 -e -nn -c 20 (same window) listening on pfe1, link-type NULL (BSD loopback), snapshot length 262144 bytes [-- nothing captured --] Port 9 received 9 real frames; the fabric forwarded all 9 toward port 2 — but nothing arrived at pfe1. So the SJA1110's own fabric counters show all 9 frames successfully forwarded from port 9 to port 2's egress. But tcpdump -i pfe1 -e -nn on the S32G during this exact test shows NOTHING received. So the DSA/software layer on the S32G side believes it's sending (case 1). The switch's internal fabric believes it's sending toward the CPU port (case 2). Neither side has any confirmation that the other actually received anything across the physical RGMII bus. Every layer adjacent to this bus works individually; the bus itself has no confirmed successful crossing in either direction. What's been ruled out so far: - pfeng_mode / hwconfig (xpcs_mode) — confirmed correct; EMAC1 mode is RGMII (0x9), not SGMII (it was previously misconfigured as SGMII due to xpcs_mode=both on SerDes1 forcing PFE_MAC1's XPCS into SGMII; corrected to xpcs_mode=0 since PFE_MAC0 alone only needs XPCS0) - PFE_MAC1 TX/RX clock enablement — confirmed enabled at the correct rate (125MHz) in clk_summary - DSA tagging and CPU port binding — confirmed working (port netdevs exist, frames get tagged with the correct destination port in the DSA header) - SJA1110 internal fabric/forwarding — confirmed working between two other ports (9 and 2) using real external traffic - BASE-T1 link partner — confirmed passing real frames into the switch (port 9 n_rxfrm increments from genuine wire traffic) What hasn't been ruled out / open questions: - Whether 1000 Mbps RGMII with zero internal delay on both MAC and switch sides (rx/tx-internal-delay-ps=0, plain "rgmii" not "rgmii-id") is compatible without delay added by board trace length — have not yet tried forcing the link down to 100 Mbps as a timing-margin test 1. Is rx/tx-internal-delay-ps=0 on both ends at 1000 Mbps RGMII expected to work, or does this combination typically require delay compensation unless the PCB explicitly accounts for it? 2. Am I missing any other configuration? Happy to share full register dumps, if required. Appreciate any pointers before we probe the PE_02-13 bus with a logic analyzer (limited probe access due to board layout, so it is not so convenient currently. Thanks. Re: Custom S32G399A board: No frames cross switch-facing RGMII bus in either direction Hi @Joey_z @db16122 I am attaching the relevant sections of the schematics here. The connection flow is as follows: We use PE_02 to PE_13 on the S32G3 chip shown in s32g3_pfe_mac1_connections.png for the PFE_MAC1. They go to a board to board connector (shown in Board_to_board_connector.png) that routes these signals to  a different board that has the switch. The switch connections are shown in SJA1110_A.png and SJA1110_B.png. So the connection is PE_xx pins -> board connectors -> switch (SJA1110) Please let me know if you have any questions. I have also raised a support ticket ( #00990408) with the same details.  Re: Custom S32G399A board: No frames cross switch-facing RGMII bus in either direction Hi,pcentauri92 Thank you for your reply. Please provide me with the schematic diagrams related to your ETH, particularly the ones for PFE_MCA1 and SJA1110 sections. You can create an internal support system case. In the information description, @Joey, then provide your schematic diagram information. Refer to this website: https://support.nxp.com BR Joey Re: Custom S32G399A board: No frames cross switch-facing RGMII bus in either direction Hi @Joey_z , Thank you for the response. The module in question here is a custom design that uses the S32G399A chip along with the NXP SJA1110A ethernet switch. We based this design on the S32G-VNP-RDB3 development platform but we made quite a few changes from the base design. The PFE_MAC1 using RGMII is one of those changes.  I am also attaching the dts file override where we change the PFE_MAC1 mode and pinmux here. PFE_MAC1 mode configuration: /* pfe_mdio1 is already disabled in the base config in s32gxxxa-rdb.dtsi */ &pfe_mdio1 { /* occupied by GMAC0 */ status = "disabled"; }; /* * pfe_netif1 = PFE_MAC1 — management port to Switch-A port 2. * Overrides the base "sgmii" stub in s32gxxxa-rdb.dtsi. * Plain "rgmii" (no -id/-txid) since both MAC and switch add zero delay. * No phy-handle: the link partner is the SJA1110A switch, described as a * fixed-link on switch port@2. MDIO is not needed for link management here. */ &pfe_netif1 { phy-mode = "rgmii"; status = "okay"; fixed-link { speed = <1000>; full-duplex; }; }; PFE_MAC1 pinmux: /* * PFE_MAC1 RGMII pinmux — management port to Switch-A. * * All RX pad SSS values confirmed from S32G3 IOMUX spreadsheet. * TX path: output pads only, no IMCR needed. * RX path: input pads + IMCR registers to route pads into PFE_MAC1. * * Note: PE_07 (TXD3) uses FUNC3, not FUNC2. Similarly PE_08 (RX_CLK) output uses FUNC3; its IMCR (CR#859) uses FUNC2. */ pfe1rgmii_pins: pfe1rgmii_pins { /* TX outputs: PE_02=TX_CLK, PE_03=TX_EN, PE_04=TXD0, PE_05=TXD1, PE_06=TXD2 PE_07 (TXD3) */ pfe1rgmii_grp0 { pinmux = , /* PE_02: PFE_MAC1_TX_CLK */ , /* PE_03: PFE_MAC1_TX_EN */ , /* PE_04: PFE_MAC1_TXD0 */ , /* PE_05: PFE_MAC1_TXD1 */ , /* PE_06: PFE_MAC1_TXD2 */ ; /* PE_07: PFE_MAC1_TXD3 */ output-enable; slew-rate = ; }; /* RX inputs — pads set to FUNC0 (input mode); routing into PFE_MAC1 is handled by the IMCR entries in pfe1rgmii_grp2 below. NXP input mux pattern: pad=FUNC0 + IMCR=FUNC2 */ pfe1rgmii_grp1 { pinmux = , /* PE_08: input */ , /* PE_09: input */ , /* PE_10: input */ , /* PE_11: input */ , /* PE_12: input */ ; /* PE_13: input */ input-enable; slew-rate = ; }; /* IMCR input mux — selects which pad drives each PFE_MAC1 RX signal. CR#866 routes PE_02 (TX_CLK pad) back into PFE_MAC1_TX_CLK_I; required even for RGMII TX because the MAC samples its own TX_CLK internally. All entries at FUNC2 per S32G3 IOMUX spreadsheet. */ pfe1rgmii_grp2 { pinmux = , /* CR#866: PFE_MAC1_TX_CLK_I ← PE_02 */ , /* CR#859: PFE_MAC1_RX_CLK_I ← PE_08 */ , /* CR#865: PFE_MAC1_RXDV_I ← PE_09 */ , /* CR#861: PFE_MAC1_RXD_I[0] ← PE_10 */ , /* CR#862: PFE_MAC1_RXD_I[1] ← PE_11 */ , /* CR#863: PFE_MAC1_RXD_I[2] ← PE_12 */ ; /* CR#864: PFE_MAC1_RXD_I[3] ← PE_13 */ }; }; Please let me know if you need any other information.    Re: Custom S32G399A board: No frames cross switch-facing RGMII bus in either direction any schematics sharing from hardware side for RGMII bus between PFE_MAC1 and SJA1110 port 2 ? Re: Custom S32G399A board: No frames cross switch-facing RGMII bus in either direction Hi,pcentauri92 Thank you for your detail information According to my understanding, there seems to be a problem with the communication when using PFE_MAC1 RGMAII and Port 2 of SJA1110A on your development board. Is that correct? The default configuration of S32G-VNP-RDB3 is that PFE_MAC0/1 operates in SGMII mode and is connected to SJA1110. On your development board, why did you consider using RGMII mode? It is recommended to modify the corresponding software configuration. BR Joey
記事全体を表示
MCXA153:LPSPI 数据突发传输。 你好, 参考手册 MCXA153 包含了对 TDBRn 和 RDBRn LPSPI 寄存器的描述: “TDBRn 和 RDBRn 寄存器支持向发送 FIFO 发送数据进行突发传输,以便与 DMA 控制器一起使用”。 请问有人可以分享一下使用这些寄存器进行突发传输的示例代码吗? 此致 博格丹 通信与控制(I3C | I2C | SPI | FlexCAN | 以太网 | FlexIO) MCXA Re: MCXA153: LPSPI data burst transfer. 嗨@bogdan_u 抱歉,目前没有相关示例。 我找到的最接近的 MCXA153 示例使用 LPSPI_MasterTransferEDMALite() 和 eDMA,但驱动程序通过 LPSPI_GetTxRegisterAddress() / LPSPI_GetRxRegisterAddress() 来定位 TDR/RDR,而不是突发别名窗口。 但我认为你可以尝试使用。 typedef struct { uint32_t cmd; uint32_t data[128]; } lpspi_burst_tx_t; static inline uint32_t LPSPI_TCBR_Address(LPSPI_Type *base) { return ((uint32_t)base + LPSPI_TCBR_OFFSET); } static inline uint32_t LPSPI_TDBR0_Address(LPSPI_Type *base) { return ((uint32_t)base + LPSPI_TDBR0_OFFSET); } static inline uint32_t LPSPI_RDBR0_Address(LPSPI_Type *base) { return ((uint32_t)base + LPSPI_RDBR0_OFFSET); } void LPSPI_StartTxBurstDMA(LPSPI_Type *base, edma_handle_t *txDmaHandle, uint32_t *cmd_plus_data, uint32_t nwords) { edma_transfer_config_t cfg = {0}; cfg.srcAddr = (uint32_t)&cmd_plus_data[0]; cfg.destAddr = LPSPI_TCBR_Address(base); cfg.srcOffset = 4; cfg.destOffset = 4; cfg.srcTransferSize = kEDMA_TransferSize4Bytes; cfg.destTransferSize = kEDMA_TransferSize4Bytes; cfg.minorLoopBytes = 4; cfg.majorLoopCounts = nwords + 1u; EDMA_ResetChannel(txDmaHandle->base, txDmaHandle->channel); EDMA_SetTransferConfig(txDmaHandle->base, txDmaHandle->channel, &cfg, NULL); EDMA_StartTransfer(txDmaHandle); LPSPI_EnableDMA(base, kLPSPI_TxDmaEnable); } void LPSPI_StartRxBurstDMA(LPSPI_Type *base, edma_handle_t *rxDmaHandle, uint32_t *rx_words, uint32_t nwords) { edma_transfer_config_t cfg = {0}; cfg.srcAddr = LPSPI_RDBR0_Address(base); cfg.destAddr = (uint32_t)&rx_words[0]; cfg.srcOffset = 4; cfg.destOffset = 4; cfg.srcTransferSize = kEDMA_TransferSize4Bytes; cfg.destTransferSize = kEDMA_TransferSize4Bytes; cfg.minorLoopBytes = 4; cfg.majorLoopCounts = nwords; EDMA_ResetChannel(rxDmaHandle->base, rxDmaHandle->channel); EDMA_SetTransferConfig(rxDmaHandle->base, rxDmaHandle->channel, &cfg, NULL); EDMA_StartTransfer(rxDmaHandle); LPSPI_EnableDMA(base, kLPSPI_RxDmaEnable); } BR 哈里
記事全体を表示
[Zephyr ®系列] 第 4 部分:Kconfig 和设备树的概述及实际应用(日语博客)   从现在开始,我们将进入 Zephyr 的高级主题学习。 本次课程将概述 Kconfig 和设备树,然后进行实践编程练习,帮助您有效地使用它们。   如前所述,Zephyr RTOS 的一个关键特性是其软件可扩展性(可重用性),这使得在其他项目或衍生产品中重用一次开发的软件变得容易,从而实现快速开发。   此外,为了支持各种硬件平台,Zephyr 采用了名为“Kconfig”和“Devicetree”的强大配置系统。   这样,您只需更改配置文件,即可将程序移植到不同的微控制器板,而无需使用相同的 C/C++ 语言重写源代码。 本文解释了Kconfig和设备树的基本机制。作为实际应用,我们将修改第三部分中创建的与硬件无关的LED闪烁程序,使其能够在两种不同的微控制器板“ FRDM-MCXA153 ”和“ FRDM-MCXN947 ”上运行。   为了在不同的电路板(微控制器和处理器)上运行同一个应用程序,我们将解释使用 Kconfig 和设备树的实用编程方法。     目录   准备 Kconfig基础知识 设备树基础知识 提高软件重用性的最佳实践 Kconfig 和设备树的实际应用 创建一个简单的程序(动手实践) 1. 程序规范 2. 目录结构 3. 创建 Kconfig 和 prj.conf 文件 4. 创建设备树覆盖层和板级特定设置 5. 与硬件无关的通用代码(main.c)创造 6. 构建并运行 总结 准备   硬件准备   本文将主要使用以下开发板来创建和测试程序。 FRDM-MCXA153 (主要用途) 此外,以下电路板将作为辅助工具,用于验证您所创建的程序的可移植性。 FRDM-MCXN947   SW 准备   本指南假设您已搭建好 Zephyr 开发环境(Zephyr SDK、West 命令等)。如果您尚未搭建,请参阅第二篇关于环境搭建的文章。 【Zephyr ®系列】第二部分:首次构建与测试(日语博客)   我们将使用在 Zephyr 系列第三篇文章中创建的 LED 闪烁程序。如果您尚未创建该程序,我们建议您参考上一篇文章进行创建。 【Zephyr ®系列】第三部分:LED 闪烁和软件复用的第一步(日语博客)   Kconfig基础知识     Kconfig 是 Linux 内核中使用的一种配置系统。在 Zephyr 中,它用于管理是否“启用或禁用”软件功能,或者“设置哪些参数”,例如内核函数、设备驱动程序、子系统和应用程序特定的设置。 以下两个文件对 Kconfig 很重要: “Kconfig”文件定义了可选的配置项(符号)、它们的默认值和依赖关系。 "prj.conf" 文件*:应用程序开发人员在此文件中指定他们想要为 "Kconfig" 中定义的项目设置的值(例如,使用 "y" 启用它们或提供特定的数值)。 使用 Kconfig,您可以排除编译中不必要的代码并优化内存使用。 此外,Kconfig 和 prj.conf 文件都是以文本格式编写的。 如何启用此功能 prj.conf 文件启用整个项目的功能。 例如,ADC、DAC 和 OPAMP 驱动程序在 Kconfig 中定义。使用 Kconfig 中定义的函数时,需要在 prj.conf 文件开头添加“CONFIG_”来声明它们。 Kconfig:ADCの定義Kconfig:ADC定义 prj.conf例prj.conf 示例   设备树基础知识   Devicetree例设备树示例   设备树是一个文本文件,它描述了微控制器支持的硬件(CPU、内存、外设、引脚设置等),以及这些硬件的设置和配置。 然后将这些设置和配置展开成宏。   Zephyr 宏可以读取设备树中描述的信息,而不是直接将硬件地址写入 C 代码(硬编码),从而实现与硬件无关的编程。 节点和属性:硬件的每个元素在层次结构中都表示为一个“节点”,寄存器地址、中断号等则被描述为“属性”。 ".dts" 和 ".dtsi":每个微控制器和电路板的标准硬件配置都在 Zephyr 存储库中的 ".dts"(设备树源)和 ".dtsi"(包含)文件中预定义。 dts:被描述为电路板的设备树。 dtsi:描述 SoC/微控制器的设备树,由设备制造商提供。 ".overlay" 文件:当您想要覆盖特定应用程序的接线(例如,将 LED 连接到特定的 GPIO 引脚)或默认设置时,将创建此文件。   提高软件重用性的最佳实践   为了提高 Zephyr 软件的可重用性,遵循以下设计原则非常重要: 硬件相关部分与硬件无关部分的分离: C 代码(`main.c`)例如,避免直接描述具体的微控制器寄存器操作或引脚编号。 利用设备树别名:应用程序不应直接引用实际的硬件节点(例如 `&red_led` 或 `&gpioa`),而应引用在 `aliases` 节点中定义的抽象名称(例如 `led0`)。这样,只需更改别名指向的内容,即可轻松适配不同的开发板。 准备特定于电路板的设备树(覆盖) :当某些功能存在差异时,例如在衍生产品中,您可以仅对每个电路板上硬件不同的部分进行覆盖(覆盖)。 使用 Kconfig 切换功能:应用程序行为参数和特定功能的开/关状态使用 Kconfig 符号而不是 C 语言“#define”进行控制。   Kconfig 和设备树的实际应用   接下来,我们将通过创建一个简单的程序来学习如何使用 Kconfig 和设备树,以便我们能够在实践中实际使用它们。     创建一个简单的程序(动手实践) 该程序将通过修改我们上次创建的 LED 闪烁程序来创建,并将具有以下规格。   在这里,作为一项实践练习,我们将创建一个可以在“FRDM-MCXA153”和“FRDM-MCXN947”上运行的通用应用程序。 1. 程序规范 源代码:使用“第 3 部分:你的第一个 LED 闪烁程序”中的代码,并进行以下修改。 LED闪烁速度:可以使用Kconfig设置闪烁间隔。 按钮功能(启用/禁用):可通过 Kconfig 设置启用或禁用按钮功能。启用后,按下按钮可在 LED 闪烁和常亮之间切换。 输出板卡名称:启动时,Kconfig 中配置的“设备(板卡)名称”将输出到标准输出(终端)。 2. 目录结构   项目目录结构应如下所示:   将 Kconfig 文件和 boards 文件夹添加到上次创建的 LED 闪烁程序的“my_hello”文件夹中。添加文件的方法不限。 在 Windows 系统中,使用 PowerShell `ni` 命令或文本编辑器创建一个新文件,并将其保存在 `my_hello` 文件夹中。 在 Linux 系统中,可以使用 `touch` 命令创建一个新的空文件。   “boards/”目录下的文件用于处理硬件差异以及每个主板特有的独特设置。     my_hello/ ├── CMakeLists.txt ├── Kconfig <- 新規追加:アプリ独自のKconfig ├── prj.conf <- アプリの共通設定 ├── src/ │ └── main.c <- ハードウェア非依存の共通コード └── boards/ <- 新規作成フォルダ  ├── frdm_mcxa153.overlay <- 新規作成:FRDM-MCXA153用のデバイスツリー設定  ├── frdm_mcxa153.conf <- 新規作成:FRDM-MCXA153用のKconfig設定  ├── frdm_mcxn947_cpu0.overlay <- 新規作成:FRDM-MCXN947用のデバイスツリー設定  └── frdm_mcxn947_cpu0.conf <- 新規作成:FRDM-MCXN947用のKconfig設定   注意:通过在应用程序目录中创建特定文件,Zephyr 的构建系统(West)将自动识别它们并应用设置。 添加 Kconfig:您可以通过在应用程序文件夹中放置“Kconfig”文件来添加自己的配置符号。 板级特定设置(“boards/”目录):通过在应用程序中创建“boards”目录并将“[板级名称].overlay”或“[板级名称].conf”文件放置于其中,overlay和Kconfig覆盖将仅在以该板级为目标进行构建时自动应用。   3. 创建 Kconfig 和 prj.conf 文件 首先,在应用程序根目录中创建您自己的“Kconfig”文件,并定义特定于应用程序的参数。 my_hello/Kconfig   mainmenu "my LED blink" config CUSTOM_BLINK_RATE_MS int "LED blink rate in milliseconds" default 1000 help Set LED blink frequency. #LEDの点滅周期(ミリ秒)を設定します config ENABLE_BUTTON_TOGGLE bool "Enable button to toggle LED state" default y help Enable button to toggle LED state. # ボタン入力によるLEDの点滅/点灯状態>の切り替え機能を有効にします。 config BOARD_NAME_STRING string "Board Name String" default "Unknown Board" help Set board name for printf. # 標準出力に表示するボード名を設定します。 source "Kconfig.zephyr"     其次,作为整个应用程序的通用设置,还有“prj.conf”。这件事将会被写下来。 在 prj.conf 文件中,使用您刚刚创建的 Kconfig 符号按如下方式进行配置: my_hello/prj.conf   # GPIOの有効化 CONFIG_GPIO=y # アプリケーションの共通設定 CONFIG_CUSTOM_BLINK_RATE_MS=500 CONFIG_ENABLE_BUTTON_TOGGLE=y   4. 创建设备树覆盖层和板级特定设置 创建一个名为“boards”的目录,并为每个电路板准备必要的文件。 FRDM-MCXA153主板     我们将电路板上的按钮(`sw2`)映射出来,以便应用程序可以使用标准别名`sw0`访问它。`led0`已经在电路板定义中,因此这里可以省略,但如果需要,也可以显式地覆盖它。   my_hello/boards/frdm_mcxa153.overlay / { aliases { sw0 = &user_button_2; /* FRDM-MCXA153のユーザーボタン */ }; };   my_hello/boards/frdm_mcxa153.conf   CONFIG_BOARD_NAME_STRING="FRDM-MCXA153 Board"   通过在应用程序 (main.c) 中引用此 .conf(特定于板的 Kconfig)中的符号,可以使用 printf 函数将板名称输出到标准输出。 适用于 FRDM-MCXN947 同样,我们在 FRDM-MCXN947 中定义了“sw0”。这可以处理按钮硬件名称的任何差异。   事实上,如果硬件名称(因外围设备或实例而异)在不同电路板之间有所不同,则需要将实际硬件分配给设备树中的别名节点。 my_hello/boards/frdm_mcxn947_cpu0.overlay   / { aliases { sw0 = &user_button_3; /* FRDM-MCXN947のユーザーボタン */ }; };   my_hello/ boards/frdm_mcxn947_cpu0.conf   我将尝试仅在使用 MCXN947 构建时将 LED 闪烁速度设置为 250ms。   CONFIG_BOARD_NAME_STRING="FRDM-MCXN947 Board" CONFIG_CUSTOM_BLINK_RATE_MS=250 FRDM-MCXA153 和 FRDM-MCXN947 的应用程序代码相同,但您可以在此处单独配置 LED 的闪烁行为。 5. 与硬件无关的通用代码(main.c)创造 在“my_hello/src/main.c”中写入以下内容:   LED 控制部分重用了上一篇文章中创建的硬件无关代码(使用“led0”别名),并将 Kconfig 和按钮控制集成到其中。 my_hello/ src/main.c   #include #include #include /* Devicetreeのエイリアスを参照する */ /* どのボードでも、一番目のLEDは通常 "led0" と定義されています */ #define LED0_NODE DT_ALIAS(led0) #define SW0_NODE DT_ALIAS(sw0) /* エイリアスからGPIO仕様(ポート、ピン、フラグ)を取得 */ static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios); /* ボタン機能がKconfigで有効化されている場合のみコンパイルされる部分 */ #ifdef CONFIG_ENABLE_BUTTON_TOGGLE static const struct gpio_dt_spec sw = GPIO_DT_SPEC_GET(SW0_NODE, gpios); static struct gpio_callback button_cb_data; static bool is_blinking = true; void button_pressed(const struct device *dev, struct gpio_callback *cb, uint32_t pins) { is_blinking = !is_blinking; if (!is_blinking) { /* 点滅オフ時はLEDを点灯させた状態にする */ gpio_pin_set_dt(&led, 1); } } #endif //CONFIG_ENABLE_BUTTON_TOGGLE int main(void) { int ret; /* Kconfigで設定されたボード名を出力 */ printf("Starting application on %s\n", CONFIG_BOARD_NAME_STRING); /* デバイスの準備確認 */ if (!gpio_is_ready_dt(&led)) { return -1; } /* ピンの設定 (Devicetreeで定義された初期状態などを考慮して設定) */ ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE); if (ret < 0) { return -1; } #ifdef CONFIG_ENABLE_BUTTON_TOGGLE if (!gpio_is_ready_dt(&sw)) { return -1; } ret = gpio_pin_configure_dt(&sw, GPIO_INPUT); if (ret < 0) { return -1; } ret = gpio_pin_interrupt_configure_dt(&sw, GPIO_INT_EDGE_TO_ACTIVE); if (ret < 0) { return -1; } gpio_init_callback(&button_cb_data, button_pressed, BIT(sw.pin)); gpio_add_callback(sw.port, &button_cb_data); #endif //CONFIG_ENABLE_BUTTON_TOGGLE while (1) { #ifdef CONFIG_ENABLE_BUTTON_TOGGLE if (is_blinking) { ret = gpio_pin_toggle_dt(&led); } #else /* ピンの状態を反転 (ボタン機能が無効な場合は常に点滅) */ ret = gpio_pin_toggle_dt(&led); #endif //CONFIG_ENABLE_BUTTON_TOGGLE /* Kconfigで設定された点滅間隔で待機 */ k_msleep(CONFIG_CUSTOM_BLINK_RATE_MS); } return 0; }     6. 构建并运行 现在,让我们实际测试一下它的功能。请参考上一篇文章,了解如何设置构建环境和启用 west 命令。 首先,按照下面的命令说明导航到已安装的 zephyrproject 存储库目录,并在继续操作之前启用 west。 已确认 FRDM-MCXA153(主)运行正常 使用以下命令构建并将其写入 FRDM-MCXA153。   ## ホームディレクトリからZephyrprojectディレクトリに移動 cd ~/zephyrproject ## west環境を有効化 source .venv/bin/activate ## zephyr v4.3をチェックアウトしていない場合は、前回(第3回 初めてのLチカとソフトウェアの再利用性)を参考にv4.3をチェックアウトしてください。 west build -b frdm_mcxa153 my_hello west flash     执行结果   コンソール出力控制台输出   LED点滅、点灯モード切り替えLED闪烁和常亮模式切换   终端上将显示“正在FRDM-MCXA153板上启动应用程序”的消息。 LED 灯以500 毫秒的间隔闪烁(“prj.conf”)。(设置)。 按下 SW2(“自定义开关”)即可将其打开,再按下即可使其恢复闪烁状态。 已确认FRDM-MCXN947运行正常 我们将使用完全相同的 C 源代码来构建该项目,只更改电路板规格。   # -pオプションを使用し、frdm_mcxa153のビルド情報をクリーンしてビルドします。 west build -p -b frdm_mcxn947//cpu0 my_hello west flash   执行结果   “boards/frdm_mcxn947_cpu0.conf”的内容将自动应用,终端将显示“在FRDM-MCXN947板上启动应用程序”。 LED 灯以250 毫秒的间隔快速闪烁(在“prj.conf”中配置)。 按下 SW3(MCXN947 上映射到“user_button_3”的按钮)同样可以在 LED 点亮和闪烁之间切换。 虽然 FRDM-MCXA153 和 FRDM-MCXN947 使用不同的 GPIO 来控制 LED 和开关按钮,但设备树有效地吸收了这些差异,这表明应用程序和硬件是如何清晰分离的。   总结     在本节课中,我们学习了 Zephyr 中 Kconfig 和设备树的基础知识,并练习了如何利用它们将硬件相关的部分与 C 代码分离。   我相信您已经体验到了一种强大的机制,可以在多个不同的电路板上重用相同的源代码,其中硬件设置被设备树覆盖(“overlay”)吸收,应用程序参数可以灵活地更改,并且可以使用特定于电路板的 Kconfig 文件(“conf”)轻松启用或禁用功能。   ========================== 我们目前无法回复此帖子“评论”部分留下的评论。 由此给您带来的不便,我们深表歉意。如有任何疑问,请参考“NXP 技术问题 - 如何联系我们(日语博客)”。 (如果您已经是恩智浦的分销商或与恩智浦有合作关系,您可以直接咨询您的代表。) 本文档概述了设备树和 Kconfig,这两项功能旨在增强 Zephyr 的软件重用性。随后,本文档详细介绍了在实践中使用这些功能所需的步骤。 读完 Zephyr 系列的第一册到第四册后,你将能够使用 Zephyr 实时操作系统编写程序。 通用微控制器 MCX 日本博客
記事全体を表示
How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 NXPサポートチームの皆様、こんにちは。  現在、S32K314、RTD 7.0.0、およびFreeRTOSを使用したプロジェクトに取り組んでいます。MCALのADCモジュールを使用して、MCUに接続された外部デバイスの電圧、MCUの内部温度(TEMPSENSE)、MCUの内部電圧(ANAMUX)、およびバンドギャップ電圧の測定を実装しようとしています。測定結果を見ると、外部デバイスの電圧とバンドギャップ電圧は正しく測定されているようですが、MCUの内部温度と内部電圧の値は予想と異なっています。 期待値: MCU内部電圧(VDD_HV_A): 8192(2.5V、14ビット分解能) 実測値: 約6800~7100(2.07~2.13V、14ビット分解能) MCUの電源電圧は5.0Vです。ADCハードウェアユニットはADC0に設定され、ADC測定対象は以下のように構成されます。  Ch8:MCU内部温度(TEMPSENSE)  Ch9:MCU内部電圧(ANAMUX)  第10章:バンドギャップ  MCU入力電圧 = 5.0V ADC初期化コード: void AdcAdapter_Init ( void ) { Adc_Calibrate ( ADC0 , & calStatus ) ; Adc_SetupResultBuffer ( ADC0 , Group0Result ) ; IP_DCM_GPR -> DCMRWF1 = ( IP_DCM_GPR -> DCMRWF1 | DCM_GPR_DCMRWF1_SUPPLY_MON_EN ( 1 ) | DCM_GPR_DCMRWF1_VDD_HV_A_VLT_DVDR_EN ( 1 ) | DCM_GPR_DCMRWF1_VDD_HV_B_VLT_DVDR_EN ( 1 ) | DCM_GPR_DCMRWF1_VDD_1_5_VLT_DVDR_EN ( 1 ) ) ; IP_DCM_GPR -> DCMRWF1 = ( IP_DCM_GPR -> DCMRWF1 & ~ DCM_GPR_DCMRWF1_SUPPLY_MON_SEL_MASK ) | DCM_GPR_DCMRWF1_SUPPLY_MON_SEL ( 0U ) ; // VDD_HV_A_DIV Adc_StartGroupConversion ( ADC0 ) ; // AdcConversionStart } ADCデータ取得(すべての周期的なタスク) void AdcAdapter_RunCyclic ( void ) { Adc_StatusType ret = ADC_IDLE ; Std_ReturnType adcStatus ; uint16 temperature ; // 変換完了チェック ret = Adc_GetGroupStatus ( ADC0 ) ; if ( ( ret == ADC_COMPLETED ) || ( ret == ADC_STREAM_COMPLETED ) ) { // 結果を取得 Adc_ReadGroup ( ADC0 , Group0Result ) ; // 次の変換を開始 Adc_StartGroupConversion ( ADC0 ) ; } else { // エラーログ } /* Adc_TempSenseGetTemp Singed Q11.4 */ adcStatus = Adc_TempSenseGetTemp ( ADC0 , mcuTemperature ) ; if ( E_OK == adcStatus ) { temperature = Adc_TempSenseCalculateTemp ( ADC0 , mcuTemperature ) ; } else { // エラーログ } }  ADC0グループのADC値は`Adc_ReadGroup`を使用して更新できると思いますが、MCUの内部温度については`Adc_TempSenseGetTemp`と`Adc_TempSenseCalculateTemp`を使用する必要があると思います。もし私が見落としている設定があれば教えてください。 Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは、センレントさん。 迅速なご対応ありがとうございます。 ご提供いただいたサンプルコードは既に確認済みで、私のコードに組み込んだと考えています。 ご提供いただいた表は、ADCブロックに供給される各クロックに対するレジスタ設定の表であると解釈しました。しかし、それらがMCALのどのADC設定に対応しているのかを特定することはできませんでした。 ソースコードを提供できないため、ADC設定の画像を添付します。どの設定を変更すればよいか教えてください。 他に何か必要な設定画面があれば、お知らせください。 AdcHwUnit> Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは@輝彦 提供された情報にはADCの完全な構成が見当たらなかったので、ADCクロックがデータシートの要件に合っているか再確認してください。 可能であれば、テストプロジェクトを共有していただければ、私が確認します。 ちなみに、下記のリンクからデモをご覧ください。 https://community.nxp.com/t5/S32K-Knowledge-Base/Example-S32K344-TempSenser-S32DS36-RTD600-500-400-p24/ta-p/2136187 Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは、センレントさん。 アドバイスありがとうございます。 ご助言に従い、TEMPSENSEのサンプリング時間を1.2マイクロ秒に設定するように、以下のように設定を変更しました。 160MHz = 0.00625マイクロ秒 1.2マイクロ秒/0.00625マイクロ秒= 192 FreeRTOSで1秒サイクルのタスクを作成し、MCU電圧(VDD_HV_A)とMCU温度(TEMPSENSE)のADC値を毎秒取得しました(30秒分のデータ収集)。 MCU電圧についてはバンドギャップ電圧を使い、以下の補償式でmVに変換しました。 (バンドギャップ電圧はほとんど変動せず、約3975(約1.2V)の値が得られた。) Adc補正 = (1200(mV) * Adc_VCC_HV_A) / Adc_バンドギャップ Mcu電圧 = アドコレーション × 2(2は電圧分割比VDD_HV_A) さらに、 McuTempデータは `Adc_TempSenseGetTemp(ADC0, &mcuTemperature)` から取得されます。 ADC変換誤差が±5.0%であることを考慮しても、このばらつきは大きすぎると思います。何か解決策の提案はありますか?   Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは@輝彦 ご提供いただいた設定画面のスクリーンショットとコードを見る限り、明らかなエラーは見当たりません。ただし、温度センサのサンプリング時間は1.2μsを超えなければならないことに注意が必要です。そうでなければ、サンプリングの精度に影響します。したがって、テストを行う前にサンプリング時間を再度確認することをお勧めします。 Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 ADC_Config>AdcHwUnitの画像が圧縮されて解像度が低下したため、再アップロードします。 <#1> <#2> <#3> Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは@輝彦 温度チャネルから生データを直接読み取って、変動があるかどうかを観察できます。変動が大きい場合は、サンプリング時間を延ばし続けるCAN。 Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは、センレントさん。 ご返信ありがとうございます。 下図に示すように、サンプリング期間1/期間2の値を増加させた後、値は安定しました。デフォルト設定はサンプリング持続時間0だと思っていましたが、サンプリング持続時間0、1、2の切り替えはどうすればいいのでしょうか? (プリスケール設定に基づくと、ADCクロックは80MHzなので、1.2μsに相当する期間は96となる。) Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは、センレントさん。 ドキュメントを添付してくださりありがとうございます。現在チャネル32から63を測定しているので、これはサンプリング持続時間1に対応していると理解しています。 迅速なご対応ありがとうございます。問題は解決しました。 Re: How to Measure the Internal Temperature and Voltage of an MCU Using the ADC0 こんにちは、センレントさん。 私は表317の情報を以下のように解釈しました。 fmc = 160 MHz の場合: ・キャリブレーション用のプリスケーラを4に設定する ・通常のADC変換のプリスケーラを2に設定する ・「ADC高速」を無効に設定する これらの設定を適用して得られたデータは、以下の表に示されています。 平均化することでばらつきは減りましたが、MCU内部温度の変動は依然としてかなり大きいと感じます。 以下の表は、ADC値から°Cに変換したMCU温度データを示しています。 (ADC値を摂氏に変換するために、ADC値を16で割りました。) 16点平均で2.55度の変動は極めて大きい。MCUの温度はプロセッシング負荷によって変動することは理解していますが、これほど瞬時に大きく変わるのは普通のことですか? MCUの内部温度を測定する際に、平均を取るのが正しいアプローチでしょうか?
記事全体を表示
RT1176 PWMの起動に失敗しました 私はPWM + Fault + QTimerを使ってモーターパルス制御を実装していますが、PWM3サブモジュール0のPWM_Aチャネルが時々起動できず、最初のハイレベル以降は一定のままで、その後のパルスは現れません。検査の結果、PWMの「ラン」部分が正しく設定されていないことが判明しました。後からプログラムに起動時の処理を繰り返し追加したにもかかわらず、この異常は依然として発生した。 Re: RT1176 PWM startup failed こんにちは、 @liu626 さん。 カスタムボードを使用していますか、それともEVKを使用していますか?EVKを使用している場合、何か改造を加えましたか? PWM3で使っている構成を教えてもらえますか? 何か例を参考にしていますか?もしそうなら、どの学校ですか? PWM3のみを含むプロジェクトを使用して問題を再現しようとした場合、問題は解消されますか? これはPWM3サブモジュール0のPWM_Aチャネルだけに起こるのでしょうか?他のPWMモジュールやサブモジュールでも同様の現象が発生しましたか? PWM3レジスタを操作し、ランビットに影響を与えたり上書きしたりする他のタスクや割り込みはありますか? よろしくお願いします、 パブロ Re: RT1176 PWM startup failed こんにちは、カスタム回路基板を使用しました。私は具体的な例を挙げませんでした。これは、プロジェクトの正式な開発過程で発見された問題だった。パルス制御用に6つのPWMチャネルを設定しました。このチャネルだけが問題を起こし、他のサブモジュールでは同様の問題はありませんでした。調べたところ、このチャネルだけがPWM3モジュールを使っていることがわかりました。他に干渉因子は検出されなかった。以下は私の設定です。 static axis_ctrl_t g_axes[AXIS_NUM] = ヤージュ ヤージュ .id= AXIS_X1、.name= "X1", .pwmBase= PWM1、.pwmModule= kPWM_Module_0、.pwmChannel= kPWM_PwmA、 .tmrBase= TMR3、.lowCh= kQTMR_Channel_2、.highCh= kQTMR_Channel_3、 .tmrInputsrc=kQTMR_ClockCounter2InputPin、.cascadePcs= 6U、 .faultNum= 0U、.hwExactSupported= true、.outTrigMask= kPWM_ValueRegisterMask_3、 }、 ヤージュ .id= AXIS_X2、.name= "X2", .pwmBase= PWM2、.pwmModule= kPWM_Module_0、.pwmChannel= kPWM_PwmA、 .tmrBase= TMR2、.lowCh= kQTMR_Channel_0、.highCh= kQTMR_Channel_1、 .tmrInputsrc=kQTMR_ClockCounter0InputPin、.cascadePcs= 4U、 .faultNum= 0U、.hwExactSupported= true、.outTrigMask= kPWM_ValueRegisterMask_3、 }、 ヤージュ .id= AXIS_Y、.name= "Y"、 .pwmBase= PWM3、.pwmModule= kPWM_Module_0、.pwmChannel= kPWM_PwmA、 .tmrBase= TMR3、.lowCh= kQTMR_Channel_0、.highCh= kQTMR_Channel_1、 .tmrInputsrc=kQTMR_ClockCounter0InputPin、.cascadePcs= 4U、 .faultNum= 0U、.hwExactSupported= true、.outTrigMask= kPWM_ValueRegisterMask_3、 }、 ヤージュ .id= AXIS_Z、.name= "Z"、 .pwmBase= PWM4、.pwmModule= kPWM_Module_0、.pwmChannel= kPWM_PwmA、 .tmrBase= TMR1、.lowCh= kQTMR_Channel_0、.highCh= kQTMR_Channel_1、 .tmrInputsrc=kQTMR_ClockCounter0InputPin、.cascadePcs= 4U、 .faultNum= 0U、.hwExactSupported= true、.outTrigMask= kPWM_ValueRegisterMask_3、 }、 ヤージュ .id= AXIS_EX1、.name= "EX1", .pwmBase= PWM1、.pwmModule= kPWM_Module_1、.pwmChannel= kPWM_PwmA、 .tmrBase= TMR1、.lowCh= kQTMR_Channel_2、.highCh= kQTMR_Channel_3、 .tmrInputsrc=kQTMR_ClockCounter2InputPin、.cascadePcs= 6U、 .faultNum= 1U、.hwExactSupported= true、.outTrigMask= kPWM_ValueRegisterMask_3、 }、 ヤージュ .id= AXIS_EX2、.name= "EX2", .pwmBase= PWM2、.pwmModule= kPWM_Module_1、.pwmChannel= kPWM_PwmA、 .tmrBase= TMR2、.lowCh= kQTMR_Channel_2、.highCh= kQTMR_Channel_3、 .tmrInputsrc=kQTMR_ClockCounter2InputPin、.cascadePcs= 6U、 .faultNum= 1U、.hwExactSupported= true、.outTrigMask= kPWM_ValueRegisterMask_3、 }、 };static void APP_Init_PWM_QTMR(void) ヤージュ pwm_config_t pwmConfig; pwm_fault_param_t faultConfig; qtmr_config_t qtmrConfig; PWM_GetDefaultConfig(&pwmConfig); pwmConfig.pairOperation= kPWM_Independent; pwmConfig.reloadLogic = kPWM_ReloadImmediate; PWM_FaultDefaultConfig(&faultConfig); faultConfig.faultLevel = true; faultConfig.enableCombinationalPath= 偽; faultConfig.faultClearingMode= kPWM_ManualSafety; faultConfig.recoverMode = kPWM_NoRecovery; QTMR_GetDefaultConfig(&qtmrConfig); CLOCK_EnableClock(kCLOCK_Qtimer1); CLOCK_EnableClock(kCLOCK_Qtimer2); CLOCK_EnableClock(kCLOCK_Qtimer3); PWM_StopTimer(PWM1, 0x0FU); PWM_StopTimer(PWM2, 0x0FU); PWM_StopTimer(PWM3, 0x0FU); PWM_StopTimer(PWM4, 0x0FU); pwm_fault_input_filter_param_t faultFilter; faultFilter.faultFilterPeriod= 255U; faultFilter.aultFilterCount= 7U; faultFilter.faultGlitchStretch= 偽; /* 记录每个 PWM 实例上已配置的 faultチャネル,避免重复设置 */ uint16_t pwm1FaultDone = 0U, pwm2FaultDone = 0U, pwm3FaultDone = 0U, pwm4FaultDone = 0U; for (uint8_t i = 0U; i < AXIS_NUM; i++) { axis_ctrl_t *ax = &g_axes[i]; PWM_Init(ax->pwmBase, ax->pwmModule, &pwmConfig); PWM_SetupFaults(ax->pwmBase, (pwm_fault_input_t)ax->faultNum, &faultConfig); /* 故障濾波(每個 PWM 实例的每个 faultチャネル 只设一次) */ { uint16_t *faultDone; if (ax->pwmBase == PWM1) faultDone = &pwm1FaultDone; else if (ax->pwmBase == PWM2) faultDone = &pwm2FaultDone; else if (ax->pwmBase == PWM3) faultDone = &pwm3FaultDone; else faultDone = &pwm4FaultDone; uint16_t faultBit = (uint16_t)(1U << ax->faultNum); if((*faultDone & faultBit) == 0U) { PWM_SetupFaultInputFilterExt(ax->pwmBase, (pwm_fault_channels_t)ax->faultNum, &faultFilter); *faultDone |= faultBit; } } /* 故障時輸出低電平 */ ax->pwmBase->SM[ax->pwmModule].OCTRL &= ~(PWM_OCTRL_PWMAFS_MASK |PWM_OCTRL_PWMBFS_MASK); APP_PWM_Unmap_Selected_Fault(ax); APP_PWM_ClearFault_Safe(ax); ax->pwmBase->SM[ax->pwmModule].INIT = 0U; ax->pwmBase->SM[ax->pwmModule].VAL0 = 0U; ax->pwmBase->SM[ax->pwmModule].VAL1 = 1U; ax->pwmBase->SM[ax->pwmModule].VAL2 = 0U; ax->pwmBase->SM[ax->pwmModule].VAL3 = 0U; ax->pwmBase->SM[ax->pwmModule].VAL4 = 0U; ax->pwmBase->SM[ax->pwmModule].VAL5 = 0U; ax->pwmBase->SM[ax->pwmModule].TCTRL = PWM_TCTRL_OUT_TRIG_EN(ax->outTrigMask); APP_PWM_Disable_Output(ax); if (ax->hwExactSupported) { qtmrConfig.primarySource= ax->tmrInputSrc; QTMR_Init(ax->tmrBase, ax->lowCh, &qtmrConfig); QTMR_Init(ax->tmrBase, ax->highCh, &qtmrConfig); ax->tmrBase->CHANNEL[ax->lowCh]。CTRL = TMR_CTRL_CM(kQTMR_PriSrcRiseEdge) |TMR_CTRL_PCS(ax->tmrInputSrc); ax->tmrBase->CHANNEL[ax->highCh]。CTRL = TMR_CTRL_CM(kQTMR_CascadeCount) |TMR_CTRL_PCS(ax->カスケードPcs); APP_QTMR_Disable_Low_OFLAG_Output(ax); QTMR_DisableInterrupts(ax->tmrBase, ax->lowCh, 0xFFU); QTMR_DisableInterrupts(ax->tmrBase, ax->highCh, 0xFFU); QTMR_ClearStatusFlags(ax->tmrBase, ax->lowCh, 0xFFU); QTMR_ClearStatusFlags(ax->tmrBase, ax->highCh, 0xFFU); } ax->位相 = kAxisIdle; ax->armed = false; ax->running=false; ax->done = 真; #if HARD_PWM_STATE_GUARD_ENABLE APP_StateGuard_Reset(斧); #endif } /* 使能 QTMR 中断 */ NVIC_SetPriority(TMR1_IRQn、2U); NVIC_SetPriority(TMR2_IRQn、2U); NVIC_SetPriority(TMR3_IRQn、2U); EnableIRQ(TMR1_IRQn); EnableIRQ(TMR2_IRQn); EnableIRQ(TMR3_IRQn); }静的ブールAPP_PWM_Config_Pulse(axis_ctrl_t *軸、 uint32_t highCnt400M、 uint32_t 低Cnt400M) { pwm_clock_prescale_tプリスケール; uint16_t期間ダックス; uint32_t totalCnt400M = highCnt400M + lowCnt400M; もし((軸 == NULL) ||(totalCnt400M == 0U))Return false; もし(!APP_PWM_SelectPrescaler_FromPeriodCnt400M(totalCnt400M、およびprescale、&periodTicks)) Return false; uint32_t highTicks32 = (uint32_t)((((uint64_t)periodTicks * (uint64_t)highCnt400M + ((uint64_t)totalCnt400M / 2ULL))/ (uint64_t)totalCnt400M); もし(highTicks32 == 0U) highTicks32 = 1U; もし(highTicks32 >= periodTicks) highTicks32 = (uint32_t)periodTicks - 1U; uint32_t riseTicks32 = 0U; uint32_t fallTicks32 = highTicks32; #if HARD_PWM_LOW_START_PHASE_ENABLE uint32_t lowTicks32 = (uint32_t)periodTicks - highTicks32; もし (lowTicks32 >= (2U * HARD_PWM_LOW_START_PHASE_MIN_TICKS)) { uint32_t LeadCnt400M = highCnt400M; uint32_t minLeadCnt400M = (uint32_t)HARD_PWM_LOW_START_PHASE_MIN_US * 400U; もし(desiredLeadCnt400M < minLeadCnt400M) desiredLeadCnt400M = minLeadCnt400M; uint32_t desiredLeadTicks32 = (uint32_t)(((uint64_t)periodTicks * (uint64_t)desiredLeadCnt400M + ((uint64_t)totalCnt400M / 2ULL))/ (uint64_t)totalCnt400M); if (desiredLeadTicks32 < HARD_PWM_LOW_START_PHASE_MIN_TICKS) desiredLeadTicks32 = HARD_PWM_LOW_START_PHASE_MIN_TICKS; uint32_t maxRiseByHalfTicks32 = lowTicks32 / 2U; uint32_t postGuardTicks32 = (uint32_t)(((uint64_t)periodTicks * (uint64_t)(HARD_PWM_VAL3_POST_LOW_GUARD_US * 400U) + ((uint64_t)totalCnt400M / 2ULL))/ (uint64_t)totalCnt400M); if(postGuardTicks32 < HARD_PWM_VAL3_POST_LOW_GUARD_MIN_TICKS) postGuardTicks32 = HARD_PWM_VAL3_POST_LOW_GUARD_MIN_TICKS; uint32_t maxRiseByPostGuardTicks32 = (lowTicks32 > postGuardTicks32) ? (lowTicks32 - postGuardTicks32) : 0U; uint32_t RiseTicks32; もし (maxRiseByHalfTicks32 >= desiredLeadTicks32) { selectedRiseTicks32 = desiredLeadTicks32; if(selectedRiseTicks32 > maxRiseByHalfTicks32) selectedRiseTicks32 = maxRiseByHalfTicks32; } そうでなければ(maxRiseByPostGuardTicks32 >= desiredLeadTicks32) { selectedRiseTicks32 = desiredLeadTicks32; if (selectedRiseTicks32 > maxRiseByPostGuardTicks32) selectedRiseTicks32 = maxRiseByPostGuardTicks32; } そうでなければ { selectedRiseTicks32 = maxRiseByPostGuardTicks32; } if (selectedRiseTicks32 >= HARD_PWM_LOW_START_PHASE_MIN_TICKS) { riseTicks32 = selectedRiseTicks32; fallTicks32 = riseTicks32 + highTicks32; } } #endif もし(fallTicks32 >= (uint32_t)periodTicks) fallTicks32 = (uint32_t)periodTicks - 1U; uint16_t riseTicks = (uint16_t)riseTicks32; uint16_t fallTicks = (uint16_t)fallTicks32; PWM_SetPwmLdok(axis->pwmBase, APP_PwmModuleMask(axis), false); uint16_t ctrl = axis->pwmBase->SM[axis->pwmModule]。CTRL; ctrl &=(uint16_t)(~PWM_CTRL_PRSC_MASK); ctrl |= PWM_CTRL_PRSC(プリスケール); axis->pwmBase->SM[axis->pwmModule]。CTRL = ctrl; axis->pwmBase->SM[axis->pwmModule]。INIT = 0U; axis->pwmBase->SM[axis->pwmModule]。VAL0 = 0U; axis->pwmBase->SM[axis->pwmModule]。VAL1 = ((uint16_t)(periodTicks - 1U); もし(軸>pwmチャンネル== kPWM_PwmA) { axis->pwmBase->SM[axis->pwmModule]。VAL2 = riseTicks; axis->pwmBase->SM[axis->pwmModule]。VAL3 = fallTicks; } そうでなければ (axis->pwmChannel == kPWM_PwmB) { axis->pwmBase->SM[axis->pwmModule]。VAL4 = riseTicks; axis->pwmBase->SM[axis->pwmModule]。VAL5 = fallTicks; } axis->pwmBase->SM[axis->pwmModule]。TCTRL = PWM_TCTRL_OUT_TRIG_EN(axis->outTrigMask); PWM_SetPwmLdok(軸>pwmBase、APP_PwmModuleMask(軸)、真); PWM_SetPwmLdok(軸>pwmBase、APP_PwmModuleMask(軸)、真); axis->pwmConfigValid = true; 軸>キャッシュドHighCnt400M = highCnt400M; axis->cachedLowCnt400M = lowCnt400M; 真を返す; } Re: RT1176 PWM startup failed こんにちは、 @liu626 さん。 設定を分離して、PWM3だけを初期化しても問題が続くかテストするのを手伝ってもらえますか? ご提供いただいた設定を確認し、その動作を再現するために、以下の質問があります。 axis_ctrl_t の定義は何ですか? アプリケーションでHARD_PWM_LOW_START_PHASE_ENABLEとHARD_PWM_STATE_GUARD_ENABLEは有効になっていますか? 以下のアプリ機能はどのような働きをしますか? APP_PWM_Unmap_Selected_Fault APP_PWM_ClearFault_Safe APP_PWM_出力無効化 APP_QTMR_Disable_Low_OFLAG_Output APP_StateGuard_Reset APP_PWM_SelectPrescaler_FromPeriodCnt400M APP_PwmModuleMask よろしくお願いします、 パブロ Re: RT1176 PWM startup failed お返事ありがとうございます。私が使用しているGPIOピンはrt1176のGPIO_EMC_B1_29です。「axis_ctrl_t」はモーターシャフトに関連する定義です。 * PWM出力パルス -> XBAR信号をトリガー -> パルスの立ち下がりエッジがQTMRの外部クロック入力を駆動 -> * QTMR 32ビットカスケードカウンタが1ずつ減少する -> 0に達すると、QTMR比較割り込みがトリガーされる -> 割り込みにより内部的にPWMがオフになる * 同時に、QTMR はハードウェア障害をトリガーし、PWM の物理出力ピンを直接プルダウンします。.id= AXIS_Y、 。名前= "Y", /* シリアルポートのログ記録またはブレークポイントデバッグでY軸を識別するために使用されます */ /* ================= PWM出力リソース割り当て ================= */ .pwmBase= PWM3、/* Y軸はFlexPWM3モジュールを使用します */ .pwmモジュール= kPWM_Module_0, /* PWM3 のサブモジュール 0 を使用します (各 PWM には 0 から 3 までの 4 つのサブモジュールがあります) */ .pwmChannel= kPWM_PwmA, /* サブモジュール0のフェーズAの出力ピンを使用します。これは物理ピンGPIO_EMC_B1_29に対応します。 */ /* ================= 32 ビット QTMR カスケード カウント リソース割り当て ================= */ .tmrBase= TMR3, /* Y軸はQTMR3ペリフェラル(IRQ割り込み番号TMR3_IRQnに対応します)を使用します */ .lowCh= kQTMR_Channel_0, /* 16ビットローカウンタ:TMR3のチャンネル0を使用します */ .highCh= kQTMR_Channel_1,/* 16ビットハイカウンタ:TMR3のチャンネル1を使用 */ /* 👉 .lowCh と .highChこれらはペアになっており、ハードウェアレベルでは自動的に32ビットカウンタに結合されます。 /* ================= ハードウェアカスケードクロックソースの構成 (コアクリティカル) ================= */ .tmrInputsrc=kQTMR_ClockCounter0InputPin, /* チャンネル0のクロックソース:「外部ピン入力0」に設定。 XBAR構成では、PWM3からのパルスの落ち降り縁がXBARを介してTMR3のチャネル0の入力ピンに接続されます。 したがって、PWMでパルスが出力されるたびに、チャンネル0(16ビット)は一度だけ減衰操作を行います。*/ .cascadePcs = 4U, /* 高16ビットチャネル(チャネル1)のクロックソース(PCS)の設定。 i.MX RTのQTMRレジスタにおけるPCS値は以下の通りに対応します。 0-3 = 外部ピン入力; 4 = チャネル0のオーバーフロー/終了イベント; 5 = チャネル1のオーバーフロー/終了イベント; 6 = チャネル2のオーバーフロー/終了イベント; 7 = チャネル3のオーバーフロー/終了イベント。 ここでは4Uとして構成されており、つまり「TMR3のチャネル1」が「TMR3のチャネル0のオーバーフローイベント」を監視することを意味します。 HARD_PWM_LOW_START_PHASE_ENABLE と HARD_PWM_STATE_GUARD_ENABLE が有効になっています。APP_PWM_Unmap_Selected_Fault 機能:現在の軸に対応する故障ピンマッピングを削除します。障害を無効にするには、基となる PWM_SetupFaultDisableMap 関数を呼び出します。その目的は、ハードウェア障害が不要な場合に、偶発的な外部干渉によってPWMがオフになるのを防ぎ、根本的なデバッグプロセスを容易にすることです。 APP_PWM_ClearFault(元のコード関数) 機能:PWMモジュールの障害状態フラグ(axis->pwmBase->FSTS)をクリアします。ハードウェア故障が発生した後は、PWMの再起動を許可する前にまずこのフラグをクリアしなければなりません。 APP_PWM_出力無効化 機能: PWMタイマーを即座に停止し、ピンの出力を強制的に低レベル(PWM_SetPwmForceOutputToZero)にし、出力を有効にします。この目的は、ピンがモーター起動前に浮かんだりデフォルト状態に置かれたりして高レベルを出力し、モーターが不規則に動くのを防ぐことです。 APP_QTMR_Disable_Low_OFLAG_Output 機能:QTMRのOFLAG(ステータスフラグ)出力を無効にし、OFLAGを低レベルに強制的に設定します。XBARハードウェアと連携して、その役割はQTMR出力からPWMフォルトピンへの経路を遮断し、起動前にフォルトが誤ってトリガーされるのを防ぐことです。 APP_StateGuard_Reset 機能:国家警備隊(番犬)のカウンターと旗をクリアします。この関数は、HARD_PWM_STATE_GUARD_ENABLEが有効になっている場合に、長時間パルス変化がない状態やデッドロックが発生した場合に、システムを停止または再起動する前にこれらの保護変数をリセットするために使用されます。 APP_PWM_SelectPrescaler_FromPeriodCnt400M 機能:これは周波数計算の非常に重要な基本機能です。これは、High + Lowの合計400MHzカウント値を受け取り、16ビットPWMレジスタに収まるように設定すべきプリスケーラ(PRSC)とPWM周期(PERIOD)の数を計算します。ご注意ください:計算された周期が65535を超え、かつ除算係数が範囲外の場合、この関数はfalseを返し、モーターの起動に失敗します。 APP_PwmModuleMask 機能:PWMサブモジュールのインデックス番号(例えば、値が0のkPWM_Module_0)を、Nビット左シフトしたビットマスクに変換します。NXPのPWMレジスタの多く(OUTEN、MCTRLなど)はビット単位で制御されます。この関数は、正しいバイナリマスクを生成する役割を担っています。 Re: RT1176 PWM startup failed 原因を突き止めました。これは、cm4コア内のPIT割り込みの内部負荷が大きすぎるため、cm7コアのPWM動作に影響を与えているためです。PIT割り込みの負荷を軽減したところ、PWM起動時の不具合が解消しました。
記事全体を表示
マネージャー:FS32K144UAT0VLLTのVREFHを誤った電源に接続した場合、どのような問題が発生しますか? FS32K144UAT0VLLTは、VDDとVDDAに3.3V、ADサンプリングに5Vの電源を使用します。VREFHが5V電源に誤って接続されているため、以下の問題が発生します。 1. VREFHの電圧はVDDAの電圧よりも低くなければなりません。VREFに5Vを供給した場合、測定電圧は3.3Vから約4.18Vに上昇します。 2. 3.3V電源を取り外し、5V電源のみを残した場合、3.3V電源の電圧は約4.18Vと測定されます。これは、FS32K144UAT0VLLTのVREFHが5V電源を3.3V電源と直列に接続しているためでしょうか? 3. FS32K144UAT0VLLTのVDDとVDDAを5V電源に変更し、元のMC14504BDRGレベル変換チップを3.3Vから5Vへのレベル変換に使用している場合、それを5Vレベル変換に変更することは可能でしょうか?回路基板は既にハンダ付け済みです。 ありがとう! Re: 经理:FS32K144UAT0VLLT的VREFH接错电源会出现什么问题? こんにちは@ YF666666 S32K1xxマイクロコントローラ向けハードウェア設計ガイドライン、改訂版5、2021年3月 図3. S32K14x – 100LQFPおよび100BGAパッケージの電源ピンとドメイン FS32K144UAT0VLLT の電源設計は上の図を参照しており、チップの外部電圧は VDD + 0.3 V を超える必要はありません。 「当初は電圧レベル変換チップ MC14504BDRG を使用して 3.3V から 5V 電圧レベルへの変換を行っていましたが、5V 電圧レベルに変更されました。」 尾行の説明はありませんが、不明瞭な変更が加えられています。 MC14504BDRG の出力は VREFH です。当初は 3.3V から 5V に VREFH に供給されていましたが、5V から 5V に変更されましたか? 自己認証が MC14504BDRG にある場合、切り替えの結果は VREFH が VDDA より小さいだけで済みます。
記事全体を表示
Wi-Fi + 蓝牙 Zephyr 演示 本指南的目的是通过使用 FRDM-RW612 结合 Zephyr 资源库中的 Wi-Fi 外壳和蓝牙外设示例的功能,演示 RW61x MCU 利用 Wi-Fi 和蓝牙功能生成示例应用程序的能力。 该演示可通过串行终端控制多项 Wi-Fi 功能,同时还能通过恩智浦的物联网工具箱应用程序测试蓝牙外设的多项 GATT 服务。 环境 用于 Visual Studio Code 的 MCUXpresso。 Zephyr v4.3.0。 Zephyr SDK v0.17.4。 FRDM-RW612。 首先,需要将 Wi-Fi Shell 和蓝牙外设示例导入工作区: 在快速启动面板中选择"从资源库导入示例" 。 选择 Wi-Fi 外壳示例,然后单击"Import" 按钮: 选择蓝牙外设示例,然后单击"Import" 按钮: 将示例导入工作区后,将外设示例主文件中的内容复制到 Wi-Fi shell 示例的主文件中,以便在 Wi-Fi 示例中添加蓝牙功能和所需的初始化。 在此步骤中,您可以覆盖集成项目主文件中的内容,因为它只包含一个空的主结构。 然后从"prj.conf中复制配置"外围示例的文件到"prj.conf"文件,以启用蓝牙功能和服务。 重要: 注意 不要删除修改后示例的 prj.conf 文件中的设置,只需添加下面的新设置即可。 按下生成按钮或右键单击 " Build Project " 来构建示例,如下所示: 闪存或调试示例。要闪存它,请右击项目名称并选择"闪存所选目标" ,然后选择"zephyr.elf"锉刀 如果你想调试项目,请点击之前使用的版本按钮旁边的绿色箭头。 刷新项目后,打开串行终端,配置如下: 波特率115200 停止位1 数据8 位 奇偶校验:无 在终端中,重置后应获得以下输出,其中打印了蓝牙和Wi-Fi的初始化日志: 如蓝牙日志所示,集成外设示例开始做广告,要测试此功能,您可以使用恩智浦物联网工具箱 " Heart Rate " 工具,该工具允许与主板配对,如下图所示: 要开始配对,请点击 " 设置 PHY " 框并选择首选 PHY。一旦配对成功,您就可以看到心率指示如图所示增减: 与手机配对后,您可以在串口终端上看到以下日志: 要测试 Wi-Fi 外壳功能,可通过在终端" nxp_wifihelp" 以及" wifihelp" 中编写命令来显示所有 NXP-Wi-Fi 功能,以使用默认 Wi-Fi 功能扫描/连接网络。 要测试与接入点的连接,请执行" wifiscan" 以显示可用网络,确定要加入的网络后,写入" wificonnect..." 并输入加入网络所需的其他属性,然后就会得到类似下面的输出: 请注意,您可以在通过蓝牙与移动应用程序中的心率工具连接的同时执行此操作,这表明 Wi-Fi 和蓝牙连接可以同时工作。
記事全体を表示
FreeMASTER S32K344-WB用のSimulinkモデルを作成し、LEDを1秒ごとに点滅させるようにしました。その後、ELFファイルをFreeMASTERにインポートし、J-Linkを介して波形を監視しました。しかし、 「Go」をクリックした後、FreeMASTERオシロスコープの信号レベルは平坦な線のままで、変化しませんでした。基板上の物理的なリセットボタンを押すと、LEDは正常に点滅し始めたが、FreeMASTERの波形表示は一時停止した。MCUがLEDを連続的に点滅させながら正常に動作している状態で、FreeMASTERオシロスコープで波形を観測するには、どのように設定すればよいでしょうか?
記事全体を表示
マルチサンプルフレームバッファからマルチサンプルEGLサーフェスへのブリッティングを実行する際に、GL_INVALID_OPERATIONエラーが発生します。 こんにちは、 私はI.MX8QM評価ボードでOpenGL ESを使用してマルチサンプルフレームバッファからマルチサンプルEGLサーフェスへのブリッティングを行っていますが、「 GL_INVALID_OPERATION 」というエラーが発生します。以下は私が実行した手順です。 マルチサンプルレンダーバッファがアタッチされたFrameBufferObjectが作成されました glRenderbufferStorageMultisample (GL_RENDERBUFFER, 4, GL_RGBA8, width, height); を呼び出し、FBO に描画します。 glBlitFramebufferを使用してFBOからDefault Framebufferにレンダリングする場合、 EGLウィンドウサーフェスが属性付きで作成されるとGL_INVALID_OPERATIONエラーが発生します。 EGL_SAMPLES = 4 EGL_RED_SIZE = 8 EGL_GREEN_SIZE = 8 EGL_BLUE_SIZE = 8 EGL_ALPHA_SIZE = 8 EGL_SAMPLES = 0で EGL サーフェスが作成されると、 glBlitFramebuffer はデフォルトのフレームバッファに正しく描画します。 注: glBlitFramebufferでは、ソース矩形とデスティネーション矩形のサイズは完全に同じです。 Re: GL_INVALID_OPERATION error, when doing multisample framebuffer to multisample EGL Surface blitti こんにちは、 OpenGL ES では、このような使用例は禁止されています。マルチサンプル バッファからマルチサンプル バッファへの解決 (blit) はできません。 ドキュメントに記載されているとおり: https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glBlitFramebuffer.xhtml 描画バッファのGL_SAMPLE_BUFFERSの値がゼロより大きい場合、GL_INVALID_OPERATIONが生成されます。 よろしくお願いいたします。 アルド。
記事全体を表示
PCF85063TP/1Z RTC 中的时间漂移 我们在温度记录仪产品中使用 PCF85063TP/1Z RTC,用于在温度数据记录期间保持时间戳。在测试期间,我们观察到多个电路板上的时间偏移问题,其中每个电路板随时间推移显示出不同的偏移量。 在当前的硬件设计中,我们使用的是 12.5 pF 负载电容晶体。在此基础上,我们更新了 RTC 寄存器的设置,将 CAP_SEL 位配置为 "1",以满足晶体负载电容要求。 更改配置后,我们在实时运行中仍能观察到大约 2 秒钟的漂移。 我们想了解 PCF85063TP/1Z 是否会出现这种程度的漂移。 是否有建议的寄存器配置或校准方法来提高 RTC 的精度。 PCB 布局、晶体选择或其他硬件考虑因素是否会导致观察到的板之间的差异。 请就如何在此应用中提高 RTC 计时精度提出建议和指导。 Re: Time Drift in PCF85063TP/1Z RTC 你好 请参阅应用笔记 AN11247 使用外部温度传感器使用 PCF85063、PCF8523 和 PCF2123 提高计时精度 希望对您有所帮助!
記事全体を表示
PCF2131 MBF可靠性报告 我使用的是 PCF2131 RTC I2C 集成电路,我们需要它在 50C 温度条件下的可靠性报告和 MTBF 数据。 RTC Re: PCF2131 RELIABILITY REPORT FOR MTBF 您好, 为了获取所需的 FIT/MTBF 数据,请创建 标准票据。 谢谢您! BRs, Tomas
記事全体を表示
S32DS3.6.2 build gPTP Example Code error 原来一直在S32DS3.5+RTD5..0.0开发,介于新的需求要开发gPTP相关功能,所以重新搭建新的开发环境: S32DS_3.6.2_RFP_win32.x86_64.exe SW32K3_S32M27x_RTD_R21-11_6.0.0_D2506_DesignStudio_updatesite.zip SW32K3_FreeRTOS_11.1.0_6.0.0_CD1_D2506_DesignStudio_updatesite.zip SW32K3xx_M7_gPTP_1.0.0_D2507_DesignStudio_updatesite.zip SW32K3_TCPIP_STACK_3.0.0_D2507_DesignStudio_updatesite.zip 搭建完成后创建S32K388_gptp_free_rtos_ds工程,更新code直接编译发现下面错误: 我的理解是不是环境搭建过程中是不是缺少插件的安装? 实际同样的情况lwip_FreeRTOS_s32k388也出现: 但是对应的插件我都安装了,附件是S32K388_gptp_free_rtos_ds导出例程,刚开始搭建麻烦指点一下,谢谢! Re: S32DS3.6.2 build gPTP Example Code error 你好,实际我不太关注这个错误,这些错误肯定可以修订,主要再S32DS3.5+RTD5.0.0直接导入IDE提供的标准例程没有出现编译出错问题,但是在S32DS3.6.2+RTD6.0.0同样的操作出现该现象,是不是插件安装不匹配导致,最担心是: 涉及的source code file都是SDK提供的,基本上不会修改,就是修改也是通过IDE界面配置修改,后面随着功能增加,会不断update Code,已经修改的文件再次覆盖,每次都需要修改一边,这样是不是不太方便! Re: S32DS3.6.2 build gPTP Example Code error 你好@Ryan_xjl 我能够复制这个问题。要构建没有错误的项目,需要进行以下更改: FreeRTOSConfig.h Add the following definition: #define configKERNEL_PROVIDED_STATIC_MEMORY 1 port.c Add the declaration: void xPortSysTickHandler( void ) __attribute__( ( naked ) ); Vector_Table.s Change .globl vPortSVCHandler to .globl SVC_Handler Change .long vPortSVCHandler to .long SVC_Handler+1 BR、VaneB Re: S32DS3.6.2 build gPTP Example Code error 你好@Ryan_xjl 关于软件兼容性,您目前使用的版本应该可以正常运行,因为它们都依赖于 RTD 6.0.0 版本。 关于从 RTD 5.0.0 迁移到 RTD 6.0.0,以及从 S32DS 3.5 迁移到 S32DS 3.6.2、软件和集成开发环境都有了一些变化。因此,尽管整体功能在很大程度上仍然相似,但无法保证完全的后向兼容性。 最后,关于生成文件中的修改丢失,这是使用 ConfigTools 时的预期行为。每次应用新配置时,该工具都会重新生成文件并将其恢复到默认状态。直接在这些文件中进行的任何手动更改都不会被保留。因此,在使用生成的代码时,必须谨慎管理自定义修改。 Re: S32DS3.6.2 build gPTP Example Code error 非常感谢你如此耐心的帮助我解决困惑,可能是我表达的不够明白,或者我刚开始学习,方便明确表达我的意思,我提供了整个操作流程的视频,可以更好表达我的诉求,再次感谢你如此耐心的帮助我 PS:过程中有个现象,不知道是不是该情况导致 附件是操作流程视频 Re: S32DS3.6.2 build gPTP Example Code error 你好@Ryan_xjl 不用担心,语言的差异有时会造成误解,我非常感谢你分享了一段视频来说明这个问题。 打开 ConfigTools 时显示的窗口只是一个警告,表明创建项目时使用的工具版本比当前使用的版本旧。只有当您尝试打开.mex文件的原始(旧)版本。就您的情况而言,应该不会有任何问题。此外,从头开始创建项目时,也不会出现该警告。 最后,你在编译示例时遇到的版本错误可以通过应用我在第一个回复中提到的更改来解决。 我希望这有助于澄清您的问题。 Re: S32DS3.6.2 build gPTP Example Code error 你好@Ryan_xjl 我这边导入了 lwip_FreeRTOS_s32k388 示例,但似乎缺少了堆栈文件夹,这导致了错误。 解决方法是,您可以修改 tcpip_itm_manifest.xml 文件并将 S32K388 添加到三个设备列表中。例如,可以在以下位置找到该文件: C:\NXP\S32DS.3.6.4\S32DS\software\PlatformSDK_S32K3\tcpip_itm_manifest.xml 此外,请参阅S32K388 tcpip stack 4.0.0 在编译时丢失 lwip 文件夹的主题,该主题已讨论过这一问题。该主题还指出了一个示例项目,可能对您的情况有所帮助。 Re: S32DS3.6.2 build gPTP Example Code error 非常感谢,这个问题目前就按照当前的思路进行 附件的这个工程操作流程与gPTP工程一样,是否可以协助看看(发现stack没有生成)
記事全体を表示
VS Code拡張機能のアップデートによりRTOSビューアが壊れました こんにちは、 これまでは、vscode ツール バージョン 1.9.20 (旧バージョン) を使用しており、freertos スレッド (RT1189) の状態を確認するためにhttps://marketplace.visualstudio.com/items?itemName=mcu-debug.rtos-viewsを使用していました。アップデート後、ツールが動作しなくなり、「 RTOS検出が完了しませんでした。次回の停止時に再開されます。」と表示されるだけです。何か解決策はありますか? よろしくお願いします。 Re: VS code extension update broke RTOS viewer こんにちは、 VS Code 用の MCUXpresso には、以前から独自の RTOS ビューアが搭載されています。https://mcuxpresso.nxp.com/mcux-vscode/latest//html/RTOS-Details.htmlをご確認ください。 また、以前の変更点として、拡張機能がMicrosoft C/C++デバッグアダプタからCortex-Debugに基づく独自のデバッグアダプタに移行しました。そのため、新しいデバッグ構成を作成する必要があります。これにより、当社のデバッグアダプタに基づく構成が自動的に作成されます(タイプとして「mcuxpresso-debug」が表示されます)。 追記:Seggerデバッグプローブを使用している場合は、RTOSの**サポート**を有効にするために特別な**イネーブルメント**が必要になりますのでご注意ください( https://mcuxpresso.nxp.com/mcux-vscode/latest//html/Debug-Views.html#enabling-rtos-awarenessを参照)。 よろしくお願いいたします。 クリスティアン Re: VS code extension update broke RTOS viewer はい、解決しました。デバッグモードで-Ogフラグを付けてコンパイルしていたのですが、それを-O0に変更したらビューアが動作するようになりました。しかし、Ogが標準的な編集・デバッグプロセスのデフォルトとなるべきなので、このツールには改善が必要だと思います。 これとは関係ないのですが、デバッグコンソールにもこの警告が表示されます。 「警告: ' \Main.cpp' をホストエンコーディング (CP1252) から UTF-32 に変換できませんでした。」 通常はこのようなことは起こらないはずです。バグ報告を提出してください。 よろしくお願いします。 Re: VS code extension update broke RTOS viewer ありがとうございます 実際には、このメッセージはMCUXpresso RTOSビュー自体から発信されています(私は別のプラグインを誤って参照していました)。 launch.json とカスタムデバイススクリプトを添付しました (Linkserver 26.3.123 の MIMXRT1180-EVK.json と同じです)。しかし、「接続スクリプト」は「RT1180_reset.scp」です。 当社のアプリはハイパーラム上で動作し、SDK 2.16を使用しています。Freertosの変数は正しく設定されています。 アプリのステップデバッグはできますが、RTOSの詳細ビューには依然として「 RTOS検出が完了しませんでした。次の停止時に再開されます。」と表示されます。 よろしくお願いします。 Re: VS code extension update broke RTOS viewer @cristiantepusこの件について何か進展はありますか? Re: VS code extension update broke RTOS viewer 今日、MCUXpresso RTOSビューアがリリースモードでは動作せず、何も表示されないことに気づきました。 しかし、 https://marketplace.visualstudio.com/items?itemName =mcu-debug.rtos-views -Og およびリリースモードでは動作しますが、現在の mcuxpresso vscode プラグインでは動作しません (無効になります)。それを元に戻す方法はありますか? Re: VS code extension update broke RTOS viewer こんにちは、 @arunkumar_g さん。 弊社が提供するRTOS詳細ビューは、ELFファイル内にいくつかのシンボルが存在することを前提としています(例:「 FreeRTOSDebugConfig」、「 pxCurrentTCB」、「 uxCurrentNumberOfTasks」など多数あります。「 RTOS検出が完了しませんでした。次の停止時に再開されます。」というメッセージでは何が問題だったのかが分からないという点には同意します。この点をより明確にするよう努めます。 「デバッグ」と「リリース」で得られた結果についてですが、これはコンパイラ/リンカの最適化の結果だと考えられます。必要なシンボルが削除されているため、利用者はそれらを見つけることができません。この場合、RTOSの詳細ビューが機能しないだけでなく、低レベルのGDB Thread認識(LinkServer、J-Link、PEmicro)でも、コールスタックビューでFreeRTOSタスクを表示およびデバッグできなくなります。この場合、デバッグモードとリリースモードの両方で必要なシンボルが存在するようにコードを更新することをお勧めするしかありません。ドキュメントとツールからの情報を更新し、必要な記号が不足しているためにビューにデータが表示されないことを明確にします。 また、このケースではMCUデバッグRTOSビューが動作しているとおっしゃっていましたが、そうかもしれません。しかし、私が最後に確認した時点では、バージョン管理(バージョンは「 FreeRTOSDebugConfig」を調べることで確認できます)は一切サポートされていませんでした。また、FreeRTOSのデータ構造はRTOSのバージョンに固有のものであることにもご注意ください。MCUデバッグビューを有効にするには、サポート対象リストに「mcuxpresso-debug」デバッグアダプタ(MCUXpresso固有)を追加する方法をメンテナーに問い合わせてください。 古いSDK 2.16をベースにしたプロジェクトを使用しているとのことですので、CMakeとKconfigをベースにした最新のMCUXpresso SDKに切り替えることをお勧めします。   いくつかの便利なリンク: - RTOSの詳細: RTOSの詳細 — MCUXpresso for VS Code 26.04ドキュメント - MCUXpresso SDK: MCUXpresso SDK ドキュメント — MCUXpresso SDK ドキュメント   ありがとうございます エイドリアン
記事全体を表示
USBハブの複数デバイス接続に関する問題 私はプロジェクト開発において、i.MX RT1060コントローラーを使用しています。複数のデバイス(MSD - ペン ドライブ、CDC - プリンター)を以下の順序で接続すると、USBハブの機能に問題が発生します。 Case 1 A) プリンター:添付イベント情報が発生し、正常に動作しています B) フラッシュドライブ: フラッシュドライブのアタッチイベントは発生しません。 フラッシュドライブを取り外すと、システムはUSB_HostReleaseDeviceResource内でハングアップします。 CASE 2 A) フラッシュドライブ:コネクテッドで正常に動作しています B) プリンター: アタッチイベントが発生しましたが、インターフェースが完全に完了していません。ポートオープンイベントのコールバックでエラーが発生しました。 フラッシュドライブを取り外すと、両方のデバイスの接続が切断されました。 CASE 3 フラッシュドライブとプリンターの両方が挿入されました:フラッシュドライブの接続イベントのみが発生し、正常に動作しています。 フラッシュドライブを取り外して再度接続すると、正常に動作します。 CDCデバイスの接続/切断ではイベントは発生しません。 CDCの機能を復旧させる唯一の方法は、システムを再起動することです。 調査結果: ハブをPCに接続して機能を確認すると、デバイスマネージャーに両方のデバイスが表示されます。このことから、問題はi.MX RT1060のUSBドライバの実装/USBの複合デバイス処理にあると結論付けます。 MSDデバイスとCDCデバイスの両方をハブ経由で確実に列挙および管理できるように、この問題を解決する方法はありますか? よろしくお願いいたします。 パヴァン #IMXRT1060 #nxp #マイクロコントローラ #USBハブ #USB複合デバイスの処理。 USB Re: USB hub multiple devices connection issue 上記について何かご提案はありますか? Re: USB hub multiple devices connection issue こんにちは、 @Gangapavan さん。 使用しているSDKのバージョンは何ですか?弊社のSDKに含まれているUSB関連のサンプルを基にプロジェクトを進めていますか?あなたのアプリケーションでは、MSDとCDCのためのUSB機能をどのように実装しましたか? 標準のUSBハブ操作を管理するために、弊社が提供する「usb」>「host」>「class」フォルダ内のUSBホストハブドライバを実装していますか? BR、 エドウィン。 Re: USB hub multiple devices connection issue こんにちは、@EdwinHzさん ご返信ありがとうございます。 私たちはSDKバージョン2.13.0を使用しています。私たちはSDKのサンプルをベースにしてアプリケーションを開発しました。 はい、上記で指定した場所にあるハブファイルも使用しています。 プロジェクトが本番稼働段階にあるため、この問題の迅速な解決が必要です。必要であれば、メールまたはご希望の方法でファイルを共有いたします。 ありがとうございます。 Re: USB hub multiple devices connection issue こんにちは、@EdwinHzさん 上記について何かご提案はありますか?
記事全体を表示
MIMXRT1180-EVK LittleFS サンプルは、DCache が無効になっていない限り、外部フラッシュで失敗します。 こんにちは、 Zephyr LittleFS サンプル ( https://github.com/zephyrproject-rtos/zephyr/tree/main/samples/subsys/fs/littlefs ) を実行しようとしています。CM33コアを使用して外部フラッシュ(W25Q128JWSIQ)に書き込んでいますが、問題が発生しています。 サンプルをデフォルト設定で実行しようとすると、約90%の確率で失敗します。フラッシュメモリを消去してファイルシステムを再構築するオプションをオンにすると、ほぼ毎回失敗するようです。 失敗するタイミングは様々ですが、ログは通常次のような内容になります。 ネタバレ (ハイライトして読む) *** Zephyr OSビルドv4.3.0-6239-g28cd602a81eaを起動しています*** littlefs上のファイルを読み書きするためのサンプルプログラム w25q128jw@0 の 0xe20000 にある領域 3、1966080 バイト [00:00:00.022,000] main: フラッシュ領域を消去しています... 0 [00:00:00.028,000] littlefs: LittleFS バージョン 2.11、ディスクバージョン 2.1 [00:00:00.037,000] littlefs: w25q128jw@0:0xe20000 の FS は 480 個の 0x1000 バイトのブロックで、512 サイクルです [00:00:00.047,000] littlefs: パーティションサイズ: rd 16 ; pr 16 ; ca 64 ; la 32 [00:00:00.055,000] littlefs: WEST_TOPDIR/modules/fs/littlefs/lfs.c:1386:{0x0, 0x1} のディレクトリペアが破損しています [00:00:00.066,000] littlefs: マウントできません (LFS -84); フォーマット[00:00:00.118,000] littlefs: /lfs がマウントされました /lfs マウント: 0 /lfs: bsize = 16 ; frsize = 4096 ; blocks = 480 ; bfree = 478 ディレクトリ /lfs を一覧表示しています... [00:00:00.150,000] littlefs: WEST_TOPDIR/modules/fs/littlefs/lfs.c:2109:スーパーブロック0x0は書き込み不能になりました [00:00:00.161,000] fs: ファイルオープンエラー (-5) [00:00:00.167,000] main: 失敗: /lfs/boot_count を開けません: -5 [00:00:00.174,000] littlefs: /lfs がマウントされていません /lfs アンマウント: 0 *** Zephyr OSビルドv4.3.0-6239-g28cd602a81eaを起動しています***w25q128jw@0 の littlefsArea 3 の 0xe20000 にある 1966080 バイトのファイルを読み書きするサンプル プログラム[00:00:00.022,000] main: フラッシュ領域を消去しています... 0[00:00:00.028,000] littlefs: LittleFS バージョン 2.11、ディスク バージョン 2.1[00:00:00.037,000] littlefs: w25q128jw@0:0xe20000 の FS は 480 個の 0x1000 バイトのブロックで構成され、512 サイクル[00:00:00.047,000] があります。 littlefs: パーティションサイズ: rd 16 ; pr 16 ; ca 64 ; la 32[00:00:00.055,000] littlefs: WEST_TOPDIR/modules/fs/littlefs/lfs.c:1386:{0x0, 0x1}[00:00:00.066,000] でディレクトリペアが破損しています littlefs: マウントできません (LFS -84); フォーマット中[00:00:00.118,000] littlefs: /lfs マウント済み/lfs マウント: 0/lfs: bsize = 16 ; frsize = 4096 ; blocks = 480 ; bfree = 478ディレクトリ /lfs を一覧表示中...[00:00:00.150,000] littlefs: WEST_TOPDIR/modules/fs/littlefs/lfs.c:2109:スーパーブロック 0x0 が書き込み不能になりました[00:00:00.161,000] fs: ファイルオープンエラー (-5)[00:00:00.167,000] main: 失敗: /lfs/boot_count を開けません: -5[00:00:00.174,000] littlefs: /lfs アンマウント /lfs アンマウント: 0 ある時点で「スーパーブロック0x0が書き込み不能になりました」というエラーが発生し、サンプルが失敗します。 Kconfigオプション「CONFIG_DCACHE=n」でDCacheを無効にするとサンプルが確実に動作することがわかったので、これはキャッシュの問題だと考えています。 ネタバレ (ハイライトして読む) *** Zephyr OSビルドv4.3.0-6239-g28cd602a81eaを起動しています*** littlefs上のファイルを読み書きするためのサンプルプログラム w25q128jw@0 の 0xe20000 にある領域 3、1966080 バイト [00:00:00.060,000] main: フラッシュ領域を消去しています... 0 [00:00:00.069,000] littlefs: LittleFS バージョン 2.11、ディスクバージョン 2.1 [00:00:00.127,000] littlefs: w25q128jw@0:0xe20000 の FS は 480 個の 0x1000 バイトのブロックで、512 サイクルです [00:00:00.139,000] littlefs: パーティションサイズ: rd 16 ; pr 16 ; ca 64 ; la 32 [00:00:00.151,000] littlefs: WEST_TOPDIR/modules/fs/littlefs/lfs.c:1386:{0x0, 0x1} のディレクトリペアが破損しています [00:00:00.164,000] littlefs: マウントできません (LFS -84); フォーマット[00:00:00.235,000] littlefs: /lfs がマウントされました /lfs マウント: 0 /lfs: bsize = 16 ; frsize = 4096 ; blocks = 480 ; bfree = 478 ディレクトリ /lfs を一覧表示しています... /lfs/boot_count 読み取り回数:0 (バイト数: 0) /lfs/boot_count に新しいブートカウント 1 を書き込みます: [wr:1] [00:00:00.297,000] main: テストファイル: /lfs/pattern.bin が見つかりません。作成してください。 ------ ファイル: /lfs/pattern.bin ------ 01 55 55 55 55 55 55 55 02 55 55 55 55 55 55 55 03 55 55 55 55 55 55 55 04 55 55 55 55 55 55 55 05 55 55 55 55 55 55 55 06 55 55 55 55 55 55 55 07 55 55 55 55 55 55 55 08 55 55 55 55 55 55 55 09 55 55 55 55 55 55 55 0a 55 55 55 55 55 55 55 0b 55 55 55 55 55 55 55 0c 55 55 55 55 55 55 55 0d 55 55 55 55 55 55 55 0e 55 55 55 55 55 55 55 0/55 55 55 55 55 55 55 10 55 55 55 55 55 55 55 11 55 55 55 55 55 55 55 12 55 55 55 55 55 55 55 13 55 55 55 55 55 55 55 14 55 55 55 55 55 55 55 15 55 55 55 55 55 55 55 16 55 55 55 55 55 55 55 17 55 55 55 55 55 55 55 18 55 55 55 55 55 55 55 19 55 55 55 55 55 55 55 1a 55 55 55 55 55 55 55 1b 55 55 55 55 55 55 55 1c 55 55 55 55 55 55 55 1d 55 55 55 55 55 55 55 1e 55 55 55 55 55 55 55 1f 55 55 55 55 55 55 55 20 55 55 55 55 55 55 55 21 55 55 55 55 55 55 55 22 55 55 55 55 55 55 55 23 55 55 55 55 55 55 55 24 55 55 55 55 55 55 55 25 55 55 55 55 55 55 55 26 55 55 55 55 55 55 55 27 55 55 55 55 55 55 55 28 55 55 55 55 55 55 55 29 55 55 55 55 55 55 55 2a 55 55 55 55 55 55 55 2b 55 55 55 55 55 55 55 2c 55 55 55 55 55 55 55 2d 55 55 55 55 55 55 55 2e 55 55 55 55 55 55 55 2f 55 55 55 55 55 55 55 30 55 55 55 55 55 55 55 31 55 55 55 55 55 55 55 32 55 55 55 55 55 55 55 33 55 55 55 55 55 55 55 34 55 55 55 55 55 55 55 35 55 55 55 55 55 55 55 36 55 55 55 55 55 55 55 37 55 55 55 55 55 55 55 38 55 55 55 55 55 55 55 39 55 55 55 55 55 55 55 3a 55 55 55 55 55 55 55 3b 55 55 55 55 55 55 55 3c 55 55 55 55 55 55 55 3d 55 55 55 55 55 55 55 3e 55 55 55 55 55 55 55 3f 55 55 55 55 55 55 55 40 55 55 55 55 55 55 55 41 55 55 55 55 55 55 55 42 55 55 55 55 55 55 55 43 55 55 55 55 55 55 55 44 55 55 55 55 55 55 55 45 55 aa [00:00:00.659,000] littlefs: /lfs がマウントされていません /lfs アンマウント: 0 *** Zephyr OSビルドv4.3.0-6239-g28cd602a81eaを起動しています***w25q128jw@0 の littlefsArea 3 の 0xe20000 にある 1966080 バイトのファイルを読み書きするサンプル プログラム[00:00:00.060,000] main: フラッシュ領域を消去しています... 0[00:00:00.069,000] littlefs: LittleFS バージョン 2.11、ディスク バージョン 2.1[00:00:00.127,000] littlefs: w25q128jw@0:0xe20000 の FS は 480 個の 0x1000 バイトのブロックで構成され、512 サイクル[00:00:00.139,000] があります。 littlefs: パーティションサイズ: rd 16 ; pr 16 ; ca 64 ; la 32[00:00:00.151,000] littlefs: WEST_TOPDIR/modules/fs/littlefs/lfs.c:1386:{0x0, 0x1}[00:00:00.164,000] でディレクトリペアが破損しています littlefs: マウントできません (LFS -84); フォーマット中[00:00:00.235,000] littlefs: /lfs マウント済み/lfs マウント: 0/lfs: bsize = 16 ; frsize = 4096 ; blocks = 480 ; bfree = 478 ディレクトリ /lfs を一覧表示中 .../lfs/boot_count 読み取り回数:0 (バイト数: 0)/lfs/boot_count 新しいブートカウントを書き込む 1: [wr:1][00:00:00.297,000] main: テストファイル: /lfs/pattern.bin が見つかりません。作成してください!------ファイル: /lfs/pattern.bin ------01 55 55 55 55 55 55 55 02 55 55 55 55 55 55 5503 55 55 55 55 55 55 55 04 55 55 55 55 55 55 55 5505 55 55 55 55 55 55 55 06 55 55 55 55 55 55 5507 55 55 55 55 55 55 55 08 55 55 55 55 55 55 55 5509 55 55 55 55 55 55 55 0a 55 55 55 55 55 55 550b 55 55 55 55 55 55 55 55 0c 55 55 55 55 55 55 55 550d 55 55 55 55 55 55 55 55 0e 55 55 55 55 55 55 55 550f 55 55 55 55 55 55 55 10 55 55 55 55 55 55 5511 55 55 55 55 55 55 55 12 55 55 55 55 55 55 55 5513 55 55 55 55 55 55 55 14 55 55 55 55 55 55 5515 55 55 55 55 55 55 55 16 55 55 55 55 55 55 55 17 55 55 55 55 55 55 55 18 55 55 55 55 55 55 55 55 19 55 55 55 55 55 55 55 1a 55 55 55 55 55 55 55 1b 55 55 55 55 55 55 55 1c 55 55 55 55 55 55 55 1d 55 55 55 55 55 55 55 1e 55 55 55 55 55 55 55 55 1f 55 55 55 55 55 55 55 20 55 55 55 55 55 55 55 21 55 55 55 55 55 55 55 22 55 55 55 55 55 55 55 23 55 55 55 55 55 55 55 24 55 55 55 55 55 55 55 25 55 55 55 55 55 55 55 26 55 55 55 55 55 55 55 27 55 55 55 55 55 55 55 28 55 55 55 55 55 55 55 29 55 55 55 55 55 55 55 2a 55 55 55 55 55 55 552b 55 55 55 55 55 55 55 2c 55 55 55 55 55 55 552d 55 55 55 55 55 55 55 2e 55 55 55 55 55 55 552f 55 55 55 55 55 55 55 30 55 55 55 55 55 55 5531 55 55 55 55 55 55 55 32 55 55 55 55 55 55 5533 55 55 55 55 55 55 55 34 55 55 55 55 55 55 5535 55 55 55 55 55 55 55 36 55 55 55 55 55 55 5537 55 55 55 55 55 55 55 38 55 55 55 55 55 55 5539 55 55 55 55 55 55 55 3a 55 55 55 55 55 55 553b 55 55 55 55 55 55 55 3c 55 55 55 55 55 55 553d 55 55 55 55 55 55 55 3e 55 55 55 55 55 55 553f 55 55 55 55 55 55 55 40 55 55 55 55 55 55 5541 55 55 55 55 55 55 55 42 55 55 55 55 55 55 5543 55 55 55 55 55 55 55 44 55 55 55 55 55 55 5545 55 aa[00:00:00.659,000] littlefs: /lfs アンマウント /lfs アンマウント: 0 しかし、DCache を有効にしたまま、フラッシュの変更 (書き込みと消去、ドライバレベルではなくサンプルレベル) のたびに "sys_cache_data_flush_and_invd_all()" を使用して DCache をフラッシュおよび無効化し、割り込みを "irq_lock()" でロックしても、やはり動作しません。 DCacheを無効にすることは一時的な回避策としては有効ですが、本番システムには理想的ではありません。動作させるために何か見落としている点があるのでしょうか? MCUXpresso SDKに付属しているフラッシュメモリにアクセスするサンプルは正常に動作するため、おそらくZephyrまたはその設定に問題があると考えられます。 フラッシュにアクセスする他のZephyrサンプルでも同様の挙動が見られ、DCacheを無効にした場合のみ安定したアクセスが可能になりますが、それらについては徹底的なテストは行っていません。 技術情報: ボード:NXP MIMXRT1180-EVK(CM33コア)をマイクロUSB経由でWindows PCからパススルーしてUbuntu VMに接続 OS: Zephyr v4.3.0-6239-g28cd602a81ea IDE: Ubuntu上のVS Code用MCUXpresso 26.3.72(Zephyr開発者ソフトウェアキット4.3付き) プロジェクトKconfig: ネタバレ (ハイライトして読む) # # 著作権 (c) 2019 Peter Bigot Consulting, LLC # # SPDX-License-Identifier: Apache-2.0 # # オプションでファイルシステムの再作成を強制する CONFIG_APP_WIPE_STORAGE=y CONFIG_DEBUG=y CONFIG_NO_OPTIMIZATIONS=y CONFIG_LOG=y CONFIG_PRINTK=y CONFIG_SHELL=y CONFIG_LOG_DEFAULT_LEVEL=3 CONFIG_LOG_BACKEND_UART=y CONFIG_LOG_MODE_IMMEDIATE=y CONFIG_UART_CONSOLE=y CONFIG_FILE_SYSTEM=y CONFIG_FILE_SYSTEM_LITTLEFS=y CONFIG_MAIN_STACK_SIZE=4096 CONFIG_FLASH=y CONFIG_FLASH_MAP=y # フラッシュメモリを確実に動作させるために必要な回避策 CONFIG_DCACHE=n ## Copyright (c) 2019 Peter Bigot Consulting, LLC## SPDX-License-Identifier: Apache-2.0##オプションでファイルシステムの再作成を強制します CONFIG_APP_WIPE_STORAGE=yCONFIG_DEBUG=yCONFIG_NO_OPTIMIZATIONS=yCONFIG_LOG=yCONFIG_PRINTK=yCONFIG_SHELL=yCONFIG_LOG_DEFAULT_LEVEL=3CONFIG_LOG_BACKEND_UART=yCONFIG_LOG_MODE_IMMEDIATE=yCONFIG_UART_CONSOLE=yCONFIG_FILE_SYSTEM=yCONFIG_FILE_SYSTEM_LITTLEFS=yCONFIG_MAIN_STACK_SIZE=4096CONFIG_FLASH=yCONFIG_FLASH_MAP=y# フラッシュを確実に動作させるために必要な回避策CONFIG_DCACHE=n どんなご協力でもありがたいです。 よろしくお願いします、 ジェイソン Re: MIMXRT1180-EVK LittleFS sample fails on external flash unless DCache is disabled こんにちは、エドウィンさん。 この問題解決にご協力いただきありがとうございます。しかし、ご提案いただいた解決策がよく理解できません。同じ例はFreeRTOSでも動作し、LWIPスタックやミドルウェアは一切関与していません。Zephyrでは動作せず、FreeRTOSでは動作する、単純なLittleFSフラッシュの読み書きの例です。 重要なバッファデータはキャッシュ不可能なメモリに格納する必要があることは理解していますが、Zephyrが提供するもの以外に、そのようなサブシステムやソフトウェアは存在しません。つまり、Zephyrドライバまたはサブシステム内で問題の原因となっている可能性のあるバッファを特定し、それらをキャッシュ不可能なメモリに移動させることを提案しているのですか? どのバッファーがよくある原因なのか、ご説明いただき、ご経験を共有していただけると幸いです。 よろしくお願いいたします トーマス Re: MIMXRT1180-EVK LittleFS sample fails on external flash unless DCache is disabled こんにちは、 @JasonPD さん。 この問題の原因は間違いなくキャッシュ関連であり、具体的には、以下の記事で説明されている内容です。 「i.MXRT でキャッシュされていないメモリを使用する」 前述のとおり、この問題はLwIPのようなミドルウェアを使用している場合に最も顕著に現れ、Dキャッシュを完全に無効にするのではなく、重要なデータをキャッシュ不可能なメモリ領域に配置することで解決できます。 問題の本質をより深く理解するために、その投稿と参照されているアプリケーションノート( i.MXRT L1キャッシュの使用)を確認し、記事の推奨事項に従ってLwIPミドルウェアが正しく機能するようにしてください。 BR、 エドウィン。 Re: MIMXRT1180-EVK LittleFS sample fails on external flash unless DCache is disabled さらに調べて、フラッシュドライバ「flash_mcux_flexspi_nor.c」を見てみました。その中に、書き込みと消去後に現金が無効化される仕組みが定義ガードによって保護されているのを見つけました。 #ifdef CONFIG_HAS_MCUX_CACHE 現在当社が独占的に使用しているCM33の場合、KConfファイルには次のように記載されています。 config SOC_MIMXRT1189_CM33 HAS_MCUX_XCACHE を選択してください CM7の場合は次のようになります。 config SOC_MIMXRT1189_CM7 HAS_MCUX_CACHE を選択します。 フラッシュドライバの定義ガードを次のように調整しました。 #if defined(CONFIG_HAS_MCUX_CACHE) || defined(CONFIG_HAS_MCUX_XCACHE) この変更により、フラッシュメモリへの書き込みと消去がエラーなく行えるようになりました。XIPとDCacheを再度有効にし、すべてのIRQ無効化を解除しました。今のところはうまくいっているようです。 NXPの視点から見て、この解決策は理にかなっているかどうか、ご意見をいただけますか?フラッシュメモリにアクセスする際、依然としてIRQを無効にする必要がありますか? よろしくお願いいたします トーマス
記事全体を表示
由于 高效密码学标准\\(SEC\\)/CAAM 未初始化,BL2 中的安全启动失败 安全启动在 BL2 中失败看起来是因为 高效密码学标准(SEC)/CAAM 未初始化。在仔细研究代码时,似乎没有直接调用 sec_init,但看起来配置函数是在它之前被调用的,因此全局变量无法获得 高效密码学标准(SEC) 区块地址的定义常量。即 NXP_CAAM_ADDR 值。当我对这个值进行硬编码时,我可以让它稍微进一点,但随后我出现了无法刷新/重置任务铃声的错误。 QorIQ LS1设备 Re: Secure boot fails in BL2 because SEC/CAAM not initialized 你好 BL2中的这种安全启动失败是TF-A(可信固件-A)初始化流程中典型的 " chicken and egg " 问题,专门针对恩智浦Layerscape或i.MX平台。 当你对 NXP_CAAM_ADDR 进行硬编码并克服地址错误但遇到 Job Ring 刷新/RESET 错误时,这通常意味着 CAAM 硬件块要么没有时钟,要么处于过渡状态,要么被安全违规阻止。   1.初始化序列 sec_init 没有在配置函数之前被调用的原因,很可能是 bl2_main.c 中的顺序造成的。或特定平台的 plat_bl2_el3_setup.c 。 修复:确保在 bl2_el3_early_platform_setup 内调用 plat_ls_sec_init() (或与 SoC 类似的函数)。 全局变量问题:如果 NXP_CAAM_ADDR 没有弹出,请检查平台的 plat_get_caam_address() 函数是否返回 0,或者 BL2 转换表中的数据段是否没有正确映射。   2.为什么工作环冲洗失败 如果代码试图刷新作业环却失败了,请考虑以下三个罪魁祸首: 安全违规(最有可能):如果 SoC 处于 " Closed " 模式(已熔丝),CAAM 可能在从 bootROM 过渡到 BL2 的过程中触发了安全违规。网络安全违规会使 CAAM 处于 " Halted " 状态,在该状态下,在违规行为被清除之前,无法重置或使用工作戒指。 缺少时钟/功率:如果在 BL2 期间未在 DCFG(设备配置)或 PCC(外设时钟控制)中明确启用 高效密码学标准(SEC) 模块时钟门,则寄存器将可访问(如果幸运的话),但内部逻辑(如 Job Ring 控制器)不会响应重置命令。 主 ID (MID) 不匹配:作业环需要特定的主 ID 配置,以便 BL2(在 EL3 中运行)能够"自己的" 。如果 BootROM 将振铃分配到不同的 MID 但没有释放它们,BL2 在尝试 RESET 它们时会超时。   3.调试步骤 检查 SEC_VID(版本 ID)和 SEC_STA(状态)寄存器:在 Job Ring 重置呼叫之前阅读这些寄存器。如果状态寄存器显示网络安全违规,则需要找出触发该违规的原因(通常是前一阶段的身份验证失败)。 验证重置位:确保在切换重置位后等待足够长的时间。在某些芯片版本中,CAAM 重置所需的时间比 SDK 中提供的标准延迟环路长。 检查 TrustZone 设置:确保您正在访问的任务环在中央安全单元 (CSU) 或资源域控制器 (RDC) 中标记为 " Secure "。 此致 Re: Secure boot fails in BL2 because SEC/CAAM not initialized 开机后,但在加载 SRKH 镜像寄存器并释放 CPU 之前,如果我检查 DCFG_CCSR_DEVDISR1 寄存器,我会发现位 22 (高效密码学标准(SEC)) 设置为 1。根据有关重置的文档,该寄存器应全部为 0。在启动过程的这么早期,这个值可能在哪里设置?我需要对 pbl 命令做些什么吗?RCW 是否有误?我确实看到在低功耗安全寄存器中检测到电源故障,但我也看到配置寄存器显示应忽略/不应对低功率篡改采取行动。 Re: Secure boot fails in BL2 because SEC/CAAM not initialized 好吧,谁能帮我确认一下? 在 TF-A 驱动程序/nxp/dcfg/dcfg.c 中我找到了一个用于检查是否启用 高效密码学标准(SEC) 的计算方法。它在 SVR_SEC_MASK 和寄存器 0x1ee00a4 的值之间进行比特& ,寄存器 0x1ee00a4 是一个只读寄存器。如果我正确读取了字段,那么 16-23 位的状态是否为 ls1043 或 ls1023,是否 高效密码学标准\(SEC\) 硬件是否启用。我看到该位的值为 0x00000001。哪个会是这个芯片上禁用的高效密码学标准(SEC)封锁,对吗?我参考了完整零件号的示意图并得到了 LS1043ASN7MNLB,当我查看恩智浦的网站显示高效密码学标准(SEC)已禁用时。这是否导致了我的安全启动问题?高效密码学标准(SEC)能否启用这款芯片,还是在它离开恩智浦后就一成不变了?我们需要考虑其他芯片吗,还是可以在没有高效密码学标准(SEC)的情况下进行安全启动? Re: Secure boot fails in BL2 because SEC/CAAM not initialized 支持人工智能复制粘贴?如果我们要走这条路,就需要进一步调整代理。如果 SoC 知道自己的代码库,那么它就应该知道 NXP_CAAM_ADDR 是在头文件中静态定义的,而不是先填充的。
記事全体を表示
清除 GPIO ISR 大家好, 我们尝试按照 IMXRT1176 参考手册从 CM7 内核获取 GPIO_DISP_B2_00 引脚的访问权限。 gpio_pin_config_t config = { kGPIO_DigitalInput, 0, kGPIO_IntRisingEdge, }; SETUP(IOMUXC_GPIO_DISP_B2_00_GPIO_MUX5_IO01, 1, AD_PULL_UP + AD_SLEW_SLOW); GPIO_PinInit(GPIO5, 1,&config ); 这发生在启动过程中的引脚复用器中。在应用程序的某处,我们会编写代码来初始化该 gpio 的中断: GPIO_PortClearInterruptFlags(GPIO5, 0xFFFFFFFF); GPIO_PortEnableInterrupts(GPIO5, 1<< 1); NVIC_SetPriority(GPIO5_Combined_0_15_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY); EnableIRQ(GPIO5_Combined_0_15_IRQn); volatile uint32_t a = GPIO_PortGetInterruptFlags(GPIO5); PRINTF (" %lu\ r\n ", a); 此代码打印: 4 294 901 757 这是 0x FFFE FFFD — >--> 0b1111 1111 1111 1110 1111 1111 1111 1101 如你所见,引脚 1 位看起来像 0。 因此,我们可以假设 RESET 对其产生了影响。 但是我不明白的是,为什么其他位设置为 1,为什么第 17 位设置为 0? 参考手册指出 1402/6259: ```当在 GPIO 输入上检测到活动状态(由 相应的 ICR 位确定)并正在等待服务时,将钳位该寄存器的第 n 位 中断状态(高电平有效)。寄存器 的值与 IMR 寄存器的值无关。 检测到激活状态后,相应位将保持设置状态,直至软件清除。 通过将1写入相应的位位置 ```来清除状态标志, 因此我假设所有值都应为0作为默认RESET状态。其他 GPIO 也遵循类似的模式,在 ISR 寄存器中设置了许多位。 谁能告诉我,我在这里误解了什么?感谢您的帮助 🙂 致以最崇高的敬意, Jakub Re: Clearing GPIO ISR 你好@jslota13245、 误解在于,GPIO ISR RESET 值仅描述 RESET 后立即的寄存器状态。它不能保证稍后在启动期间会读取什么软件。ISR 是一个锁存状态寄存器:一旦检测到配置的条件,该位将保持设置状态,直到软件将其清除,这与 IMR 无关。要确定当前启用了哪些中断源,我们可以使用GPIOx->ISR& GPIOx->IMR; 对于 RT1170,恩智浦还记录了勘误表 ERR050643:DISP_B2 引脚在初始上电期间可以看到短暂的内部上拉脉冲,因此在应用程序读取 ISR 之前,GPIO_DISP_B2_00 可能合法地处于待定状态。因此,启动后的非零ISR并不意味着重置失败。 致以最诚挚的问候, Gavin Re: Clearing GPIO ISR 亲爱的@Gavin_Jia, ,非常感谢你的详细答复。 1) 确认一下,您可能已经注意到了,在我之前发送的示例代码中,我们明确向状态寄存器写入 0xffffff ffff 以清除它,我们做了一些无操作循环,操作后我们几乎立即尝试读取它,并在 GPIO->ISR 中得到非零值。这意味着在清零/读取调用之间,硬件已在大部分引脚上注册了中断条件,这很难让人相信,因为我们根本没有使用它们。这发生在 GPIO 初始化的早期启动之后。So what you're suggesting is there is some hardware noise that may cause this behaviour when we write 0xffffffff to GPIO->ISR? 2) By the way, reading forums i found this thread: https://community.nxp.com/t5/i-MX-RT-Crossover-MCUs/GPIO-ISR-and-Clearing-ISR/m-p/1059441 答案如下: ''在您的情况下,您需要注意未配置为中断操作的位的中断状态将读作待处理。因此,你不能像 那样只检查中断状态,我想知道这是否是真的,因为这与观察到的行为有些吻合。但是我在参考手册中找不到任何关于它的信息。 再次感谢您的支持! 最美好的祝愿, Jakub
記事全体を表示
デジタル信号の電圧変換ってどうやればいいの? (日本語ブログ) 0. 目次 0. 目次 1. 電圧レベル・トランスレータって? 2. デジタル信号 2.1 様々なデジタル信号 2.2 CMOSとTTL:単純な電圧のHIGHとLOWによる論理レベルの信号 2.3 入出力電圧の規定:VOH / VOL と VIH / VIL 2.3.1 出力電圧の規定:VOHとVOL 2.3.2 入力電圧の規定:VIHとVIL 2.3.3 VOH / VOL と VIH / VIL の関係 3. 基本的な電圧レベル変換の方法:片方向信号の変換 3.1 チップの電源電圧が違っても変換の必要がない例 コラム:TTLのVIH(min) = 2.0V,VIL(max) = 0.8Vはどうやって決まっている? 3.2 変換が必要な例 3.2.1 オープンドレイン出力による変換 3.2.2 標準ロジック(汎用ロジック)チップを用いた変換 4. 自動方向切り替えが必要な双方向信号の変換 4.1 単体MOSトランジスタによる双方向変換 4.2 専用品による双方向変換 4.2.1 I²C信号電圧変換チップ 4.2.2 高速化を図った双方向オープンドレイン信号電圧変換チップ 4.2.3 双方向プッシュプル信号電圧変換チップ 4.2.4 I3C信号電圧変換チップ 4.2.5 バッファによる変換 5. まとめ 5.1 ブログ内で紹介した方式/品番の比較 6. 参考資料 1. 電圧レベル・トランスレータって? デジタル回路同士をつなぐとき,単純に信号線を直結すればいい… ということはなくて,「論理レベルの電圧」が合わないと,動作しなかったり,不安定になったり,最悪の場合チップを壊してしまうことがあります. そんなときに便利に使えるのが電圧レベル・トランスレータ(Voltage Level Translator.電圧レベル・シフタとも呼ぶ)です. 電圧レベル・トランスレータは,異なる電源電圧のデジタル回路間で信号をやり取りできるようにする回路です. 例えば,次のようなケースで必要になります. 3.3V マイコン ↔︎ 5V センサ の接続 1.8V FPGA ↔︎ 3.3V 周辺デバイス の接続 図1:信号電圧の違い   このブログでは,デジタル回路で使われる論理回路の種類(*TTL,*LVTTL,*CMOS)の電圧レベルの違いから,それを判断する上で重要なV OH /V OL /V IH /V IL の意味について解説します.さらに様々な変換の方法の中から,どのような電圧レベル・トランスレータを選べばよいかを解説します. さらにこのブログでは信号の方向を自動で検出して変換を行う電圧レベル・トランスレータの具体例を見ていきます. NXPではSDカード/SIMカード向けや,*GTL↔︎TTLレベル変換のような特定用途向け電圧レベル・トランスレータもラインナップしていますが,このブログは汎用またはシリアル・バス用途をターゲットにした製品の解説となります. *TTL(Transistor-Transistor Logic) *LVTTL(Low Voltage Transistor-Transistor Logic) *CMOS(Complementary Metal-Oxide-Semiconductor) *GTL(Gunning Transceiver Logic) 2. デジタル信号   2.1 様々なデジタル信号 いわゆる「デジタル信号」は論理レベルの1と0を電気的に表現したものです.この論理レベルの1と0を扱う回路設計方法には歴史的に様々なものがあります.論理レベルを単純な電圧のHIGHとLOWで表現するものや,電圧の差を利用してHIGH/LOWを表現するものなど. 単純なHIGH/LOWを5V/0Vで表すTTL.さらにそのTTLを低電圧化し3.3V/0Vで表すLVTTLなどバイポーラ・トランジスタ回路を基準に電圧レベルが決められたもの. 同様にバイポーラ・トランジスタを使いながらも負電源を使い低振幅で差動で動作論理レベルを実装し,高速化が図られたECL.基準電圧を設けて低振幅のシングルエンド信号でHIGH/LOWを伝達するGTLなど... また単純なHIGH/LOWでの表現でも低消費電力化を目的に開発された4000シリーズと呼ばれるCMOS汎用ロジックでは,HIGHレベルとして3V〜18Vを使うことができました. https://en.wikipedia.org/wiki/Logic_family このブログでは,上記のような様々な論理レベルの中でも,単純なHIGHとLOWの電圧で論理を表現するTTL(LVTTL)とCMOSの電圧レベルの扱いについて解説します. その他の信号変換には専用チップが用いられるため,ここでは扱いません. このほか近年では半導体技術の微細化・高速化・低消費電力化が進むとともに,電源に使われる電圧は低くなってきています.このため信号電圧差を橋渡しする電圧レベル・トランスレータは特に重要になってきています. 図2:信号波形 - 電圧の高低(HIGH/LOW)で論理レベルを表す   2.2 CMOSとTTL:単純な電圧のHIGHとLOWによる論理レベルの信号 デジタル回路に使われる単純な電圧のHIGHとLOWによる論理レベルの信号には,HIGHを電源電圧で,LOWを0Vとするものが一般的です.電源電圧が異なってもHIGH/LOWの電圧レベルが同じであれば,そのまま信号をやり取りすることができます. たとえばTTL(LVTTL)は入力される信号が2.0V以上であればHIGH,0.8V以下であればLOWと解釈します.このような取り決めがあるため,TTL信号であれば互いに電源電圧が異なってもHIGH/LOWの電圧レベルは変わりません. いっぽう,CMOSは電源電圧の半分の電圧を基準にしてHIGH/LOWを定義します.このためCMOSは電源電圧が異なるとHIGH/LOWの電圧レベルも変わります. 図3:入力信号電圧の規定   2.3 入出力電圧の規定:V OH  / V OL  と V IH  / V IL デジタル回路ではHIGHとLOWとして出力される電圧と,入力される信号をHIGHとLOWに判断する電圧が規定されています.これらは使用する各チップの仕様で規定されているため,データシートで確認する必要があります. V OH  : HIGHレベル出力電圧 (HIGH-level output voltage) V OL  : LOWレベル出力電圧 (LOW-level output voltage) V IH  : HIGHレベル入力電圧 (HIGH-level input voltage) V IL  : LOWレベル入力電圧 (LOW-level input voltage) 2.3.1 出力電圧の規定:V OH とV OL 出力ではHIGH/LOWを出力する際の電流を考えておかねばなりません.電流は負荷により増減します. HIGH出力での最大流出電流時に保証できる電圧をV OH (min),LOW出力での最大流入電流時に保証できる電圧をV OL (max)と呼びます. V OH (min)は回路出力段の上側のトランジスタがONになったときに出力される電圧です.このトランジスタには「ON抵抗」と呼ばれる抵抗分があります. トランジスタから流れ出る電流が大きい場合,"トランジスタの抵抗分 x そこに流れる電流"で電圧が発生.すると出力はその電圧分だけ電源電圧から下がってしまいV OH が低くなってしまいます.このため,あらかじめ想定される最大流出電流のときに保証できる最小の電圧がV OH (min)となります. 図4:デジタル信号出力回路(プッシュプル)   図5:HIGH出力電圧は負荷によって変化する   V OL はこの逆となります.回路出力段の下側のトランジスタがONになったとき,流れ込む電流が大きいと,上記と同様にトランジスタのON抵抗によって発生する電圧によって,出力は0Vより上がってしまいます.これを考慮し,あらかじめ想定される最大流入電流のときに保証できる最大の電圧がV OL (max)となります. 図6:LOW出力電圧も負荷によって変化する   2.3.2 入力電圧の規定:V IH とV IL 入力にはHIGHとLOWを判断するための電圧レベルがあります.V IH (min)とV IL (max)です.電圧がV IH (min)以上であればHIGHと判断され,V IL (max)以下であればLOWと判断されます. CMOS入力では電源電圧の1/2がHIGHとLOWの基準となりますが,これをそのままV IH (min)とV IL (max)とはしていません.これはチップごとのバラツキなどによって閾値が上下するためです.また,遅く立ち上がる信号に乗ったノイズなどによるグリッチが出力に現れることを軽減するため,入力にはヒステリシスを持たせることが一般的です.このような理由によりV IH (min)とV IL (max)はある程度の電圧差を設けて規定されます. 2.3.3 V OH  / V OL  と V IH  / V IL  の関係 正常な信号のやり取りを行うには,出力と入力の関係は下式を満たす必要があります. HIGHレベル: V OH (min) > V IH (min) LOWレベル: V OL (max) < V IL (max) この関係が守られていれば,出力側の回路は,次の入力側の回路に対してHIGH/LOWを正しく伝えることができます.さらにこの互いの電圧差である「V OH (min) - V IH (min)」や「V IL (max) - V OL (max)」は「ノイズ・マージン」となり,ノイズ耐性を高く保つための目安になります. 図7:V OH (min) / V OL (max) と V IH (min) / V IL (max) 3. 基本的な電圧レベル変換の方法:片方向信号の変換   3.1 チップの電源電圧が違っても変換の必要がない例 『「V OH (min) > V IH (min)」かつ「V OL (max) < V IL (max)」』の関係が成り立つ場合には基本的には電圧レベル変換は必要ありません.たとえばTTLとLVTTLはそれぞれのチップに使われる電源電圧は違うものの,入出力電圧の規定は同一です. TTL(5V)とLVTTL(3.3V)ではどちらも,V OH (min)は2.4V,V OL (max)は0.4Vです.V IH (min)/V IL (max)も,どちらも2.0V/0.8Vなので問題なく互いに接続できます. ただし出力電圧が入力側チップの電源電圧よりも高い場合には注意が必要です.出力側が5V,入力側が3.3V電源を使うチップである場合には,入力側は「5Vトレラント入力」に対応していなければなりません. 5Vトレラント入力とは,5VのHIGH信号を3.3Vの電源電圧で動作するチップの入力に接続しても問題なく動作する入力のことです.一般的なチップの入力には静電気対策のためのESD保護回路が入っていますが,このESD保護回路が次の図のような回路で構成されていると5Vを入力した際に入力から3.3Vの電源に電流が逆流してしまい,チップを破壊してしまうことがあります.このような問題を起こさないための対策が取られた入力が5Vトレラント入力です.トレラント入力にはESD保護がないわけではなく,電源電圧より高い信号が入力されても問題がないような構造を持つESD保護回路が組み込まれています. 図7のようなESD保護ダイオードは,入力側チップの電源が切られている時にも問題を引き起こします.チップごとに個別に電源のON/OFF管理を行うようなシステムの場合,入力側チップがOFFになっているにも関わらず出力側の信号が電源に回り込み,入力側チップを動作させてしまうことがあります. 図7:ESD保護ダイオード - 非トレラント入力 コラム:TTLのV IH (min) = 2.0V,V IL (max) = 0.8Vはどうやって決まっている? CMOSの入力閾値が電源電圧の中点(VCC/2)を基準にしているのに対し,TTLのV IH (min)/V IL (max)は2.0V/0.8Vという,電源電圧(5V)に対して特に綺麗な比率ではない値になっています.これには,TTLの入力段がバイポーラ・トランジスタで構成されていることが関係しています. 標準TTLロジックIC:SN7400(2入力NAND)の内部回路例 『最新汎用ロジック・デバイス規格表 1988』(CQ出版)に掲載されていたもの 標準的なTTLゲートの入力段は,多重エミッタの入力トランジスタと,その後段のフェーズスプリッタ・トランジスタが直列に重なった構造をしています.ゲートが実際に反応し始める「スイッチング・スレッショルド」は,この2段に重なったPN接合の順方向電圧で決まります.シリコンのPN接合1個あたりの順方向電圧はおよそ0.6〜0.7Vなので,2段重なると合計でおよそ1.3〜1.5V付近がTTLゲートの実質的なスイッチング・スレッショルドとなります. ただしこの約1.4Vという値はあくまで「典型値(typical)」であり,個体差や温度などのバラツキによってロットごと・条件ごとに変動します.そこでデータシート上の規定値であるV IH (min)とV IL (max)は,この約1.4Vの典型値に対して上下に十分なマージンを取り,「ここまで下がれば確実にLOWと判定できる(V IL (max)=0.8V)」「ここまで上がれば確実にHIGHと判定できる(V IH (min)=2.0V)」という,保証値として規定されています. さらにこの値は単独で決められているわけではなく,2.3.3節で説明したV OH /V OL との関係も踏まえて設計されています.標準TTLでは出力段の構成により,HIGH出力は電源電圧にはならず,少し低い(上記回路例では130Ωの抵抗,トランジスタとダイオードで発生する電圧分だけ低い)電圧になります(VOH(min)=2.4V).これとVOL(max)=0.4Vを組み合わせると, HIGH側ノイズ・マージン:V OH (min) − V IH (min) = 2.4 − 2.0 = 0.4V LOW側ノイズ・マージン:V IL (max) − V OL (max) = 0.8 − 0.4 = 0.4V のように,上下対称に0.4Vのノイズ・マージンが確保されるよう設計されています.つまりTTLの2.0V/0.8Vという「電源電圧に対して半端」に見える数字は,バイポーラ・トランジスタの接合電圧という物理的な実体と,ノイズ・マージン設計という2つの要請から導かれた,合理的な値だったということになります. SN7420(4入力NAND)の入力ピン3つをHIGH,1つに100kHzの三角波を入力(ch1)した様子 無負荷状態の出力(ch2)だがHIGHのとき4V未満の出力となっている(Vcc=5V) なお,本コラムで紹介した回路は無印(74LS00や74HC00のようにLS/HCなどの付かないもの.英語では“バニラTTL”と呼ばれることもある)標準TTLの例ですが,V IH /V IL の規定が同じ理由(入力段のバイポーラ接合特性)は74LSなど他のTTLファミリにも共通しています.   3.2 変換が必要な例   TTLやLVTTLでは電圧レベルが揃っているため上記のような接続が可能ですが,電源電圧の違うCMOSチップ同士や,CMOSとTTLチップの接続では論理レベルが合わない場合が多く発生します.前述の『「V OH (min) > V IH (min)」かつ「V OL (max) < V IL (max)」』の関係が成り立たない,またはその差が小さくなってしまい,ノイズ・マージンが取れないような状況がそれにあたります. この問題を解決するのが電圧レベル・トランスレータです. 図9:論理レベルが合わない例(1):充分なHIGH電圧が入力されない   図10:論理レベルが合わない例(2):充分なLOW電圧が入力されない     3.2.1 オープンドレイン出力による変換 電圧レベル変換チップを用いなくても,簡単に電圧レベル合わせを行う方法はあります. 信号の方向が出力側チップ→入力側チップで固定され切り替わることがないのなら.HIGH側の出力をオープンドレイン出力にすることで,入力側の電圧に合わせる方法です.オープンドレインはデジタル回路の出力段の上側のトランジスタがない構成のもので,入力側チップの電源電圧に接続されたプルアップ抵抗によってHIGHの電圧を得ます. 図11:デジタル信号出力回路(オープンドレイン)   オープンドレインは単純で安価な方法ですが,いくつかの注意点があります. まず出力側がオープンドレイン出力が可能なものである必要があります.多くのマイコンのGPIOピンなどでは設定によってこの出力が可能です. まず出力側がオープンドレイン出力が可能なものである必要があります.多くのマイコンのGPIOピンなどでは設定によってこの出力が可能です.もしオープンドレイン出力に設定できないプッシュプル出力固定など場合には,外付けのトランジスタなどを使ってオープンドレイン出力に変換する必要があります. さらにプルアップ抵抗の選択も重要です. プルアップはHIGHの電圧を得るために必要な抵抗ですが,抵抗値が小さすぎるとLOW出力時に流れる電流が大きく(負荷が大きい状態に)なり,消費電力が増える上にV OL の上昇を招いてしまいます. 逆に大きすぎると配線とピンによる容量の影響を受け,LOWからHIGHへの立ち上がりが遅くなってしまい,通信速度の低下が起こります. 3.2.2 標準ロジック(汎用ロジック)チップを用いた変換 単純な電圧レベル変換であれば標準ロジックを用いる方法もあります.たとえばNexperia社の74AVCH4T245は4ビットの双方向レベル変換を行うことができるCMOS汎用ロジックチップです. このチップでは0.8V〜3.6Vの信号を変換することができ,信号の方向をDIRピンによって切り替えることもできます.信号速度は変換を行う電圧にも依存しますが,100M〜380Mbps程度に対応可能です. 図12:標準ロジックの例 - 74AVCH4T245 このチップを用いると高速な信号の双方向電圧変換が可能ですが,方向の制御は外部からの信号によって行わなければなりません.このような制御はパラレル・バスのREAD/WRITEのような信号によって可能ですが,プロトコルによって通信方向が切り替わるシリアル・バスのような通信には適用が困難です. 図13:標準ロジックの例.信号の方向を外部から指定しなくてはならない 4. 自動方向切り替えが必要な双方向信号の変換 これまでに紹介した"オープンドレイン出力"や"標準ロジックチップを用いた電圧変換方法"では,主に一方向のみの変換を行うもの,あるいは外部信号による方向の切り替えが必要なものでした. I²C,I3Cのような信号の方向がダイナミックに変化するような通信には,方向が自動で検出して切り替わる「双方向の電圧レベル変換」が必要です.このような信号の方向を外部から制御するのは難しく,前述のようなバッファ・チップで実現するのは困難です. さらにI²Cはオープンドレイン信号であるため,オープンドレインの標準ロジック・バッファを互いに違う向きに接続するようなことができません.図14はその例です.オープンドレイン・バッファを互いに反対方向に接続しています.バッファの両側がHIGHの時は問題ありませんが,どちらかが一旦LOWになると,バッファは互いの入力をLOWに引っ張ったままとなり,HIGHに戻すことができなくなります. 図14:通常のオープンドレイン・バッファでは双方向通信を自動切替できない   4.1 単体MOSトランジスタによる双方向変換   これまでI²Cの信号電圧変換には,単純な回路が用いられることがありました.その最も簡単なMOSトランジスタを使った方法をその例として挙げます. 図15:MOSトランジスタを使った変換の例   図15はI²Cの仕様書version2.1(2000年)から引用したもので,3.3Vと5Vの信号を2本の信号にそれぞれ1個のMOSトランジスタ(TR1, TR2)を用いる例です.このような単純なトランジスタ単体での変換例は,後述する問題点があるため現在のI²Cの仕様書からは削除されていますが,原理を理解するために紹介します. SDAとSCLと呼ばれるI²Cの信号線は,どちらもオープンドレイン出力の双方向信号となっています.3.3V側と5V側にそれぞれプルアップ抵抗が接続されています. この回路では3.3V側,5V側の信号がHIGHである場合,このトランジスタのゲート(g)とソース(s)間は同電位となるため,ソース(s)とドレイン(d)OFF状態となって互いの接続が切れた状態に置かれます.この状態で3.3VがLOWに変化すると,3.3V側のトランジスタ(のsとdの間)がONになり,5V側の信号もLOWになります. 3.3V側がHIGHで5V側がLOWに変化した場合には,まず3.3V側から5V側への寄生ダイオード(ボディ・ダイオード)がONになります.ダイオードがONになるとソース(s)の電圧が降下.その結果トランジスタがONになり,3.3V側の信号もLOWになります. このようにトランジスタをスイッチとして使う非常に単純な仕組みで電圧レベル変換ができるのですが,ここには問題もあります.トランジスタのバラツキが信号変換の閾値に影響すること.さらに今日ではより低い信号電圧を扱うことが増えてきており,たとえば信号電圧が1V程度では,このような回路では十分なゲート(g)とソース(s)間電圧(Vgs)が得られないため動作させることができません. 追記:図15と同じ回路は,NXPから半導体ディスクリート/ロジック製品事業が分社化されて誕生したNexperia社のアプリケーションノートAN10441「Level shifting techniques in I²C-bus design」として今も公開されています.I²C仕様書とは別に2007年に初版(Rev.01)のアプリケーションノートが発行され,2020年にNexperiaブランドへ改訂(Rev.2)されています. 4.2 専用品による双方向変換   「電圧レベル・トランスレータ専用IC」を用いることで,I²C, I3Cのような双方向通信を行うバスの電圧レベル変換を容易に行うことができます. 4.2.1 I²C信号電圧変換チップ PCA9306,NVT20xxシリーズ(NVT2001/02, NVT2003/06, NVT2008/10)は双方向信号の変換に特化した電圧レベル・トランスレータです.これらのチップでは複数の信号線(複数ビットの信号線)をまとめて扱うことができます.これらはI²C信号の電圧変換チップとされていますが,信号の仕様が合えば他の目的(SPIやその他のプッシュプル信号など)にも使うことができます. PCA9306,NVT20xxシリーズは同じ内部構造を持ち,プルアップ抵抗は,変換する電圧差が1V以上であれば電圧の高い側だけに接続すれば良いようになっています. 図16はその内部構造と外部チップの接続を示したものです(アプリケーションノートAN11127:「Bidirectional voltage level translators NVT20xx and PCA9306」のFig.2から抜粋).このチップ内部には信号線数(ビット数)+1個のMOSトランジスタが内蔵されています.各トランジスタはソースとドレインが可換の構造となっています. 信号を伝達するための経路のトランジスタはパス・トランジスタと呼ばれ,残りの1個はリファレンス・トランジスタと呼ばれます. 図16:NVT20xx(PCA9306) - チップ動作の解説図   回路を見てみると,リファレンス・トランジスタのゲートとドレイン間はショートされており,200kΩの抵抗を介して高い電圧側の電源に接続されています.リファレンス・トランジスタの残りの端子:ソースは低電圧側の電源に接続されています.このような接続により,リファレンス・トランジスタは1個のダイオードとなっており,このゲート電圧は低電圧側の電源よりもダイオード1個分高い電圧となります. 残りのパス・トランジスタはドレイン側が高い電圧側の信号線と1kΩのプルアップ抵抗に,ソース側は低い電圧側の信号線,さらにゲートはリファレンス・トランジスタのゲートに接続されています.パス・トランジスタの高い側,低い側の信号がどちらもHIGHになっている時,高い側は1kΩによってプルアップされた電圧となります. パス・トランジスタはいわゆる「ソースフォロワ」と呼ばれる回路を構成しています.低い電圧側の端子(ソース端子)は,ゲートに印加されている電圧よりトランジスタをONにするために必要なVgs分だけ低い電圧が現れます.つまり低電圧側の電源と同じ電圧となります.トランジスタはONでもOFFでもない半分ONの状態(線形領域での動作)になっています. この状態で,高または低のどちら側かの信号がLOWになると,ゲートと信号端子の電圧差によりトランジスタがON(完全にONとなった飽和領域での動作)になり,反対側の端子もLOWになります. このシリーズで扱える信号速度は,プルアップと信号線の容量の影響を受けます.データシートでは,PCA9306は2MHzまで.NVT20xxシリーズでは192Ωのプルアップ抵抗を使用し,容量50pFの条件で最大33MHzまでの信号速度に対応可能とされています.1MHz程度の信号であれば,プルアップ抵抗や容量をあまり気にしなくても(通常I²Cで使うような範囲内を想定)で問題なく動作します.しかしこのチップをプッシュプルのより高速な信号を扱う場合には特製の把握と慎重な部品選択が必要になります. このタイプの電圧レベル・トランスレータ動作の詳細は,「PCA9306の中身と動作」の記事で紹介されています. 4.2.2 高速化を図った双方向オープンドレイン信号電圧変換チップ 高速化を図った双方向オープンドレイン信号変換チップとして,NTS030xシリーズ(NTS0302JK, NTS0304E)を紹介します. このチップは2ビットまたは4ビットの双方向信号変換を行うことができ,オープンドレイン信号であれば2Mbps(1MHz),プッシュプル信号であれば20Mbps(10MHz)の信号に対応可能です.   図17:NTS030x - チップ内部ブロック図   図17はNTS030xの信号1ビット分の内部構造です. 図ではT3のトランジスタがパス・トランジスタとなっており,ゲート端子バイアス電圧がかけられているので,AとBと書かれた信号のどちらかがLOWとなった時にONとなります. AとBの両方がHIGHの時はT3がOFFになり,AとBはそれぞれの電源に比較的大きいプルアップ抵抗(10kΩ)で接続されているのでそれぞれの電圧となります. このチップにはT3のほかにT1とT2が存在しています.このT1とT2は「エッジレート・アクセラレータ」と呼ぶ機能のために使われます.このうちの片方,T1に注目しこの動作を解説します. T1はA側に置かれ,ソース端子はA信号に,ドレイン端子はA側電源に接続されています.ゲート端子はこれを制御する「ONE-SHOT AND SLEW RATE CONTROL」と書かれたブロックに接続されています. 「ONE-SHOT AND SLEW RATE CONTROL」ブロックは反対側のB信号に接続されていて,B側の信号のLOWからHIGHへの変化を検出.これを検出した時に一時的にT1をONにして,プルアップの10kΩ抵抗をバイパスして電流を流す事により,A側の信号のHIGHへの変化を加速します.このように信号の立ち上がりを速くすることで,より高速な信号を扱うことができるようにしています. ちなみに,このT1をONにする際のスルーレートは制御されていて,急な電流増加によるリンギング発生を抑えることも考慮されています. もういっぽうのT2はこの同じ仕組みが逆方向に作られており,B側信号にも適用されるようになっています. このNTSシリーズにはもう一つの使いやすい点があります. ここまで説明したMOSトランジスタ単体やPCA9306/NVT20xxの場合,どちらかの電源がOFFになった場合,他方の信号をLOWにしてしまうという問題がありました.NTS030xではこの問題を解決するために,両方の電源がONになっていない場合は,互いに影響が出ないように信号ピンをハイ・インピーダンス状態とするよう動作します.このような機能を使うことにより,システムの電源を部分的にON/OFF制御するような使い方が可能になります. NTS030xシリーズと同等品で,より高速の信号に対応するためスルーレート制御機能の無いNTS010xシリーズ(NTS0102, NTS0104)も用意されています. なお,NTS0304Eには,すぐに簡単な動作検証ができるように評価基板:NTS0304EUK-ARDが用意されています.NTS0304EUK-ARD基板の概要と動かし方はこちらの動画「NTS0304EUK-ARDの動かし方」をご参考ください. 4.2.3 双方向プッシュプル信号電圧変換チップ さらにこのNTS030xシリーズをプッシュプル信号だけで使う場合のより高速なオプションとしてNTB010xシリーズ(NTB0102, NTB0104)があります. HIGHまたはLOWで安定した状態では4kΩを通して信号を駆動.NTS030xシリーズ同様のワンショット機能をHIGHとLOW側の両側に持たせ,いずれかの端子で信号の変化があった場合にこれを用いて,反対側信号を変化させる機構を持っています. このような機構により,信号方向の自動検出機能を持ちながら70〜80Mbpsの速度の信号電圧変換が可能です.   図17:NTB010x - チップ内部ブロック図 4.2.4 I3C信号電圧変換チップ I3Cはオープンドレインとプッシュプルを切り替えながら通信を行う仕様を持ち,オープンドレインではI²Cと互換〜4MHzの周波数.プッシュプル時は12.5MHzのクロックが使われます.信号の電圧は通常1V〜3.3Vの範囲で使われるため,電圧差がある場合には,信号仕様に合わせた動作をする電圧レベル・トランスレータが必要になります. 図18はP3A1604の1ビット分の内部ブロック図です.このチップでは図の通り,LOW→HIGHだけでなくHIGH→LOWの変化を加速する仕組みとON/OFFの切り替えができるプルアップ抵抗が内蔵されています.   図18:P3A1604 - チップ内部ブロック図 P3A1604は4ビット用のI3C電圧レベル・トランスレータ.この他にも2ビット用のP3A9606も用意されています.   4.2.5 バッファによる変換 もう一つの双方向信号の変換方法として,専用品のバッファを使う方法があります. バッファの本来の目的は,駆動能力の増強や接続している信号線の容量の分離などですが,電圧の変換に対応した製品も存在します. 双方向のオープンドレイン信号を相互にバッファするには,このブログの中で説明したように単純なバッファでは実現できません.そのため双方向オープンドレイン信号用として様々な工夫がされたバッファ製品が用意されています. バッファについての詳細はまた次の機会に解説する予定です. 5. まとめ 電圧レベル・トランスレータは,異なる電源電圧を持つデジタル回路間で安全かつ確実に信号をやり取りするために不可欠な部品です.TTLやLVTTL,CMOSなど論理レベルの規定や,VOH/VOL/VIH/VILの関係を理解することで,適切な接続や変換方法を選択できます. 片方向の変換にはオープンドレイン出力や標準ロジックIC,双方向の変換にはMOSトランジスタや専用IC(PCA9306/NVT/NTS/NTB/P3Aシリーズなど)が利用できます. 特にI²CやI3Cなど双方向通信が必要なバスでは,信号方向の自動検出機能を持つ電圧レベル・トランスレータが有効です. また,近年の半導体技術の進化により,低電圧化・高速化が進み,より厳密な電圧レベル管理が求められるようになっています.電圧レベル変換の方法や選択肢は多岐にわたりますが,信号仕様や速度,システムの電源管理など用途に応じて最適な方法・部品を選ぶことが重要です. 5.1 ブログ内で紹介した方式/品番の比較 方式/品番 用途 ビット数 方向切替 オープンドレイン対応 低電圧側[V] 高電圧側[V] ビットレート[bps] オープンドレイン出力での変換 汎用 1 片方向 - - - - 標準ロジック(例:74AVCH4T245) 汎用(パラレルバスなど) 4 + 4 外部制御 非対応 0.8 ~ 3.6 0.8 ~ 3.6 100M ~ 380M 単体MOSトランジスタによる双方向変換 I²C, 汎用 1 自動 対応 トランジスタの仕様による ~ 1M PCA9306 I²C, 汎用 2 自動 対応 1.0 ~ 3.6 1.8 ~ 5.5 4M (2MHz.条件による) NVT2001 I²C, 汎用 1 自動 対応 1.0 ~ 3.6 1.8 ~ 5.5 4M(2MHz@オープンドレイン), 66M(33MHz@最適化条件による) NVT2002 I²C, 汎用 2 自動 対応 1.0 ~ 3.6 1.8 ~ 5.5 4M(2MHz@オープンドレイン), 66M(33MHz@最適化条件による) NVT2003 I²C, 汎用 3 自動 対応 1.0 ~ 3.6 1.8 ~ 5.5 4M(2MHz@オープンドレイン), 66M(33MHz@最適化条件による) NVT2006 I²C, 汎用 6 自動 対応 1.0 ~ 3.6 1.8 ~ 5.5 4M(2MHz@オープンドレイン), 66M(33MHz@最適化条件による) NVT2008 I²C, 汎用 8 自動 対応 1.0 ~ 3.6 1.8 ~ 5.5 4M(2MHz@オープンドレイン), 66M(33MHz@最適化条件による) NVT2010 I²C, 汎用 10 自動 対応 1.0 ~ 3.6 1.8 ~ 5.5 4M(2MHz@オープンドレイン), 66M(33MHz@最適化条件による) NTS0302JK I²C, SPI, 汎用 2 自動 対応 0.95 ~ 3.6 1.65 ~ 5.5 2M @オープンドレイン, 20M @プッシュプル NTS0304E I²C, SPI, 汎用 4 自動 対応 0.95 ~ 3.6 1.65 ~ 5.5 2M @オープンドレイン, 20M @プッシュプル NTS0102 I²C, SPI, 汎用 2 自動 対応 1.65 ~ 3.6 2.3 ~ 5.5 50M @プッシュプル NTS0104 I²C, SPI, 汎用 4 自動 対応 1.65 ~ 3.6 2.3 ~ 5.5 50M @プッシュプル NTB0102 SPI, 汎用 2 自動 非対応 1.2 ~ 3.6 1.65 ~ 5.5 70M ~ 80M NTB0104 SPI, 汎用 4 自動 非対応 1.2 ~ 3.6 1.65 ~ 5.5 70M ~ 80M P3A9606 I3C, I²C, SPI, 汎用 2 自動 対応 0.72 ~ 1.98 0.72 ~ 1.98 (12.5MHz) P3A1604 I3C, I²C, SPI, 汎用 4 自動 対応 0.72 ~ 1.98 1.62 ~ 3.63 6.8M @オープンドレイン, 40M @プッシュプル 表1:ブログ内で紹介した方式/品番の比較   6. 参考資料 製品紹介ページ:電圧レベル変換器 NXP システム・マネジメントI2C, I3C, SPIセレクタ・ガイド I2C バス仕様およびユーザーマニュアル (Rev5.0 日本語版) I2C バス仕様およびユーザーマニュアル (Rev7.0 英語版) NXPコミュニティ・ブログ:I3Cバスの概要 ~次のシリアルバス~ 日本語ウェビナー動画:『【今知っておくべき】次世代インターフェース「I3C」の基礎』  Qiita @teddokano:PCA9306の中身と動作 変更履歴: 2025-08-28:初版 2025-08-28:NTS0304EUK-ARDの紹介と動画公開ブログへのリンクを追記 2026-04-10:表1の低電圧側[V],高電圧側[V]の訂正 2026-06-20:第3.1節「コラム:TTLのVIH(min) = 2.0V,VIL(max) = 0.8Vはどうやって決まっている?」を追加.標準TTLロジックIC:SN7400(2入力NAND)の内部回路例,SN7420の出力波形を追加 2026-07-10:第4.1節に,図15の回路がNexperia社アプリケーションノートAN10441としても公開されている旨を追記 ========================= 本投稿の「Comment」欄にコメントをいただいても、現在返信に対応しておりません。 お手数をおかけしますが、お問い合わせの際には「NXPへの技術質問 - 問い合わせ方法 (日本語ブログ)」をご参照ください。 (既に弊社NXP代理店、もしくはNXPとお付き合いのある方は、直接担当者へご質問いただいてもかまいません。) このブログでは,デジタル回路で使われる論理回路の種類(*TTL,*LVTTL,*CMOS)の電圧レベルの違いから,それを判断する上で重要なV OH /V OL /V IH /V IL の意味について解説します. さらに様々な変換の方法の中から,どのような電圧レベル・トランスレータを選べばよいかを解説します. 特に特別な扱いが必要となる,双方向オープンドレイン信号の変換について詳しく見てみます Interface introduction 日本語ブログ
記事全体を表示
S32K148 FlexCAN2 不工作 你好 我正在尝试启用 S32K148 上的 FlexCAN2,同时使用 Eclipse OpenBSW 项目。 FlexCAN0 正常工作,但 FlexCAN2 无法传输有效帧。 配置: MCU: S32K148 CAN 实例:FlexCAN2 别针 PB12 → CAN2_RX (ALT4) PB13 → CAN2_TX(ALT4) 外部收发器:以 5V 电压供电的 MCP2551 总线终端:总计 ~60 Ω 比特率500 kbps(经典 CAN) 观察到的行为 总线上只能观察到错误帧 发生位填充错误 未收到 ACK 问题 MCP2551 (5V 收发器)与 S32K148 FlexCAN I/O 电平兼容吗? PB12/PB13 ALT4 是 FlexCAN2 的正确引脚吗? FlexCAN0 和 FlexCAN2 之间是否存在需要考虑的特定时钟或配置差异? 如能得到任何指导,将不胜感激。 谢谢! Re: S32K148 FlexCAN2 not working 嗨,@sousou54、 1.我认为 MCP2551 的兼容性没有问题。 2.是的。 3.无需额外配置。CAN0/1/2 的时钟频率相同。 您可以尝试按步骤测试您的节点... 尝试在不使用收发器的情况下将 TX/RX 引脚连接在一起并发送信息。您应该会看到由于缺少 ACK 而反复出现的信息。TX 错误计数器为 0x80,模块处于错误被动状态。如果出现其他情况,则说明针脚设置有误。 将 TX/RX 引脚正常连接到收发器,并使其与总线断开连接。发送信息您应该会看到与上面相同的内容。如果没有,收发器可能被禁用或未终止。 我从 MCP2551 数据表中看到,您必须通过将 Rs 引脚连接到 Vss 来选择高速模式。 使用其他节点将收发器连接到总线(例如CAN 工具),发送/接收信息。如果检测到任何错误,很可能是 CAN 位定时不正确。确保所有节点使用相同的比特率和采样点。 您可以使用以下工具:MPC5xxx/S32Kxx/LPCxxxx:CAN / CAN FD 位定时计算。 最后,这是定制板,还是你在使用 S32K148EVB?如果这是定制板,请按照 AN5426:S32K1xx 硬件设计指南中的说明检查连接。 致以最诚挚的问候, Julián
記事全体を表示
[滥用] 发布者:@RishavKaaraTech /板:TapLinx-SDK /举报人:rkzelkdx rkzelkdx 报告了 @RishavKaaraTech 发布的帖子 RFIDDiscover 工具已被收购,但如何使用它 ,原因如下: 原因: 详情: < a href="https://hetnieuweteamwerken.be/forums/forum/speman-buy-low-price-hbqrl"> online最便宜的 speman < a href="https://slp.millingtonpubliclibrary.org/content/speman-buy-cod-fertility-pill"> 购买多伦多 speman < a href="http://www.familygalactictravel.com/node/3214"> 折扣speman saturday delivery fast < a href="https://hetnieuweteamwerken.be/forums/forum/speman-buy-low-price-hbqrl"> where to buy next speman < a href="https://oregonweddingday.com/your-couple-name-3695"> bestspeman 5kmtl 的价格 < a href="http://hubram.cz/content/speman-can-i-purchase"> 在哪里可以买到 speman < a href="http://en.sp-journal.ru/article/19262"> 药房speman canadian pharmacy < a href="https://cadel.ru/forum/speman-purchase-rx-bradford"> can i buy speman drug < a href="https://mnbride.com/your-couple-name-4220"> where to order next speman < a href="https://investor18.ru/investors/speman-generic-online-usa"> best价格 speman 检查 internet < a href="https://arendville.ru/speman-buy-low-price-hbqrl"> orderspeman store no script < a href="http://dev.nikol-buket.com/content/speman-pharmacy-online-germany"> pharmacy德国 speman 在线 < a href="https://jeunescathos-bxl.org/fr/content/speman-where-order-next"> 如何购买 speman < a href="http://xn--80aah2bgapnqg.xn--p1ai/job/speman-cost-price-online-why"> 如何订购 speman < a href="https://www.vgame.ca/node/47884"> 购买处方 speman 无需购买 < a href="https://dev.beautynbrushes.com/services-provided/short-cut-maroonimmortalep-1"> speman购买 hn8hb < a href="http://ph-ed-plus.nspu.ru/article/17987"> speman税务摊销收益 no rx https://www.rapidservice.com.ec/es/content/speman-buy-brand-shop-buy">speman 通过密码支付 < a href="https://darkmetalmush.net/history/speman-best-price-5kmtl"> cheapspeman no prescrip < a href="https://www.tripmayntra.com/speman-get-no-prescription-fedex"> buy处方 speman without buy < a href="https://www.rapidservice.com.ec/es/content/speman-buy-brand-shop-buy"> cheapspeman no prescrip < a href="https://museusvalenciapre.grupotecopy.es/en/node/4090"> getspeman no prescription fedex < a href="https://www.ziveknihy.sk/autor/speman-generic-pills"> buyingspeman florida < a href="https://www.rapidservice.com.ec/es/content/speman-buy-brand-shop-buy"> FDAapproved generic speman mogwt < a href="https://direct.needshub.com/node/28534"> how购买斯皮曼片 < a href="https://stage.cc.radiant.digital/node/3152"> want购买 speman < a href="http://wsb2.pl/content/speman-delivery-cheap"> 在网上购买 speman 药片 < a href="https://www.tripmayntra.com/speman-get-no-prescription-fedex"> 购买speman next day delivery < a href="https://www.intellectualpedia.org/countyelectron-speman-buy-low-price-hbqrl"> buy品牌 speman 商店购买 < a href="http://xn--80ab2anoq0a.xn--p1ai/art/speman-buy-mastercard-without-prescription"> 购买speman low price hbqrl < a href="https://www.thebiketube.com/topeak-francesca"> discountspeman from canada < a href="https://www.intellectualpedia.org/countyelectron-speman-buy-low-price-hbqrl"> purchasespeman 样品 < a href="http://pi5ny.com/node/5148"> generic speman fedex wyoming < a href="http://pi5ny.com/node/5148"> pharmacy speman store < a href="https://www.itconnecta.es/speman-cost-evohaler-trimethoprim"> cheapspeman no prescrip < a href="http://polden.info/story/speman-get-rx-no-prescription"> for sale speman ware < a href="http://dev.nikol-buket.com/content/speman-pharmacy-online-germany"> genericspeman fedex wyoming < a href="https://slp.millingtonpubliclibrary.org/content/speman-buy-cod-fertility-pill"> discounted speman purchase buy check < a href="http://xn--80aah2bgapnqg.xn--p1ai/job/speman-cost-price-online-why"> buyspeman missouri < a href="http://old-bxl.jeunescathos.org/fr/content/speman-cost-cheap-buy"> genericspeman middlesbrough 发表链接 :https://community.nxp.com/t5/TapLinx-SDK-TagWriter-and/RFIDDiscover-tool-acquired-but-how-to-use-it/m-p/2164324#M205 帖子作者 @RishavKaaraTech|Email Author 报告人:rkzelkdx |Email Reporter 报告的帖子有 3 个回复。
記事全体を表示