Multi Source Translation Content

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Multi Source Translation Content

Discussions

Sort by:
什么是 Adc_TempSenseGetTemp 参数? 我使用的是 s32ds 3.6 版本和 RTD 4.0.0。微控制器是 S32K314 172 针。 Adc_TempSenseGetTemp 参数在 adc 文档中有 2 个参数。 但当我使用 Adc_TempSenseGetTemp 函数时,需要 3 个参数。 我知道参数是 hwunitType、tempinstance 和 tempvaule。 但我不明白 tempinstance 的意思。 tempinstance 是 49 吗? 还是其他? 我为模板输入了什么? 这是我的 adc 配置。 这就是功能。 这是文件。 1. 我知道 hwUnitType 是 adcHwUnit_1,而 tempVaule 用于返回变量值。 但我不明白我输入了 tempinstance。频道号还是其他? 2. 我想在 MCU 中使用温度传感器。 那么,在微控制器中使用温度传感器的过程是怎样的? 我认为程序是 Adc_Sar_Ip_TempSenseEnable -> Adc_Sar_Ip_TempSenseGetTemp 3. 什么是 Adc_TempSenseCalculateTemp? 使用 Adc_Sar_Ip_TempSenseGetTemp 后,我还需要使用 Adc_TempSenseCalculateTemp 吗? 感谢帮助。 Re: what is Adc_TempSenseGetTemp parameter? 你好@rlaxortn Senlent_0-1752653202127.png u32AdcInstance-> 当前使用的 ADC 实例 u32TempInstance->0,因为只有一个临时实例 pTempSenseVal->温度计算值 Re: what is Adc_TempSenseGetTemp parameter? @Senlent 我的问题是,我不明白输入 tempinstance 的是什么,是通道号还是其他? 因此,我向您展示了功能参数。 Re: what is Adc_TempSenseGetTemp parameter? 你好@rlaxortn 1.热电阻驱动器包括 LLD 和 HLD,符合无自动散射和自动散射标准。 这两个函数分别来自 LLD 和 HLD。 Adc_Sar_Ip_TempSenseCalculateTemp();// for lld dirver Adc_TempSenseGetTemp ();// for hld driver 在你之前的问题中,我已经为你提供了一个例程。 https://community.nxp.com/t5/S32K/s32k344-tempsensor/m-p/2133907#M50911 2.yes 3.No. a.Adc_Sar_Ip_TempSenseGetTemp() ->该函数在温度传感器通道上以单次模式启动正常的软件转换,并根据数据转换计算芯片温度。 b."Adc_TempSenseCalculateTemp()"->根据给定数据计算温度(如果使用 ADC 直接读取数据)。
View full article
MPC5744 寄存器保护 你好、 有些模块(如 MC_ME)可以设置寄存器保护,如图 1 所示,但有些模块(如 CMU_0)则无法使用该功能,也不存在软锁定位,如图 2 所示。 另一个问题是,在受保护寄存器列表中,为什么不同模块的基地址相同?CMU0 和 CMU1 具有相同的基地址 0xFBFB0200,对吗? 2021-04-13_151624.png   2021-04-13_151502.png   2021-04-13_152957.png   Re: MPC5744 Register Protection 嗨,彼得 、 这些是我为 MPC5746C 实现寄存器保护下锁定机制的模块。 - 0xFFFB0140, /* CMU------------*/ 0xFFFB0040, /* FXOSC----------*/ 0xFFFB0180, /* MC_CGM --------*/ 0xFFFB8000, /* MC_ME ---------*/ 0xFFFA8000, /* MC_RGM --------*/ 0xFFF50000, /* MEMU_0 -------*/ 0xFFFB0080, /* PLLDIG --------*/ 0xFFFA0400, /* PMCDIG --------*/ 0xFFFC0000, /* SIUL2 ---------*/ 0xFFFB0100, /* SXOSC ---------*/ 0xFFF9C000 /* LPU_CTL -------*/ 我面临的问题是,如果尝试访问某些模块 GCR 和 SLB 位会引发总线错误。同样,对于那些软/硬锁正常工作的模块,我在设置几个寄存器时仍然会遇到同样的问题。我在附件中提供了两个屏幕截图样本,第一个样本正常工作,可以看到所有寄存器/镜像/SLB 和 GCR 地址都已启用,而在第二个样本中,如果尝试使用 SLB&GCR,则会出现错误。 出现这种不同行为的原因是什么?如果您需要,我可以附上寄存器/镜像/SLB 和 GCR 地址的手工计算结果。 Re: MPC5744 Register Protection 嗨,彼得、 如果将表 2-77 中 CMU"Offset" 的值修改为 0x200、0x208、0x20C 等,我认为会更好理解。但现在我明白了,谢谢你。 2021-04-16_184156.png   顺祝商祺! Jamber Re: MPC5744 Register Protection 嗨,彼得、 谢谢您的答复。现在我知道 "注释 "是什么意思了,这是一个关键点,而且我还进行了测试,效果很好。 顺祝商祺! Jamber Re: MPC5744 Register Protection 你好 为方便起见,以下是可用于配置寄存器保护的宏。 /*PowerPC*/ /*-----------------------------------------------------------------------------------------------------------*/ #define REGPROTPPMIRROR 0x2000 #define REGPROTPPSLBR 0x3800 #define REGPROTPPGCR 0x3FFC #define WRITE_WITH_LOCK_PP_8BIT(registeraddress, value)    #define WRITE_WITH_LOCK_PP_16BIT(registeraddress, value)    #define WRITE_WITH_LOCK_PP_32BIT(registeraddress, value)    #define GET_SOFTLOCK_PP(modulebaseaddress, registeraddress, value) #define CLR_SOFTLOCK_PP_32BIT(modulebaseaddress, registeraddress) #define CLR_SOFTLOCK_PP_16BIT(modulebaseaddress, registeraddress) #define CLR_SOFTLOCK_PP_8BIT(modulebaseaddress, registeraddress) #define SET_SOFTLOCK_PP_32BIT(modulebaseaddress, registeraddress) #define SET_SOFTLOCK_PP_16BIT(modulebaseaddress, registeraddress) #define SET_SOFTLOCK_PP_8BIT(modulebaseaddress, registeraddress) #define SET_HARDLOCK_PP(modulebaseaddress) #define USER_ACCESS_FORBIDDEN_PP(modulebaseaddress) #define USER_ACCESS_ALLOWED_PP(modulebaseaddress) 使用实例 //16k - 32 bit,CAN1 CAN_6.MCR.B.MDIS = 0x0; WRITE_WITH_LOCK_16K_32BIT((&CAN_6.MCR.R), 0xD890000F); GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik); CAN_6.MCR.B.MDIS = 0x0; CLR_SOFTLOCK_16K_32BIT(&CAN_6, &CAN_6.MCR.R); GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik); CAN_6.MCR.B.MDIS = 0x0; SET_SOFTLOCK_16K_32BIT(&CAN_6, &CAN_6.MCR.R); GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik); //SET_HARDLOCK_16k(&CAN_6); CLR_SOFTLOCK_16K_32BIT(&CAN_6, &CAN_6.MCR.R); GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik); CAN_6.MCR.B.MDIS = 0x1; USER_ACCESS_FORBIDDEN_16k(&CAN_6); GET_GCR_16K(&CAN_6,&GCRvalue); CAN_6.MCR.B.MDIS = 0x0; USER_ACCESS_ALLOWED_16k(&CAN_6); GET_GCR_16K(&CAN_6,&GCRvalue); CAN_6.MCR.B.MDIS = 0x0; SET_HARDLOCK_16k(&CAN_6); GET_GCR_16K(&CAN_6,&GCRvalue); Re: MPC5744 Register Protection 你好 注释是正确的。 所有 CMU 的基地址均为 0xFBFB_0000. 如果基地址为 0xFBFB0000,则软锁定位应该为 0xFBFB0000+0x3800=0xFBFB3800,但如下图所示,该地址仍然不可测。您能告诉我如何计算 CMU 的镜像地址、软锁地址和硬锁地址吗? 你的计算不正确。 您必须使用寄存器的基地址:0xFBFB_0200 仅适用于 CMU 模块,对于其他外设,您的基地址是模块的基地址。 petervlna_1-1618563997092.png petervlna_0-1618563954927.png 因此,要软锁定 CMU0_ CSR 寄存器,需要写入 0xFBFB_2200。 锁定寄存器的地址为 0xFBFB_3880,即 CMU0_CSR。 顺祝商祺! Peter Re: MPC5744 Register Protection 嗯,奇怪、 我并不知道这一点。正在考虑如何计算地址。 让我在这里测试一下,我会尽快给你答复。 顺祝商祺! Peter Re: MPC5744 Register Protection 嗨,彼得、 我想我找到答案了,但我不明白。感谢您的截图,我看到了注释,上面写着" 所有 CMU 模块都在同一保护区域,基地址对齐到 16k - 0xFBFB_0000"这是什么意思? 如果基地址是 0xFBFB0000,软锁定位应该是 0xFBFB0000+0x3800=0xFBFB3800,但如下图所示,该地址仍然不可测。您能告诉我如何计算 CMU 的镜像地址、软锁地址和硬锁地址吗? 与其他模块不同,它是如此有趣。 2021-04-15_164430.png 2021-04-15_164141.png 顺祝商祺! Jamber     Re: MPC5744 Register Protection 嗨,彼得、 感谢您的回复。 "只有附录 A 中列出的寄存器可以被寄存器保护锁定:"令我困惑的是,CMU0 模块就在附录 A 中,但我无法访问其 SoftLock 位,我在问题中贴出了截图。 顺祝商祺! Jamber Re: MPC5744 Register Protection 你好 只有附录 A 中列出的寄存器可以被寄存器保护锁定: petervlna_0-1618472142468.png 因此,并非所有模块中的寄存器都支持这一功能。通常它只与功能安全有关。 另一个问题是,在受保护寄存器列表中,为什么不同模块的基地址相同?CMU0 和 CMU1 具有相同的基地址 0xFBFB0200,对吗? 这是手册中的复制粘贴错字,请查阅手册附录: 地址如下 #define CMU_0 (*(volatile struct CMU_tag *) 0xFBFB0200UL) #define CMU_1 (*(volatile struct CMU_tag *) 0xFBFB0240UL) #define CMU_2 (*(volatile struct CMU_tag *) 0xFBFB0280UL) #define CMU_3 (*(volatile struct CMU_tag *) 0xFBFB02C0UL) #define CMU_3 (*(volatile struct CMU_tag *) 0xFBFB02C0UL) #define CMU_4 (*(volatile struct CMU_tag *) 0xFBFB0300UL) petervlna_1-1618472584102.png 顺祝商祺! Peter Re: MPC5744 Register Protection 谁能帮帮我? Re: MPC5744 Register Protection I 测试 MC_ME、CMU、ADC、CTU、PWM,只有 CMU 设置软锁定失败,其他模块可成功设置软锁定。为什么?
View full article
MPC5744レジスタ保護 こんにちは、 MC_ME などの一部のモジュールでは、図 1 に示すようにレジスタ保護を設定できますが、CMU_0 などの他のモジュールではこの機能を使用できず、図 2 に示すようにソフト ロック ビットが存在しません。 もう一つの質問は、保護レジスタリストで、なぜ異なるモジュールが同じベースアドレスを持つのかということです。図3に示すように、CMU0 と CMU1 のベース アドレスは同じ 0xFBFB0200 ですが、これは正しいですか? 2021-04-13_151624.png   2021-04-13_151502.png   2021-04-13_152957.png   Re: MPC5744 Register Protection こんにちは、ピーターさん。 これらは、MPC5746C のレジスタ保護の下でロック メカニズムを実装しているモジュールです。 - 0xFFFB0140, /* CMU------------*/ 0xFFFB0040, /* FXOSC----------*/ 0xFFFB0180, /* MC_CGM --------*/ 0xFFFB8000, /* MC_ME ---------*/ 0xFFFA8000, /* MC_RGM --------*/ 0xFFF50000, /* MEMU_0 -------*/ 0xFFFB0080, /* PLLDIG --------*/ 0xFFFA0400, /* PMCDIG --------*/ 0xFFFC0000, /* SIUL2 ---------*/ 0xFFFB0100, /* SXOSC ---------*/ 0xFFF9C000 /* LPU_CTL -------*/ 私が直面しているのは、アクセスしようとすると一部のモジュールの GCR と SLB ビットがバス エラーをスローすることです。同様に、ソフト/ハード ロックが機能しているモジュールでは、いくつかのレジスタ セットで同じ問題がCAN発生します。スクリーンショットのサンプルを 2 つ添付します。最初のものは動作しており、すべてのレジスタ/ミラー/SLB および GCR アドレスが有効になっていることがわかりますが、2 番目のCASEでは SLB と GCR を使用しようとするとエラーが発生します。 この異なる動作の理由は何でしょうか?ご希望であれば、レジスタ/ミラー/SLB および GCR アドレスの手動計算結果を添付CANます。 Re: MPC5744 Register Protection こんにちは、ピーター。 表2-77のCMUの「オフセット」の値を0x200、0x208、0x20Cなどに変更すると、より理解しやすくなると思います。でも今はとにかく理解できました。ありがとうございます。 2021-04-16_184156.png   よろしくお願いいたします。 ジャンバー Re: MPC5744 Register Protection こんにちは、ピーター。 お返事ありがとうございます。今では、重要なポイントである NOTE の意味がわかっており、テストも行いましたが、うまく機能しています。 よろしくお願いいたします。 ジャンバー Re: MPC5744 Register Protection こんにちは、 簡単にするために、レジスタ保護を構成するために使用できるマクロを次に示します。 /*PowerPC*/ /*-----------------------------------------------------------------------------------------------------------*/ #define REGPROTPPMIRROR 0x2000 #define REGPROTPPSLBR 0x3800 #define REGPROTPPGCR 0x3FFC #define WRITE_WITH_LOCK_PP_8BIT(registeraddress, value)    #define WRITE_WITH_LOCK_PP_16BIT(registeraddress, value)    #define WRITE_WITH_LOCK_PP_32BIT(registeraddress, value)    #define GET_SOFTLOCK_PP(modulebaseaddress, registeraddress, value) #define CLR_SOFTLOCK_PP_32BIT(modulebaseaddress, registeraddress) #define CLR_SOFTLOCK_PP_16BIT(modulebaseaddress, registeraddress) #define CLR_SOFTLOCK_PP_8BIT(modulebaseaddress, registeraddress) #define SET_SOFTLOCK_PP_32BIT(modulebaseaddress, registeraddress) #define SET_SOFTLOCK_PP_16BIT(modulebaseaddress, registeraddress) #define SET_SOFTLOCK_PP_8BIT(modulebaseaddress, registeraddress) #define SET_HARDLOCK_PP(modulebaseaddress) #define USER_ACCESS_FORBIDDEN_PP(modulebaseaddress) #define USER_ACCESS_ALLOWED_PP(modulebaseaddress) ユースケースの例: //16k - 32 bit,CAN1 CAN_6.MCR.B.MDIS = 0x0; WRITE_WITH_LOCK_16K_32BIT((&CAN_6.MCR.R), 0xD890000F); GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik); CAN_6.MCR.B.MDIS = 0x0; CLR_SOFTLOCK_16K_32BIT(&CAN_6, &CAN_6.MCR.R); GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik); CAN_6.MCR.B.MDIS = 0x0; SET_SOFTLOCK_16K_32BIT(&CAN_6, &CAN_6.MCR.R); GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik); //SET_HARDLOCK_16k(&CAN_6); CLR_SOFTLOCK_16K_32BIT(&CAN_6, &CAN_6.MCR.R); GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik); CAN_6.MCR.B.MDIS = 0x1; USER_ACCESS_FORBIDDEN_16k(&CAN_6); GET_GCR_16K(&CAN_6,&GCRvalue); CAN_6.MCR.B.MDIS = 0x0; USER_ACCESS_ALLOWED_16k(&CAN_6); GET_GCR_16K(&CAN_6,&GCRvalue); CAN_6.MCR.B.MDIS = 0x0; SET_HARDLOCK_16k(&CAN_6); GET_GCR_16K(&CAN_6,&GCRvalue); Re: MPC5744 Register Protection こんにちは、 メモは正しいです。 すべての CMU のベース アドレスは0xFBFB_0000です。 ベース アドレスが 0xFBFB0000 の場合、SoftLock ビットは 0xFBFB0000+0x3800=0xFBFB3800 になるはずですが、下の図に示すように、このアドレスはまだアクセスできません。CMU のミラー アドレス、ソフトロック アドレス、ハードロック アドレスを計算する方法を教えてください。 あなたの計算は正しくありません。 レジスタのベース アドレスを取得する必要があります。0xFBFB_0200 は CMU モジュールに対してのみ有効で、他のペリフェラル の場合、ベースはモジュールのベース アドレスになります。 petervlna_1-1618563997092.png petervlna_0-1618563954927.png SO、CMU0_ CSR レジスタのソフト ロックの場合は、0xFBFB_2200 に書き込みます。 ロック レジスタは、CMU0_CSR のアドレス 0xFBFB_3880 に表示されます。 よろしくお願いいたします。 ピーター Re: MPC5744 Register Protection うーん、奇妙ですね、 私はこれに気づいていませんでした。住所の計算方法を考えてみます。 ここでテストさせてください。できるだけ早くご連絡いたします。 よろしくお願いいたします。 ピーター Re: MPC5744 Register Protection こんにちは、ピーター。 答えを見つけたと思うのですが、理解できません。スクリーンショットをありがとうございます。注記を確認したところ、「すべての CMU モジュールは、ベース アドレスが 16k - 0xFBFB_0000 に揃えられた同じ保護領域にあります」とありましたが、これはどういう意味ですか? ベース アドレスが 0xFBFB0000 の場合、SoftLock ビットは 0xFBFB0000+0x3800=0xFBFB3800 になるはずですが、下の図に示すように、このアドレスはまだアクセスできません。CMU のミラー アドレス、ソフトロック アドレス、ハードロック アドレスを計算する方法を教えてください。 他のモジュールと違ってSO面白いです。 2021-04-15_164430.png 2021-04-15_164141.png よろしくお願いいたします。 ジャンバー     Re: MPC5744 Register Protection こんにちは、ピーター。 ご返信よろしくお願いします。 「付録 A に記載されているレジスタのみがレジスタ保護によってロックできます。 」、私が混乱したのは、CMU0 モジュールが付録 A に記載されているにもかかわらず、その SoftLock ビットにアクセスできないことです。質問にスクリーンショットを投稿しました。 よろしくお願いいたします。 ジャンバー Re: MPC5744 Register Protection こんにちは、 レジスタ保護によってロックできるのは、付録 A に記載されているレジスタのみです。 petervlna_0-1618472142468.png SO、モジュール内のすべてのレジスタがこの機能をサポートしているわけではありません。通常、関連するのはセーフティのみです。 もう一つの質問は、保護レジスタリストで、なぜ異なるモジュールが同じベースアドレスを持つのかということです。図3に示すように、CMU0 と CMU1 のベース アドレスは同じ 0xFBFB0200 ですが、これは正しいですか? そうですね、これはマニュアルのコピー&ペーストの誤字です。代わりにマニュアルの補足をご覧ください。 住所は次のとおりです: #define CMU_0 (*(揮発性構造体 CMU_tag *) 0xFBFB0200UL) #define CMU_1 (*(揮発性構造体 CMU_tag *) 0xFBFB0240UL) #define CMU_2 (*(揮発性構造体 CMU_tag *) 0xFBFB0280UL) #CMU_3 を定義 (*(揮発性構造体 CMU_tag *) 0xFBFB02C0UL) #define CMU_4 (*(揮発性構造体 CMU_tag *) 0xFBFB0300UL) petervlna_1-1618472584102.png よろしくお願いいたします。 ピーター Re: MPC5744 Register Protection 誰か助けてくれませんか? Re: MPC5744 Register Protection MC_ME、CMU、ADC、CTU、PWM をテストしましたが、CMU のみがソフトロックの設定に失敗し、他のモジュールは正常にソフトロックを設定できます。なぜ?
View full article
IW612 は BLE でセントラルとペリフェラル ロールとして同時に機能できますか? こんにちは、 私はセントラル ロールとペリフェラル ロールの両方で BLE を実行しようとしていますが、ペリフェラル ロールでは複数の接続ができましたが、私のCASEではおそらく GATT サーバーの構成が原因で、セントラル ロールとペリフェラル ロールを同時に持つことはできません。 先に進む前に、IW612 が両方の役割を同時にサポートしているかどうか、またこれをテストできる例があるかどうかを確認したかったのです。 ありがとうございます。 Re: Can IW612 act as Central and Peripheral Roles simultaneously in BLE? こんにちは、 この機能は、IW612 ファームウェアでサポートされています。ただし、ホストはアプリケーションを実装する必要があります。 BlueZ CLI または hcitool を使用してみてください。 よろしくお願いいたします。 ダニエル。 Re: Can IW612 act as Central and Peripheral Roles simultaneously in BLE? もう 1 つ質問があります。NXP ファームウェアはこれを直接サポートしていますか、それとも何かを有効にする必要がありますか? Re: Can IW612 act as Central and Peripheral Roles simultaneously in BLE? こんにちは@DanielRuvalcaba 、 ご確認ありがとうございます。ひょっとすると、これをテストCAN例はありますか? ありがとうございます エルド株式会社 Re: Can IW612 act as Central and Peripheral Roles simultaneously in BLE? こんにちは、 IW612 は Bluetooth LE デュアル モード トポロジをサポートしています。NXP ワイヤレス SoC の機能と Linux 用リリース ノートを参照することをお勧めします。 よろしくお願いいたします。 ダニエル。 Re: Can IW612 act as Central and Peripheral Roles simultaneously in BLE? こんにちは@DanielRuvalcaba 、 私はカーネル v6.6 と BlueZ 5.78 を搭載したSTM32MP131で Linux OS を使用しています。 私が実現しようとしているのは、3 つのデバイス A、B、C があるとします。 AはBが接続するSTM32MP131です(ペリフェラルロール)。BがAIとのアクティブな接続を保持しているとき、AはCに接続する必要があります(セントラルロール)。 こちらで説明されているようにhttps://docs.silabs.com/bluetooth/4.0/bluetooth-general-connections/dualtopologyしかし、複数のペリフェラルとセントラルの接続には興味がないので、それぞれ 1 つの接続で機能します。 IW612がBluetoothデュアルトポロジーをサポートしているかどうか尋ねるべきだったかもしれない ありがとうございます エルド株式会社 __現在 Re: Can IW612 act as Central and Peripheral Roles simultaneously in BLE? こんにちは、 Scatternet がサポートされています。これがテストしようとしているものなのでしょうか? どのホストを使用していますか? 使用しているOSのバージョンは何ですか? よろしくお願いいたします。 ダニエル。
View full article
Does current FSS version "S32N_FSS_FW_R21-11_1.8.1" support S32N53? Hello Team, The customer HKMC will move to S32N53 from S32N55.  So my question is: does current FSS version "S32N_FSS_FW_R21-11_1.8.1" support S32N53? If no, when will release the FSS which supports S32N53? Best regards, Thanks! HSE_FW Priority: HIGH Re: Does current FSS version "S32N_FSS_FW_R21-11_1.8.1" support S32N53? Hello Tansheng,  The support is available in the release we are planning this month, end of July; Thanks, Sindhu
View full article
Android 13 LCDIF of display interface can't work NXP reference design code base: i.MX8MQ platform / Android 13.0.0_2.0.0 (L6.1.22_2.0.0 BSP) LCDIF connected to MIPI-DSI on Android 13(GKI) that does not work, but the function can work on Android 11. Android 11 Log:(Android11_LCDIF_OK.log) [ 3.511971] nwl-dsi 30a00000.mipi-dsi: [drm:nwl_dsi_probe] Using LCDIF as input source [ 4.084346] [gm8775c_bridge_attach] [ 4.084349] [gm8775c_simple_panel_host_register] [ 4.084353] child node panel, panel@0 [ 4.084609] panel-simple panel0: DMA mask not set [ 4.084653] [panel_simple_probe] [ 4.084686] panel-simple panel0: supply power not found, using dummy regulator [ 4.084862] [gm8775c_attach_dsi] [ 4.084955] nwl-dsi 30a00000.mipi-dsi: [drm:nwl_dsi_host_attach] lanes=4, format=0x0 flags=0x15 [ 4.085966] [drm] Initialized mxsfb-drm 1.0.0 20160824 for 30320000.lcd-controller on minor 1 [ 4.237089] mxsfb 30320000.lcd-controller: [drm] fb0: mxsfb-drmdrmfb frame buffer device Android 13 Log:(Android13_LCDIF_Fail.log) [ 2.401658][ T8] nwl-dsi 30a00000.mipi-dsi: [drm:nwl_dsi_probe [nwl_dsi]] Using LCDIF as input source [ 2.412617][ T8] [gm8775c_bridge_attach] DRM_BRIDGE_ATTACH_NO_CONNECTOR [ 2.419684][ T8] [drm:drm_bridge_attach] *ERROR* failed to attach bridge /soc@0/bus@30800000/i2c@30a20000/gm8775c@2C2 [ 2.419734][ T1] __power_supply_register: Expected proper parent device for 'battery' [ 2.420045][ T1] __power_supply_register: Expected proper parent device for 'usb' [ 2.432612][ T8] [drm:drm_bridge_attach] *ERROR* failed to attach bridge /soc@0/bus@30800000/mipi-dsi@30a00000 to en2 [ 2.460891][ T8] mxsfb 30320000.lcd-controller: error -EINVAL: Failed to attach bridge [ 2.469098][ T8] mxsfb 30320000.lcd-controller: error -EINVAL: Cannot connect bridge [ 2.477247][ T8] mxsfb: probe of 30320000.lcd-controller failed with error -22 Attached LCDIF_Log.zip includes both Android11_LCDIF_OK.log and Android13_LCDIF_Fail.log. Android 11 log shows "Initialized mxsfb-drm", but we can't find the message in Android 13 log. We also look "mxsfb" up on the Internet: [ 11.141177] mxsfb 30320000.lcdif: Cannot connect bridge: -22 [ 11.161062] mxsfb: probe of 30320000.lcdif failed with error -22 Does mxsfb equals lcdif ?? If mxsfb-drm can be initialized, can the issue be fixed? If YES, how to enable mxsfb-drm on Android 13(GKI)? If NO, how to fix the issue? BTW, we thought DSI to LVDS bridge driver (gm8775c) can work, because we use &dcss instead of &lcdif, DCSS connected to MIPI-DSI of Android 13 can work. Display_Interface.png eDP_LVDS.jpg We try to set the U-Boot environment variables as follows, it still can't work though. u-boot=> setenv append_bootargs androidboot.primary_display=mxsfb-drm u-boot=> saveenv Re: Android 13 LCDIF of display interface can't work Hello HyleChang, ı have similar problem. Could you please share me devicetree files, ı would like to solve the problem. I have succesfully drive lvds by dcss, but lcdif driven lvds is not worked. I have changed panel size, driver code etc. Also ı have changed the hardware to be sure that problem in software side but still there is no progress. I need help. This is my problem definition on forum. https://community.nxp.com/t5/i-MX-Processors/IMX8MQ-Android-11-LCDIF-Display-Not-Working-by-MIPI-DSI-to-LVDS/td-p/2125642 Best Regards Re: Android 13 LCDIF of display interface can't work Dear Friends, ı have the similar problem. SN65dsi bridge is used to support lvds.  Conditions  1) dcss+lvds works fine  2) dcss+hdmi works fine  but lcdif+lvds does not work. I need to support dual display, so lvds should be driven by lcdif and hdmi should be driver by dcss.  Could you please share your devicetree configuration for dual display on your Android11 device ? I checked the logs, it is similar.  Re: Android 13 LCDIF of display interface can't work Thank you very much, LCDIF connected to MIPI-DSI on Android 13 can work. Re: Android 13 LCDIF of display interface can't work For i.MX8MQ, mxsfb is lcdif driver, lcdif can only ouput MIPI DSI. DCSS can both output DSI and HDMI. Zhiming_Liu_0-1711677495978.png imx-dcnano and imx-drm are also display controller driver in  other i.MX platform. Re: Android 13 LCDIF of display interface can't work Dear Zhiming, We look up "primary_display", and Android_Quick_Start_Guide.pdf is not quite descriptive as the picture below. Would you please organize what the terms of NXP proprietary mean? Thanks. primary_display=mxsfb-drm primary_display=imx-dcss primary_display=imx-drm primary_display=imx-dcnano primary_display.png Re: Android 13 LCDIF of display interface can't work Do you mean if bridge attach successfully, mxsfb-drm will be initialized in kernel space. -->Yes, we don't have such document, you can refer uboot and kernel source code. Re: Android 13 LCDIF of display interface can't work Dear Zhiming_Liu, We will check the bridge driver again, because we porting GM8775C driver refer to imx8mp_ite6151_mipi2edp_linux_5.4.24_20200921.patch for Android 11 provided by NXP and adv7511 bridge driver on Android 13 BSP, so we are going to focus on DRM_BRIDGE_ATTACH_NO_CONNECTOR flag. BTW, you said "mxsfb-drm can't be initialized because bridge attach failed" =>Do you mean if bridge attach successfully, mxsfb-drm will be initialized in kernel space. If yes, we want to use mxsfb in u-boot for Android boot animation(logo), do you have Android-13 doucuments for us to study and implement? thanks. Please correct me if I'm wrong. Re: Android 13 LCDIF of display interface can't work Hi @KyleChang  Does mxsfb equals lcdif ?? --> The lcdif driver in i.MX8MQ is drivers/gpu/drm/mxsfb/mxsfb_drv.c, so it is mxsfb.  mxsfb-drm can't be initialized because bridge attach failed It looks like relates to the way of handling DRM_BRIDGE_ATTACH_NO_CONNECTOR flag. Can you check this point? The mxsfb will not pass the DRM_BRIDGE_ATTACH_NO_CONNECTOR, but dcss driver will. ret = drm_bridge_attach(&mxsfb->encoder, bridge, NULL, 0); if (ret) return dev_err_probe(drm->dev, ret, "Failed to attach bridge\n"); mxsfb->bridge = bridge; Best Regards Zhiming
View full article
由于缺少许可证,无法安装 APU 编译器 你好,AP 软件专家、 福特客户正在安装用于 QNX 的 S32V234 VSDK 1.5.5,但他们无法安装 APU Compiler v1.0 b657,因此他们询问如何才能获得许可证。 此致 于 优先级:中等 Re: Could not install APU Compiler due to missing license @jiri_kral、 明白了,感谢您的帮助,我将关闭该票! 于 Re: Could not install APU Compiler due to missing license 您好, 兰迪的激活密钥是5B4B-73EC-F2E2-81B0 Re: Could not install APU Compiler due to missing license @jiri_kral 谢谢您的帮助!我的 APU 编译器许可证现在运行良好,但 Randy([email protected])看不到他的驾照。他如何访问 APU 编译器的下载链接? 于 Re: Could not install APU Compiler due to missing license 你好、 这两个许可证的有效期均已延长。 Re: Could not install APU Compiler due to missing license @jiri_kral、 您是否愿意为"[email protected]"颁发许可证? 并将我的"[email protected]"? 于 Re: Could not install APU Compiler due to missing license @jiri_kral 我已将用户名通过电子邮件发送给您。谢谢您的帮助! 于 Re: Could not install APU Compiler due to missing license 你好、 客户的 NXP ID 是什么?通常是电子邮件地址。
View full article
如何使用 SWT 的窗口 WDG? 我在 100msTask 中调用 Swt_Ip_Service,在超时模式下没有问题。为了使用 windows wdg 模式,我对 swt 配置进行了如下修改: Snipaste_2024-06-05_19-59-37.png 该软件没有按我的预期运行,看门狗被RESET了。 配置有问题吗?如何修改? 我试着调试,但发现在 Windows WDG 模式下,CO 寄存器始终为 0。 有没有更好的方法来了解从当前时间点到超时的时间有多长? Re: How to use Window WDG of SWT? 面对同样的问题,你找到解决办法了吗? Re: How to use Window WDG of SWT? 你好@Janeting123 如果不关闭 SWT,就没有其他办法查看 CO 寄存器的值。 Senlent_0-1717666639226.png Re: How to use Window WDG of SWT? 100msTask 的准确性已在普通狗模式下得到验证。如果某个周期出现特殊情况,就需要进行调试。 只有当 CR[WEN]=1 时,SWT 才处于 "窗狗 "模式。此时,CO 寄存器始终为 0。我找不到合适的调试方法。 Re: How to use Window WDG of SWT? 你好@Janeting123 您需要检查 100 毫秒的任务时间是否完全准确,或者是否被中断占用。 对于 CO 寄存器,必须先禁用 SW,然后才能看到值、 "禁用 SWT 时(CR[WEN] 为 0),CNT 显示内部定时器的值。当 SWT 启用时(CR[WEN] 为 1),它会向 CNT 写 0。该字段的值最多可滞后内部定时器值 6 个系统时钟周期和 8 个计数器时钟周期。因此,禁用 SWT 后立即读取的 CNT 值可能高于内部定时器的实际值。" Re: How to use Window WDG of SWT? 正如我在第一句话中所描述的,该函数在 100msTask 中被调用。 该配置专门为这 100ms 周期而准备。 所以,我不知道问题出在哪里。 更让我困惑的是,芯片似乎没有寄存器可以显示看门狗的计数。 Re: How to use Window WDG of SWT? 你好@Janeting123 如果启用了窗口模式,则 SWT 服务应在[超时周期 - 窗口周期,超时周期]内运行。 例如: 您将超时周期设置为 150 毫秒,将窗口周期设置为 75 毫秒 然后,您必须在"0.15-0.075 中为 SWT 提供服务。"~"0.15"S,范围为 75 至 150 毫秒。
View full article
Issue flashing i.MX8MM SD card with UUU I've been trying to flash the SD card on my i.MX8MM and been having some issues. I've looked into the documentation but it doesn't quite clear up my confusion. For UUU I've downloaded the latest 1.4.127: https://github.com/NXPmicro/mfgtools/releases/tag/uuu_1.4.127 And I've also downloaded the latest pre-build Linux binaries L5.10.9_1.0.0_MX8MM: https://www.nxp.com/webapp/Download?colCode=L5.10.9_1.0.0_MX8MM&appType=license I used UUU to flash this 5.10 Linux release into my eMMC via: uuu.exe uuu.auto That flashed and booted just fine. I then tried to flash this to the SD card simply by updating the uuu.auto file as follows: # SD Programming: FB: ucmd setenv fastboot_dev mmc FB: ucmd setenv mmcdev ${sd_dev} FB: ucmd mmc dev ${sd_dev} FB: flash -raw2sparse all imx-image-multimedia-imx8mmevk.wic FB: flash bootloader imx-boot-imx8mmevk-sd.bin-flash_evk FB: ucmd if env exists sd_ack; then ; else setenv sd_ack 0; fi; FB: ucmd mmc partconf ${sd_dev} ${sd_ack} 1 0 FB: done # Emmc programming: #FB: ucmd setenv fastboot_dev mmc #FB: ucmd setenv mmcdev ${emmc_dev} #FB: ucmd mmc dev ${emmc_dev} #FB: flash -raw2sparse all imx-image-multimedia-imx8mmevk.wic #FB: flash bootloader imx-boot-imx8mmevk-sd.bin-flash_evk #FB: ucmd if env exists emmc_ack; then ; else setenv emmc_ack 0; fi; #FB: ucmd mmc partconf ${emmc_dev} ${emmc_ack} 1 0 #FB: done This failed at the following step: uuu.exe uuu.auto uuu (Universal Update Utility) for nxp imx chips -- libuuu_1.4.127-0-g08c58c9 Success 0 Failure 1 2:2 7/ 8 [ ] FB: ucmd mmc partconf ${sd_dev} ${sd_ack} 1 0 Which makes me think I can't simply swap one for the other. So my question is, how can I use uuu to flash the v5.10 pre-released Linux binaries to the SD card on the i.MX8MM EVK? i.MX 8M | i.MX 8M Mini | i.MX 8M Nano Re: Issue flashing i.MX8MM SD card with UUU I agree that the documentation for UUU is very sparse and difficult to use without a lot of trial and error. It would benefit users greatly if NXP would have an applications engineer with English skills as a first language thoroughly update it and provide proper use cases, as well as adopt a standard Linux style command-line help syntax. I could help but don't have enough spare time myself... Re: Issue flashing i.MX8MM SD card with UUU It no problem to use script.  What you need is the common basic knowledge.  Because from the "FB: ucmd mmc partconf ${sd_dev} ${sd_ack} 1 0", know about you have no any knowledge about emmc and sd card as you don't know about the wic. Here is the script to flash the sdcard. uuu uuu.sd.auto to use it. uuu.sd.auto uuu_version 1.2.39 # This command will be run when i.MX6/7 i.MX8MM, i.MX8MQ SDP: boot -f imx-boot-imx8mmevk-sd.bin-flash_evk # This command will be run when ROM support stream mode # i.MX8QXP, i.MX8QM SDPS: boot -f imx-boot-imx8mmevk-sd.bin-flash_evk # These commands will be run when use SPL and will be skipped if no spl # SDPU will be deprecated. please use SDPV instead of SDPU # { SDPU: delay 1000 SDPU: write -f imx-boot-imx8mmevk-sd.bin-flash_evk -offset 0x57c00 SDPU: jump # } # These commands will be run when use SPL and will be skipped if no spl # if (SPL support SDPV) # { SDPV: delay 1000 SDPV: write -f imx-boot-imx8mmevk-sd.bin-flash_evk -skipspl SDPV: jump # } FB: ucmd setenv fastboot_dev mmc FB: ucmd setenv mmcdev ${emmc_sd} FB: ucmd mmc dev ${emmc_sd} FB: flash -raw2sparse all imx-image-multimedia-imx8mmevk.wic FB: done Untitled.png Re: Issue flashing i.MX8MM SD card with UUU to know what is wic, you should have the yocto knowledge.  and wic is same as .sdcard.   Re: Issue flashing i.MX8MM SD card with UUU Thanks for the input. The documentation and the `uuu` output both mention the sdcard if flashed via a `.sdcard` file: sd_all burn whole image to sd card arg0: _flash.bin arg1: _rootfs.sdcard Clearly in this case it was a `.wic` file instead. Is that mentioned somewhere that I missed? Second question: while the built in command works, can the uuu.auto file be used as well for SD card flashing? Re: Issue flashing i.MX8MM SD card with UUU just one command line using uuu build-in command uuu -b sd_all imx-boot-imx8mmevk-sd.bin-flash_evk imx-image-multimedia-imx8mmevk.wic suggest to read the uuu manual or type uuu without parameter to show the help
View full article
如何在 S32K3 中使用 HSE 在两个节点之间交换数字证书以进行身份验证 您好, 我想使用 HSE 在 S32K344 MCU 的两个节点之间使用数字证书进行身份验证。 我们怎样才能做到这一点? 能否从 S32K344 的 HSE 生成数字证书? 或者如何使用程序/服务 ID。 我想使用 ECDSA 非对称协议进行数字证书签名/验证 Re: How to exchange digital certificate in S32K3 using HSE for authentication between 2 nodes 你好@lukaszadrapa、 我还在尝试实现 X.509 证书处理,使用 S32K344 的 HSE 外设解析或解密 X.509 证书。 是否有办法使用 S32K344 的 HSE 外围设备通过 X.509 证书实施任何类型的解决方案? Re: How to exchange digital certificate in S32K3 using HSE for authentication between 2 nodes 你指的是哪种证书?X.509?没有 X.509 认证服务,但认证是带签名的公钥,HSE 可以导入/导出加密/认证密钥。这样就可以进行签名验证,并在 X.509 证书中存储发布密钥的密钥值。 HSE 无法解析 X.509 证书,这是一项 CPU 密集型任务,不是 HSE 硬件加速器所擅长的。下面是 mbedtls 的 x.509 证书代码,可以看出,解析 x.509 需要一个相当复杂的过程。 image.png 因此,HSE将仅处理证书的最核心部分,验证签名和密钥存储,Pauth和pKey指向已解析的签名和十六进制的发布密钥,因此导入密钥服务用于X.509证书。 我们没有这方面的示例代码。 问候, Lukas Re: How to exchange digital certificate in S32K3 using HSE for authentication between 2 nodes 啊,我探索了这个例子。 这是关于数字签名的生成和验证。 我想知道如何交换证书示例。 Re: How to exchange digital certificate in S32K3 using HSE for authentication between 2 nodes 你好@kual_gettobyte 您可以看看这个 SW 示例: c:\NXP\S32K3_HSE_DemoExamples_1_0_0\S32K3_HSE_DemoExamples\Asymmetric Algorithms\S32K344_Hse_Ecc_Example\ 来自这个代码包: https://www.nxp.com/webapp/Download?colCode=S32K3_HSE_DemoExamples 它展示了如何生成公钥和私钥 ECC、如何导出公钥以及如何进行 ECDSA 签名和验证。 问候, Lukas
View full article
Pwm_example_S32K148 ビルドに失敗しました。 DS32 バージョン 3.4 といくつかの必要なパッケージをインストールしました。 iysheng_0-1718541776746.png iysheng_2-1718541822764.png iysheng_3-1718541836574.png そして、Pwm_example_S32K148 に基づいてプロジェクトを作成します。プロジェクトをビルドしようとすると、次のようなエラーが発生します。 iysheng_4-1718541896443.png Re: Pwm_example_S32K148 build failed. 私もあなたと似たような状況に遭遇しました。解決しましたか?   .. / src / main.c: 94 : 24 : エラー: 'NUM_OF_CONFIGURED_PINS0' が宣言されていません (この 関数 で 初めて 使用されます); 'NUM_OF_CONFIGURED_PINS' を意味しましたか? 94 | Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS0, g_pin_mux_InitConfigArr0); | ^ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ | NUM_OF_CONFIGURED_PINS.. / src / main.c: 94 : 24 : 注: 宣言されていない 各 識別子は、それが 出現 する 各 関数 に対して 1 回 だけ 報告され ます       Re: Pwm_example_S32K148 build failed. これを実行すると、ビルド時に次のようなエラー メッセージが表示されます。 「」 make -j12 all ビルディングファイル: ../board/Port_Ci_Port_Ip_Cfg.c 呼び出し: 標準 S32DS C コンパイラ Arm-none-eabi-gcc "@board/Clock_Ip_Cfg.args" -MMD -MP -MF"board/Port_Ci_Port_Ip_Cfg.d"-MT"ボード/Port_Ci_Port_Ip_Cfg.o"-o "ボード/Port_Ci_Port_Ip_Cfg.o"「../board/Port_Ci_Port_Ip_Cfg.c」 ../board/Port_Ci_Port_Ip_Cfg.c:29:60: エラー: 'NUM_OF_CONFIGURED_PINS0' はここで宣言されていません (関数内ではありません); 'NUM_OF_CONFIGURED_PINS' を意味しましたか? 29 | Port_Ci_Port_Ip_PinSettingsConfig g_pin_mux_InitConfigArr0[NUM_OF_CONFIGURED_PINS0] = { | ^~~~~~~~~~~~~~~~~~~~~~~ | 構成されたピンの数 ../board/Port_Ci_Port_Ip_Cfg.c:31:9: エラー: フィールド名がレコードまたは共用体初期化子にありません 31 | .portBase= IP_PORTC、 | ^ ../board/Port_Ci_Port_Ip_Cfg.c:31:9: 注記: ('g_pin_mux_InitConfigArr0' の初期化付近) ../board/Port_Ci_Port_Ip_Cfg.c:32:9: エラー: フィールド名がレコードまたは共用体初期化子にありません 32 | .gpioBase= NULL_PTR、 | ^ ../board/Port_Ci_Port_Ip_Cfg.c:32:9: 注記: ('g_pin_mux_InitConfigArr0' の初期化付近) ../board/Port_Ci_Port_Ip_Cfg.c:33:9: エラー: フィールド名がレコードまたは共用体初期化子にありません 33 | .pinPortIdx= 19U、 | ^ ../board/Port_Ci_Port_Ip_Cfg.c:33:9: 注記: ('g_pin_mux_InitConfigArr0' の初期化付近) ../board/Port_Ci_Port_Ip_Cfg.c:34:9: エラー: フィールド名がレコードまたは共用体初期化子にありません 34 | .pullConfig= PORT_INTERNAL_PULL_NOT_ENABLED、 | ^ ../board/Port_Ci_Port_Ip_Cfg.c:34:9: 注記: ('g_pin_mux_InitConfigArr0' の初期化付近) ../board/Port_Ci_Port_Ip_Cfg.c:35:9: エラー: フィールド名がレコードまたは共用体初期化子にありません 35 | .driveStrength= ポートドライブ強度が低い、 | ^ ../board/Port_Ci_Port_Ip_Cfg.c:35:9: 注記: ('g_pin_mux_InitConfigArr0' の初期化付近) ../board/Port_Ci_Port_Ip_Cfg.c:36:9: エラー: フィールド名がレコードまたは共用体初期化子にありません 36 | .パッシブフィルター= (ブール値)FALSE, | ^ ../board/Port_Ci_Port_Ip_Cfg.c:36:9: 注記: ('g_pin_mux_InitConfigArr0' の初期化付近) ../board/Port_Ci_Port_Ip_Cfg.c:37:9: エラー: フィールド名がレコードまたは共用体初期化子にありません 37 | .mux= PORT_MUX_ALT2、 | ^ ../board/Port_Ci_Port_Ip_Cfg.c:37:9: 注記: ('g_pin_mux_InitConfigArr0' の初期化付近) ../board/Port_Ci_Port_Ip_Cfg.c:38:9: エラー: フィールド名がレコードまたは共用体初期化子にありません 38 | .lockRegister= ポートロックレジスタが無効、 | ^ ../board/Port_Ci_Port_Ip_Cfg.c:38:9: 注記: ('g_pin_mux_InitConfigArr0' の初期化付近) ../board/Port_Ci_Port_Ip_Cfg.c:39:9: エラー: フィールド名がレコードまたは共用体初期化子にありません 39 | .デジタルフィルター= (ブール値)FALSE, | ^ ../board/Port_Ci_Port_Ip_Cfg.c:39:9: 注記: ('g_pin_mux_InitConfigArr0' の初期化付近) メイク: *** [board/subdir.mk:26:ボード/Port_Ci_Port_Ip_Cfg.o] エラー1 「make -j12 all」は終了コード 2 で終了しました。ビルドが不完全である可能性があります。 「」 生成されたコードは次のようになります。 「」 Port_Ci_Port_Ip_PinSettingsConfig g_pin_mux_InitConfigArr0[NUM_OF_CONFIGURED_PINS0] = { { .portBase= IP_PORTC、 .gpioベース= NULL_PTR、 .pinPortIdx= 19U、 .pullConfig= PORT_INTERNAL_PULL_NOT_ENABLED、 .driveStrength= ポートドライブ強度が低い、 .パッシブフィルター= (ブール値)FALSE, .mux= PORT_MUX_ALT2、 .lockRegister= ポートロックレジスタが無効、 .デジタルフィルター= (ブール値)FALSE, }, }; 「」 マクロNUM_OF_CONFIGURED_PINSが次のように定義されているのを見つけました iysheng_0-1718629852941.png Re: Pwm_example_S32K148 build failed. こんにちは@iysheng 「コードを更新」をクリックしてもう一度お試しください。 Senlent_0-1718591141284.png
View full article
在LS1028a上测试SecureBoot而不炸机 你好 我有一个问题,那就是如何在没有 CodeWarrior 和调试器的情况下在 LS1028A 上测试 SecureBoot 程序,也不要熔丝(OTPMK 除外)。 假设我想做以下事情: -启动主板 - 在 u-boot 中停止 -编写 OTPMK 并将其熔丝 -从 u-boot 写入 SRKHR 镜像寄存器 - 在 RCW 中设置 SB_EN - RESET 板 可以进行 RESET 吗(怎么做?)这样就可以保留 SRKHR 镜像寄存器的值而不必持续将其吹入保险丝中,这样整个 SecureBoot 程序就可以执行了? 我还无法访问CodeWarrior或非调试器,但我需要以某种方式测试程序。 Re: Testing SecureBoot without blowing fueses on LS1028a 即使要启动安全启动过程,也需要融合 OTPMK。这是正确的吗? 是的,禁用 OTPMK 对于在生产和开发 阶段运行安全启动至关重要。请参阅 LLDP UG 或 LSDK UG 中的详细信息。 Re: Testing SecureBoot without blowing fueses on LS1028a 你好@yipingwang 我的情况与本帖中介绍的类似。 我们还想在不熔丝寄存器的情况下测试安全启动过程,但想更进一步,还想使用CodeWarrior在寄存器中设置OTPMK。 这可能吗?我们现在测试的是 1。在 RCW 2 中在没有 SB_EN=1 的情况下从 ls1028ardb 上的 SD 卡启动。 当 U-Boot 启动时,更换 SD 卡,这样现在就有了 SB_EN=1 的 RCW 镜像,设置为 3。 根据您共享的文档运行 tcl 脚本,还要编写 OTPMK 来更正寄存器。 RESET 后,UART 上没有任何反应,再加上 JTAG 无法将处理器置于 RSP 状态。 这让我开始思考,即使开始安全启动过程也需要熔丝 OTPMK。是这样吗?当 RCW 中的 SB_EN=1 但是 OTMPK 没有熔丝时,到底会发生什么?在这种情况下,是否可以使用 JTAG 从任何寄存器获取信息?例如,检查 LSDK 文档中 6.1.1.3.2.2 ISBC 验证错误代码中列出的错误。 Re: Testing SecureBoot without blowing fueses on LS1028a 从 u-boot 写入 SRKHR 镜像寄存器来进行安全启动是不可能的,因为 RESET 后 SRKHR 镜像寄存器将变为 0。 你必须使用 CodeWarrior CCS 停止内核写入 SRKHR 镜像寄存器,然后版本内核。使用 CodeWarrior CCS 无需许可证。 请参考随附的步骤来熔丝 OTPMK 并通过 CCS 写入 SRKHR 镜像寄存器。 Re: Testing SecureBoot without blowing fueses on LS1028a 还有一个信息-我正在在 LS1028ARDB 板上对其进行测试。
View full article
使用 eDMA 生成媒体时钟 大家好 我正在使用GMAC PPS 模块和eDMA 生成时钟。 从文档中我了解到,当 GMA C 系统时间大于或等于配置的目标时间时,将钳位 mcg r_dma_req_o [3:0] 信号。 sathishkumar_sunmugavel_0-1753271626406.png sathishkumar_sunmugavel_1-1753271663068.png 我的目标是使用这个信号来触发eDMA,通过将值复制到以下寄存器来自动更新下一个目标时间: mac_pps0_target_time_nanoseconds mac_pps0_target_time_seconds 我想澄清一下: 如何将 mcgr_dma_req_o 连接到 DMA 控制器?eDMA 如何接收外设请求? 这些信号是内部路由到 MCU 中的 DMA MUX,还是需要配置任何特定路由? 如果有人有任何此类设置的示例、参考配置或应用笔记,请分享。 预期的行为是: 每当 GMAC 系统时间达到当前目标时间时,mcgr_dma_req_o 信号就会触发信号 DMA 传输,从而更新下一次 PPS 事件的目标时间。 提前感谢您
View full article
S32K3+RTD400+SPD 1.0.4リンクファイル SPD104 の使用時にリンク ファイルに関するいくつかの問題が発生しました。現在、iar バージョン 9.50.2 を使用しています。S32DS から iar に変換するときに生成される icf ファイルには、SPD 関連のコンテンツが含まれません。SPD104 マニュアルの eMcem_MemMap に関するセクションを参照します。いくつかのセグメント割り当てが icf ファイルに追加されましたが、依然としていくつかの問題が発生しました。 最も頻繁に発生するエラーは次のとおりです エラー[Lp005]: 配置にコンテンツを含むセクションが混在しています(例:eMcem.oのrwデータセクション.s32_saf_bssシンボル: [eMcem_DriverState]") [ROM への配置に適しています] およびコンテンツのないセクション (例: "zi section .bss in abs.o シンボル: [abs_output]") [RAM への配置に適しています] コードから、例えば、eMcem_MemMap.hには次のコードがあります。 #ifdef EMCEM_START_SEC_VAR_ZERO_INIT_UNSPECIFIED / * * * @file eMcem_MemMap.h * @ref eMcem_MemMap_h_REF_1 に違反します */ #undef EMCEM_START_SEC_VAR_ZERO_INIT_UNSPECIFIED / * * * @file eMcem_MemMap.h * @ref eMcem_MemMap_h_REF_1 に違反します */ #未定義 MEMMAP_ERROR #pragma ghs セクション bss=".s32_saf_bss" #endif マニュアルの理解によれば、ここの.s32_saf_bssセグメントはRAMに配置されるセグメントであるはずだが、eMcem.cでは、次のコードがあります #定義 EMCEM_START_SEC_VAR_ZERO_INIT_UNSPECIFIED /* @ref eMcem_c_REF_0410 に違反します */ /* @ref eMcem_c_REF_2001 に違反します */ #include "eMcem_MemMap.h" / * * * @brief ドライバの状態。 * @details eMCEM ドライバは、起動時または実行時に状態を EMCEM_S_UINIT から EMCEM_S_INITIALIZED に変更します。 * 構成ロックタイプがHARD_LOCKに設定されている場合、ドライバは構成をロックします * 状態を EMCEM_S_LOCKED に変更します。 */ eMcem_StateType eMcem_DriverState = EMCEM_S_UNINIT; #EMCEM_STOP_SEC_VAR_ZERO_INIT_UNSPECIFIED を定義します コードでは、eMcem_DriverState に明示的に値が割り当てられています。ここでの割り当ては0ですが、ルールによれば、データセクションに配置する必要があります。 変数のセグメント割り当てロジックを強制的に修正するようにコンパイラを設定できます。つまり、「コンテンツなし」に属する必要がある明示的にゼロ初期化された変数を、.data セグメント (コンテンツあり) から .bSS セグメント (コンテンツなし) に移動し、リンカー スクリプトの要件 (RAM 領域には「コンテンツなしセグメント」のみを配置できる) に準拠させて、混合配置の競合を解決します。しかし、これは根本的な問題の解決策ではないと思う。 この問題に対するより合理的な解決策はあるでしょうか? Re: S32K3+RTD400+SPD 1.0.4 link file こんにちは@Neo1096さん、 このThreadのリンカーファイルを使用できますか? https://community.nxp.com/t5/S32K/S32K3-SPD-DMA/mp/2139734 BR、ダニエル
View full article
eIQ Toolkit: can't find available models Hi there,  I'm trying to become familiar with the eIQ Toolkit, Neutron converter, and all the available tools for AI/ML from NXP. I'm developing on an i. MX95 board, and it features a powerful NPU core for running models.  Reading the EIQTUG guide, the latest release is 31 Jul 2025. I found (5.8.5 chapter) a list of supported models for the Neutron Software. This lists a lot of models, compatible with the iMX95 chip.  Where can I find these models? How can I integrate and test them? How can I customize them to fit my use cases? The actual version of the tool I'm using is v1.16.0 Thanks a lot,  Simone Linux
View full article
NTAG5 リンク ED 設定しない こんにちは、 私は NTAG5 リンクを使用して、1) エネルギーを収穫し、2) MCXC041 用の NFC 通信を構築しています。 しかし、SYNCH_DATA_BLOCK を 0x00 (最初のブロック) に設定し、最初のブロック (正確には 4 バイト) に書き込むと、ED が設定されない (つまり、ED が 0 にならない) という問題があります。低くなります)。 私の設定: エネルギーハーベスティング / イベント情報検出 (0x3D) EH_CONFIG: 0x3D -> 2.7mA、3V、電力レベルチェックなしのエネルギーハーベスティング ED_CONFIG: 0x04 -> NFCからI2Cへのパススルー しかし、 SYNCH_BLOCK (0x0C) への書き込みも試みました Config_1 (0x37): 0x0B -> SRAm パススルーモード、SRAM 利用可能、NFC から I2C への転送方向 ターミネーター/同期ブロック (0x38) 0x00(最初のブロック)に設定 この構成で SRAM (0xD3) に書き込むと、ED が低くならないのはなぜでしょうか? Ntag5 リンク開発ボード OM2NTP5332 を使用します。 Re: NTAG5 Link ED Never set こんにちは@no4rgument 、良い一日を! パススルー モード (NFC から I2C) の実証済みの動作を維持するには、NFC デバイスは SRAM の 256 バイトすべてを書き込み、ホストも同様に 256 バイトすべてを読み取る必要があります。これは、他の操作ではこのCASEのように予期しない動作が発生する可能性があるためです。 ED ピンとは別に、SRAM に書き込まれたデータの準備によってステータス レジスタの SRAM_DATA_READY ビットも設定され、アービタによって I2C へのインターフェースがロックされることに留意してください。 よろしくお願いいたします。 ダニエル Re: NTAG5 Link ED Never set 双方向データ交換の PDF をありがとうございます。非常に役に立ちました。しかし、ED が設定されるのは、ブロック 3Fh のみを書き込んだ場合ではなく、ブロック 3Fh までのすべてのブロックを書き込んだ場合のみであることがわかりました。ただし、I2C 経由でブロック 3Fh のみを読み取るとリセットされます。 SO、パススルー モードで ED を起動するために、すべてのブロックより少ない量を書き込むことはできないということですか? Re: NTAG5 Link ED Never set こんにちは@no4rgument 、良い一日を! 設定とアプリケーションの目的について、さらに詳しく教えていただけますか? 現在、MCXC041 を NTAG5 の I2C ホストとして使用していますか?SO、NFC 経由でタグとどのように通信していますか? SYNCH_DATA_BLOCK のバイト 0 と 1 は、NFC 経由でのみ読み取りまたは書き込みが行われるときに ED ピンをアクティブ化するユーザー メモリ内のブロックのアドレスを定義することに注意してください。これらのバイトは両方とも 0x00h に設定されていますか? この動作を可能にするには、ED_CONFIG ブロックを、ユーザー メモリ ブロックが読み取られたかどうかを検出するために 0x0B (SYNCH_ BLOCK から読み取り) に設定するか、ブロックが書き込まれたかどうかを検出するために 0x0C (SYNCH_ BLOCK に書き込み) に設定する必要があります。NTAG 5 リンク - NFC フォーラム準拠の I2C ブリッジのセクション 8.1.3.19 を参照してください。 ただし、アプリケーションの目的がパススルー通信を有効にすることである場合、このシナリオで従う必要があるプロセスの詳細な説明については、「NTAG 5 - 双方向データ交換」を参照してください。 よろしくお願いいたします。 ダニエル
View full article
在 IMX8 上向 OEM CLOSED 转发生命周期后,是否写入了某个熔丝? Hello 在参考了下面的 URL 并阅读了 uboot 代码后,我知道了如何通过调用 sc_seco_forward_lifecycle(ipc, 16) 让 seco 设置,将生命周期转发到 OEM CLOSED。 https://github.com/nxp-imx/uboot-imx/blob/lf-6.12.20-2.0.0/doc/imx/ahab/guides/mx8_mx8x_secure_boot.txt 我的问题是: 我想知道在设置生命周期时实际设置了哪个寄存器或熔丝。 我看了数据表,但上面没有描述。这些信息是否对用户保密? Re: After forwardding life cycle to OEM CLOSED on IMX8, is a certain fuse written? 您好, 感谢您对恩智浦半导体产品的关注, 如图所示,SECO 会处理将芯片发送到另一个生命周期状态的调用,SECO 在内部存储和管理该调用。 此致
View full article
S32K146 发送延迟 您好 我们正在开发基于 S32K146 MCU 和 CANFD 通信的引导加载器软件。 但是我们遇到了一个真正让我们感到困惑的问题,那就是ECU以灵活的延迟传输消息,有时它会在收到测试请求后的1毫秒内将积极的响应传输到CAN总线,有时候延迟真的 “大”,接近224毫秒,超过了CAN_TP的传输计时器限制(As)。谁能帮我解决这个问题? 有关我们 ECU 的信息如下所示,并附有图片: 应使用 2 MB 来接收 2 条信息(物理地址 ID:0x714,功能地址 ID:0x7DF); 2.传输 1 个信息应使用 1 MB(ID:0x794)。 3.CANFD 仲裁波特率为 500K/s,数据字段波特率为 2MB/s 4。帧 DLC 为 64 字节。 5。我们在引导加载程序软件中不使用中断来接收或传输,而是使用轮询类型。 6.我们的收发器是 TLE9263 7.我们的 CAN 时钟源是 SYS_CLK(80MHZ) 8。在写入 MB 之前,我在 CAN_Write 函数中放了一个监测点。并测量了监测点与使用逻辑分析器将消息传输到 CantX PIN 之间的持续时间,结果是:写入 MB 后,将正响应传输到 CAN Tx PIN 需要将近 223.95 毫秒。(请参考附图)。 这种巨大的延迟似乎不是仲裁造成的,因为使用的总 MB 数只有 7,而且 CAN 环路中除了我们的 ECU 和测试仪(CANOE VIN1640)外没有其他节点。 我的 CAN_init() 函数发布如下: void Can_Init(void) { /** * GPIO * CAN_RX U4_9_CAN0_RX PE4 ALT5 * CAN_TX U4_8_CAN0_TX PE5 ALT5 */ PORTE->PCR[4] = PORT_PCR_MUX(5); PORTE->PCR[5] = PORT_PCR_MUX(5); #if CAN_FD == CAN_FD_TYPE_EN uint32_t i = 0; uint32_t tempECR; uint32_t WaitCounter = 0; /* 时钟 */ PCC->PCCn[PCC_FlexCAN0_INDEX] |= PCC_PCCn_CGC_MASK; /* CGC=1:启用 FlexCAN0 的时钟 */ /* CAN */ CAN0->MCR |= CAN_MCR_SOFTRST_MASK; CAN0->MCR |= CAN_MCR_MDIS_MASK; /* MDIS=1:在选择时钟前禁用模块 */ WaitCounter = 0; while(!((CAN0->MCR& CAN_MCR_SOFTRST_MASK)>> CAN_MCR_SOFTRST_SHIFT)){WaitCounter++;} CAN0->IMASK1 = 0x00000000ul; CAN0->ESR1&= ~CAN_ESR1_BOFFINT_MASK; CAN0->CTRL1 |= (CAN_CTRL1_CLKSRC(1) /* CLKsrc=1:时钟源 = SYS_CLK (80 MHz) */ |CAN_CTRL1_BOFFMSK(0) /* 启用总线关闭中断 */ |CAN_CTRL1_BOFFREC(0)); /* 启用总线关闭自动恢复。*/ CAN0->MCR&= ~CAN_MCR_MDIS_MASK; /* MDIS=0; 启用模块配置。(设置 FRZ、HALT)*/ CAN0->MCR |= (CAN_MCR_FRZ_MASK | CAN_MCR_HALT_MASK); WaitCounter = 0; while(!((CAN0->MCR& CAN_MCR_FRZACK_MASK)>> CAN_MCR_FRZACK_SHIFT)){WaitCounter++;} /* 良好做法:进入/退出冻结模式时等待 FRZACK=1 */ tempECR = CAN0->ECR; CAN0->ECR = 0x00000000UL; tempECR = tempECR; /* 配置标称相位:500 KHz 位时间,80 MHz Sclock */ CAN0->CBT = CAN_CBT_BTF(1) /* 位时间定义启用。*/ |CAN_CBT_EPRESDIV(1) /* EPRESDIV = 预分频器 + 1 = 2 */ |CAN_CBT_EPSEG2(15) /* EPSEG2 = 15 */ |can_cbt_epseg1(15) /* epseg1 = 15 */ |can_cbt_epropseg(46)/* epropseg = 46 */ |can_cbt_erjw(15);/* ERJW = 15 */ /* BITRATEn =Fcanclk /( [(1 + (EPSEG1+1) + (EPSEG2+1) + (EPROPSEG + 1)] x (EPRESDIV+1)) = 80 MHz /( [(1 + ( 15 +1) + ( 15 +1) + ( 46 + 1)] x ( 1 +1)) = 80 MHz/( [1+16+16+47] x 2) = 80 MHz /(80x2) = 500 Kz 采样点 = (3 + PSEG1 + PROPSEG) /(4+ PSEG1 + PSEG2 + PROPSEG) (17 + 15 + 46) /(18 + 15 + 15 + 46) = 80% */ /* 配置数据相位:2 MHz 位时间、80 MHz Sclock */ CAN0->fdcbt = can_cbt_epseg2(3) /* fpseg2 = 3 */ |can_cbt_epseg1(7) /* epseg1 = 7 */ |can_cbt_epropseg(7) /* fpropseg = 7 */ |can_cbt_erjw(3) /* frjw = 3 */ |can_fdcbt_fpresdiv(1);/* FPRESDIV = Prescaler + 1 = 2 */ /* BITRATEf = Fcanclk /( [(1 + (FPSEG1+1) + (FPSEG2+1) + (FPROPSEG)] x (FPRESDIV+1)) = 80 MHz /( [(1 + ( 7 +1) + ( 3 +1) + ( 7 )] x ( 1 +1)) =80 MHz /( [1+8+4+7] x 2) = 80 MHz /(20x2) = 80 MHz / 40 = 2 MHz 采样点 = (2 + PSEG1 + PROPSEG) /(3 + PSEG1 + PSEG2 + PROPSEG) (4+ 7 + 7) /(5 + 7 + 3 + 7) = 80% */ CAN0->FDCTRL = CAN_FDCTRL_FDRATE(1) /* BRS=1:启用帧头中的比特率开关,配置比特率开关、数据大小、transcv'r 延迟 */ |CAN_FDCTRL_MBDSR0(3) /* MBDSR0=3:区域 0 在帧有效载荷中有 64 字节数据,7Mb */ |CAN_FDCTRL_TDCEN(1) /* MBDSR1: 不适用 */ |CAN_FDCTRL_TDCOFF(31); /* 收发器延迟补偿偏移 15 */ /* PRIO = 0:使用 CANFD,启用 ISO CAN FD 的 CRC 校验 */ CAN0->CTRL2 |= CAN_CTRL2_TASD(30) | CAN_CTRL2_ISOCANFDEN(1); /* TDCEN=1:启用收发器延迟补偿 */ /* TDCOFF=5:使用 5 个 CAN 时钟(300us)偏移 */ for(i = 0; i< 128u; i++) { /* CAN0:清除 FlexCAN 0 中的 128 字 RAM 清除 msg buf 字。所有缓冲区 CODE=0 (非活动) */ CAN0->RAMn[i] = 0; } for(i=0; i< 16u; i++ ) { /* 在 FRZ 模式下,初始化 CAN0 16 msg buf 过滤器 检查所有 ID 位,以接收信息*/ CAN0->RXIMR[i] = 0x1ffffffffful; } /* 全局接受掩码:检查所有 ID 位 */ CAN0->RXMGMASK = 0xFFFFFFFFul; CAN0->RX14MASK = 0xFFFFFFFFul; CAN0->RX15MASK = 0xFFFFFFFFul; /* 报文缓冲区 0 - 接收设置:*/ /* Msg Buf 0,字 0:启用接收 */ /* EDL = 1:CAN FD 的扩展数据长度 */ /* BRS = 1:启用比特率开关 */ /* ESI = 0:错误状态 */ /* CODE = 4:MB 设置为 RX 非活动 */ /* IDE = 0:标准 ID */ /* SRR、RTR、TIME STAMP = 0:不适用 */ CAN0->RAMn[0 * CAN_MSG_BUF_SIZE + 0] = CAN_RAMn_EDL(1) + CAN_RAMn_BRS(1) + CAN_RAMn_ESI(0) + CAN_RAMn_CODE(CAN_MSG_BUF_RX_EMPTY) + CAN_RAMn_IDE(0) + CAN_RAMn_SRR(0) + CAN_RAMn_RTR(0) ; CAN0->RAMn[0 * CAN_MSG_BUF_SIZE + 1] = ((uint32_t)ID_REQUEST_PHY)<< 18u; // CAN0->RXIMR[0] = (((uint32_t)(~(ID_REQUEST_PHY ^ ID_REQUEST_FUN))) << 18u)& 0x1ffffffful; 0 CAN->RXIMR[0] = 0x1ffffffful; CAN0->RAMn[1 * CAN_MSG_BUF_SIZE + 0] = CAN_RAMn_EDL(1) + CAN_RAMn_BRS(1) + CAN_RAMn_ESI(0) + CAN_RAMn_CODE(CAN_MSG_BUF_RX_EMPTY) + CAN_RAMn_IDE(0) + CAN_RAMn_SRR(0) + CAN_RAMn_RTR(0); CAN0->RAMn[1 * CAN_MSG_BUF_SIZE + 1] = ((uint32_t)ID_REQUEST_FUN)<< 18u; CAN0->RXIMR[1] = 0x1ffffffful; CAN0->MCR = 0x00030806ul; /* 否定 FlexCAN 0 停止状态& 启用 CAN FD 7 MBs */ gs_CanControllerStatus[0] = CAN_STATUS_IDLE; WaitCounter = 0; while ((CAN0->MCR& CAN_MCR_FRZACK_MASK)>> CAN_MCR_FRZACK_SHIFT){WaitCounter++;} /* 良好做法:等待 FRZACK 清除(非冻结模式) */ WaitCounter = 0; while ((CAN0->MCR& CAN_MCR_NOTRDY_MASK)>> CAN_MCR_NOTRDY_SHIFT){WaitCounter++;} } 而我的 Can_write()function 发布如下: bl_Error_t Can_Write(bl_CanHandle_t handle, const bl_Buffer_t *buffer, bl_Size_t size) { #if CAN_FD == CAN_FD_TYPE_EN bl_Error_t ret = BL_ERR_NOT_OK; uint32_t Can_ID = 0x0; uint8_t Tx_handle = 0; uint8_t dlc; CAN_message_t msg_tx; dlc = Can__SizeToDlc(size); if (handle> CAN_TXHANDLE_NUM) { return ret; } Tx_handle = g_CanTxHandleCfg[handle].controller; if (gs_CanControllerStatus[Tx_handle] != CAN_STATUS_IDLE) { ret = BL_ERR_CAN_BUSY; return ret; } Can_ID = g_CanTxHandleCfg[handle].id。<< 18; do { for (uint8_t i = 0; i< CAN_MAX_NUMBER_OF_CONTROLLER; i++) { if (gs_CanControllerCfg[i].usage == CAN_CONTROLLER_UNUSED) { continue; } if ((tx_Handle == gs_canControllerCfg [i] .phyID) & & (CAN_STATUS_IDLE == gs_canControllerStatus [i])) {msg_tx.id = can_ID;can__copyData(msg_tx.data.bytes,缓冲区,大小); msg_tx.length = dlc;t le9261_Write (0x40,0x5F);/*这是我放在这里的软件监控点*/ S 32K_CAN (tx_Handle) .ramn [CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 17] = SWAP_UINT32 (msg_tx.data.longs [15]]);//((uint32_t) 缓冲区 [60])<< 24 | ((uint32_t)buffer[61])<< 16 | ((uint32_t)buffer[62])<< 8 | ((uint32_t)buffer[63]); S32K_CAN(Tx_handle)。RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 16] = SWAP_UINT32(msg_tx.data.longs[14]);//((uint32_t)buffer[56])<< 24 | ((uint32_t)buffer[57])<< 16 | ((uint32_t)buffer[58])<< 8 | ((uint32_t)buffer[59]); S32K_CAN(Tx_handle)。RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 15] = SWAP_UINT32(msg_tx.data.longs[13]);//((uint32_t)buffer[52])<< 24 | ((uint32_t)buffer[53])<< 16 | ((uint32_t)buffer[53])<< 8 | ((uint32_t)buffer[55]); S32K_CAN(Tx_handle)。RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 14] = SWAP_UINT32(msg_tx.data.longs[12]);//((uint32_t)buffer[48])<< 24 | ((uint32_t)buffer[49])<< 16 | ((uint32_t)buffer[50])<< 8 | ((uint32_t)buffer[51]); S32K_CAN(Tx_handle)。RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 13] = SWAP_UINT32(msg_tx.data.longs[11]);//((uint32_t)buffer[44])<< 24 | ((uint32_t)buffer[45])<< 16 | ((uint32_t)buffer[46])<< 8 | ((uint32_t)buffer[47]); S32K_CAN(Tx_handle)。RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 12] = SWAP_UINT32(msg_tx.data.longs[10]);//((uint32_t)buffer[40])<< 24 | ((uint32_t)buffer[41])<< 16 | ((uint32_t)buffer[42])<< 8 | ((uint32_t)buffer[43]); S32K_CAN(Tx_handle)。RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 11] = SWAP_UINT32(msg_tx.data.longs[9]);//((uint32_t)buffer[36])<< 24 | ((uint32_t)buffer[37])<< 16 | ((uint32_t)buffer[38])<< 8 | ((uint32_t)buffer[39]); S32K_CAN(Tx_handle)。RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 10] = SWAP_UINT32(msg_tx.data.longs[8]);//((uint32_t)buffer[32])<< 24 | ((uint32_t)buffer[33])<< 16 | ((uint32_t)buffer[34])<< 8 | ((uint32_t)buffer[35]); S32K_CAN(Tx_handle)。RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 9] = SWAP_UINT32(msg_tx.data.longs[7]);//((uint32_t)buffer[28])<< 24 | ((uint32_t)buffer[29])<< 16 | ((uint32_t)buffer[30])<< 8 | ((uint32_t)buffer[31]); S32K_CAN(Tx_handle)。RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 8] = SWAP_UINT32(msg_tx.data.longs[6]);//((uint32_t)buffer[24])<< 24 | ((uint32_t)buffer[25])<< 16 | ((uint32_t)buffer[26])<< 8 | ((uint32_t)buffer[27]); S32K_CAN(Tx_handle)。RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 7] = SWAP_UINT32(msg_tx.data.longs[5]);//((uint32_t)buffer[20])<< 24 | ((uint32_t)buffer[21])<< 16 | ((uint32_t)buffer[22])<< 8 | ((uint32_t)buffer[23]); S32K_CAN(Tx_handle)。RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 6] = SWAP_UINT32(msg_tx.data.longs[4]);//((uint32_t)buffer[16])<< 24 | ((uint32_t)buffer[17])<< 16 | ((uint32_t)buffer[18])<< 8 | ((uint32_t)buffer[19]); S32K_CAN(Tx_handle)。RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 5] = SWAP_UINT32(msg_tx.data.longs[3]);//((uint32_t)buffer[12])<< 24 | ((uint32_t)buffer[13])<< 16 | ((uint32_t)buffer[14])<< 8 | ((uint32_t)buffer[15]); S32K_CAN(Tx_handle)。RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 4] = SWAP_UINT32(msg_tx.data.longs[2]);//((uint32_t)buffer[8]) << 24 | ((uint32_t)buffer[9])<< 16 | ((uint32_t)buffer[10])<< 8 | ((uint32_t)buffer[11]); S32K_CAN(Tx_handle)。RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 3] = SWAP_UINT32(msg_tx.data.longs[1]);//((uint32_t)buffer[4]) << 24 | ((uint32_t)buffer[5])<< 16 | ((uint32_t)buffer[6])<< 8 | ((uint32_t)buffer[7]); S32K_CAN(Tx_handle)。RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 2] = SWAP_UINT32(msg_tx.data.longs[0]);//((uint32_t)buffer[0]) < < 24 | ((uint32_t) 缓冲区 [1]) < < 16 | ((uint32_t) 缓冲区 [2]) < < 8 | ((uint32_t) 缓冲区 [3]); S32K_CAN (tx_Handle) .RAMN [CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 1] = can_ID; /* MB8 字 1:给定 ID 的 Tx 消息 */ S32K_CAN (Tx_Handle) .ramn [CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 0] = can_RAMN_EDL (1) /* EDL=1 CAN FD 格式帧*/ |can_RAMN_BRS (1) /* BRS=1:在 msg 内部切换比特率 */ |can_RAMN_ESI (0) /* ESI=0:???*/ |can_RAMN_CODE (CAN_TX_MB_CODE_TRANS) /* code=0xC:激活 msg buf 进行传输 */ |can_RAMN_SRR (0) /* SRR=1 Tx 帧(STD ID 不需要)*/ |can_RAMN_IDE (0) /* IDE=0:STD ID */ |can_RAMN_RAMN_RM tR (0) /* RTR = 0:数据,不是远程发送请求帧*/ |can_RAMN_DLC (dlc);/* dlc=x;1,2,3,4,5,6,7,8、9-12,10-16、11-20、12-24、13-32、14-48、15-64 字节 */ // while (!(S32K_CAN(Tx_handle).IFLAG1& 0x100)) {}; /* 等待 CAN 0 MB 8 标志 */ // S32K_CAN(Tx_handle).IFLAG1 = 0x00000100; /* 清除 CAN 0 MB 8 标志而不清除其他标志*/ gs_CanControllerStatus[i] = CAN_STATUS_TRANSMITTING; ret = BL_ERR_OK; }} } } while(0); return ret; } Re: Re S32K146 Transmit Delay 您好, 在不知道确切设置和所用代码的情况下,我无法准确解释这种行为的原因。例如,在仲裁扫描整个 MB 之前写入任何 MB 的 CS 字。 仲裁过程会扫描 MB,寻找包含下次发送信息的传输 MB。扫描从最低的 MB 开始,一直扫描到较高的 MB。如果 MB0 用于传输,则在向该 MB 写入数据后,仲裁过程立即开始,并可立即找到获胜者。 BR, Petr Re: Re S32K146 Transmit Delay 你好,彼得斯 我试着调整了 MB 序列,它可以正常传输,但我仍然不明白为什么它可以正常传输的深层逻辑是什么?让我简单介绍一下我的方法: 我调整了用于接收或发送的 MB 索引,即原来 MB0 用于接收物理地址诊断信息(ID:0x714),MB1 用于接收功能地址诊断信息(ID:0x7DF),MB6 用于发送 ECU 响应信息(ID:0x794)。 新的信息是MB0 用于发送 ECU 响应信息(ID:0x794),MB1 用于接收物理地址诊断信息(ID:0x714),MB2 用于接收功能地址诊断信息(ID:0x7DF)。 调整后,我的 ECU 可以正常接收或发送信号。所以我猜测是不是因为 MB6 在 flexCAN0 中未能赢得仲裁,所以 ECU 不会将报文传送到 SMB?因为我只有一条报文要传送,所以似乎没有其他 MB 与 MB6 进行仲裁。 如果 MB 在需要开始新的传输时仍在传输,我也会尝试中止传输。 非常感谢。 Re: Re S32K146 Transmit Delay 您好, 看起来,由于某种原因,在写入 MB 后,仲裁没有开始或没有结束,信息没有移出 TX SMB。由于总线处于空闲状态,因此应正常运行。 然后,如果收到另一个报文,则在 CRC 部分开始新的仲裁,(从单个 TX MB 中)选出优胜者并移出至 SMB。终于在第一时间转发了。 但还有图片 “新收到的请求触发信号了最后一个请求的响应传输。” 显示您在成功传输之前实际更新了 TX MB。如果检查了 MB 传输/可用性是否正确,则不应到达监测点 1。 不知道该提出什么建议。检查系统和模块时钟。检查代码,确保 TX 是在上一次传输完成时写入的。你在代码中禁用/中止了 MB 吗? BR, Petr Re S32K146 Transmit Delay 您好 非常感谢你的答复。我想回答您的第一个问题,我在这里引用了",因此从 MeasurementStartPoint,jpg 我看到接收到 0x714 消息,大约 150us 后在 SPI SOUT 上发送了 0x5FC0,这个帧是否等同于代码中使用的 TLE9261_Write(0x40,0x5F)?" 是的,它相当于代码中使用的 TLE9261_Write(0x40,0x5F)。 对于测量停止点,我在我的代码中引入了另一个 2 TLE9261_Write(0x40,0x5F) 函数,你可以在随附的名为 “监测点” 的图片中看到它们,我也在这里发布了我的代码: bl_Error_t Can_Write(bl_CanHandle_t handle, const bl_Buffer_t *buffer, bl_Size_t size) { bl_Error_t ret = BL_ERR_NOT_OK; uint32_t Can_ID = 0x0; uint8_t Tx_handle = 0; uint8_t dlc; CAN_message_t msg_tx; dlc = Can__SizeToDlc(size); if (handle> CAN_TXHANDLE_NUM)     { return ret;    } Tx_handle = g_CanTxHandleCfg[handle].控制器; 如果 (gs_CanControllerStatus[Tx_handle] != CAN_STATUS_IDLE)     { ret = BL_ERR_CAN_BUSY; return ret;    } Can_ID = g_CanTxHandleCfg[句柄].id<< 18; 做     { for (uint8_t i = 0; i< CAN_MAX_NUMBER_OF_CONTROLLER; i++) { 如果 (gs_CanControllerCfg[i].usage == CAN_CONTROLLER_UNUSED) { 继续        } 如果 ( (Tx_handle == gs_CanControllerCfg[i].phyId) && (CAN_STATUS_IDLE == gs_CanControllerStatus[i])) { msg_tx.id = Can_ID; can__copyData(msg_tx.data.bytes、缓冲区、大小); msg_tx.length = dlc; tle9261_Write (0x40, 0x5F); /*监测点 1*/ S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 17] = SWAP_UINT32(msg_tx.data.longs[15]);//((uint32_t)buffer[60])<< 24 | ((uint32_t)buffer[61])<< 16 | ((uint32_t)buffer[62])<< 8 | ((uint32_t)buffer[63]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 16] = SWAP_UINT32(msg_tx.data.longs[14]);//((uint32_t)buffer[56])<< 24 | ((uint32_t)buffer[57])<< 16 | ((uint32_t)buffer[58])<< 8 | ((uint32_t)buffer[59]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 15] = SWAP_UINT32(msg_tx.data.longs[13]);//((uint32_t)buffer[52])<< 24 | ((uint32_t)buffer[53])<< 16 | ((uint32_t)buffer[53])<< 8 | ((uint32_t)buffer[55]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 14] = SWAP_UINT32(msg_tx.data.longs[12]);//((uint32_t)buffer[48])<< 24 | ((uint32_t)buffer[49])<< 16 | ((uint32_t)buffer[50])<< 8 | ((uint32_t)buffer[51]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 13] = SWAP_UINT32(msg_tx.data.longs[11]);//((uint32_t)buffer[44])<< 24 | ((uint32_t)buffer[45])<< 16 | ((uint32_t)buffer[46])<< 8 | ((uint32_t)buffer[47]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 12] = SWAP_UINT32(msg_tx.data.longs[10]);//((uint32_t)buffer[40])<< 24 | ((uint32_t)buffer[41])<< 16 | ((uint32_t)buffer[42])<< 8 | ((uint32_t)buffer[43]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 11] = SWAP_UINT32(msg_tx.data.longs[9]);//((uint32_t)buffer[36])<< 24 | ((uint32_t)buffer[37])<< 16 | ((uint32_t)buffer[38])<< 8 | ((uint32_t)buffer[39]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 10] = SWAP_UINT32(msg_tx.data.longs[8]);//((uint32_t)buffer[32])<< 24 | ((uint32_t)buffer[33])<< 16 | ((uint32_t)buffer[34])<< 8 | ((uint32_t)buffer[35]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 9] = SWAP_UINT32(msg_tx.data.longs[7]);//((uint32_t)buffer[28])<< 24 | ((uint32_t)buffer[29])<< 16 | ((uint32_t)buffer[30])<< 8 | ((uint32_t)buffer[31]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 8] = SWAP_UINT32(msg_tx.data.longs[6]);//((uint32_t)buffer[24])<< 24 | ((uint32_t)buffer[25])<< 16 | ((uint32_t)buffer[26])<< 8 | ((uint32_t)buffer[27]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 7] = SWAP_UINT32(msg_tx.data.longs[5]);//((uint32_t)buffer[20])<< 24 | ((uint32_t)buffer[21])<< 16 | ((uint32_t)buffer[22])<< 8 | ((uint32_t)buffer[23]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 6] = SWAP_UINT32(msg_tx.data.longs[4]);//((uint32_t)buffer[16])<< 24 | ((uint32_t)buffer[17])<< 16 | ((uint32_t)buffer[18])<< 8 | ((uint32_t)buffer[19]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 5] = SWAP_UINT32(msg_tx.data.longs[3]);//((uint32_t)buffer[12])<< 24 | ((uint32_t)buffer[13])<< 16 | ((uint32_t)buffer[14])<< 8 | ((uint32_t)buffer[15]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 4] = SWAP_UINT32(msg_tx.data.longs[2]);//((uint32_t)buffer[8]) << 24 | ((uint32_t)buffer[9])<< 16 | ((uint32_t)buffer[10])<< 8 | ((uint32_t)buffer[11]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 3] = SWAP_UINT32(msg_tx.data.longs[1]);//((uint32_t)buffer[4]) << 24 | ((uint32_t)buffer[5])<< 16 | ((uint32_t)buffer[6])<< 8 | ((uint32_t)buffer[7]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 2] = SWAP_UINT32(msg_tx.data.longs[0]);//((uint32_t)buffer[0]) << 24 | ((uint32_t)buffer[1])<< 16 | ((uint32_t)buffer[2])<< 8 | ((uint32_t)buffer[3]); S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 1] = Can_ID;/* MB8 字 1:给定 ID 的 Tx msg */ tle9261_Write (0x40, 0x5F); /*监测点 2*/ S32K_CAN(Tx_handle).RAMn[CAN_USED_HRH_NUM*CAN_MSG_BUF_SIZE + 0] = CAN_RAMn_EDL(1) /* EDL=1 CAN FD 格式帧*/ |CAN_RAMn_BRS(1) /* BRS=1:比特率在 msg 内部切换 */ |CAN_RAMn_ESI(0) /* ESI=0: ???*/ |CAN_RAMn_CODE(CAN_TX_MB_CODE_TRANS) /* CODE=0xC:激活 msg buf 发送 */ |can_ramn_srr (0) /* SRR=1 Tx 帧(STD ID 不需要)*/ |CAN_RAMn_IDE(0) /* IDE=0:标准 ID */ |CAN_RAMn_RTR(0) /* RTR = 0:数据,不是远程发送请求帧*/ |CAN_RAMn_DLC(dlc); /* DLC=x; 1,2,3,4,5,6,7,8, 9-12,10-16, 11-20, 12-24, 13-32, 14-48, 15-64bytes */ tle9261_Write (0x40, 0x5F); /*监测点 3*/ // while (!(S32K_CAN(Tx_handle).IFLAG1& 0x100)) {}; /* 等待 CAN 0 MB 8 标志 */ // S32K_CAN(Tx_handle).IFLAG1 = 0x00000100; /* 清除 CAN 0 MB 8 标志,但不清除其他标志*/。 gs_CanControllerStatus[i] = CAN_STATUS_TRANSMITTING; ret = BL_ERR_OK;        }      } } while(0); return ret; } 将第一个监测点放在 MB 的设置 ID 之前,将第 2 个监测器代码放在将 MB 的代码更新为 0xC(传输)之前,将第 3 个监测点放在更新 MB 要传输的代码之后。 我调试了代码,发现了以下两种现象: 1。首先我发送一个诊断请求服务来读取 DID,测试在总线上发送 0x22 F1 87,但是 ECU 没有响应。从随附的名为 “收到请求但没有响应” 的图片中,您可以看到 ECU 实际收到了请求消息,它将发送响应并更新 MB(此快照中捕获了监测点 1、2 和 3),但是 CAN Tx PIN 上没有监测任何响应消息; 2。然后我监测了 ESR1、IFALG1 和 RAM 寄存器,发现传输 MB 的代码已成功更新为 0xC(传输),并且 CAN 总线处于空闲状态 ESR1 寄存器中没有其他错误,但是消息没有在 CantX 上传输,似乎 FlexCan0 还没准备好开始传输,这导致消息卡在 SMB 中; 3.第三,我尝试发送另一个诊断请求,所以我发送了 0x10 01 服务,然后使用 0x62 F1 87 快速响应 ECU... 你可以在附图中看到名为 “新收到的请求触发信号了上次请求响应的传输。”。该消息是在执行监测点 1、2、3 的代码之前传输的。所以看来一条新的请求消息会触发信号ECU传输上次请求的响应!!!这似乎太不合理了... 我真的需要您的帮助来解决这个问题,非常感谢。 Re: S32K146 Transmit Delay 您好, 因此,从 MeasurementStartPoint,jpg 我看到接收到 0x714 报文,大约 150us 后在 SPI SOUT 上发送 0x5FC0,这一帧是否等同于代码中使用的 TLE9261_Write(0x40,0x5F)? 发送 TX 报文时,您是否可以放大停止时间? CAN 报文之间的周期性 (30us)SPI 传输是什么?代码中是如何处理的? 如果要测试 TLE9261_Write(0x40,0x5F) 和 MB6 CS 字写入之间的代码是否被中断,只需在之前/之后禁用/启用中断即可。 BR, Petr Re: S32K146 Transmit Delay 你好,彼得斯 非常感谢您的回复。让我先澄清几点。 1.关于 TDCOFF,我参考了射频手册,并使用客户 CAN Spec 中定义的参数进行了计算,因此我认为在这里没有问题。 2.在我的代码中,MB0 用于接收物理地址 ID(0x714)信息,MB1 用于接收功能地址 ID(0x7DF)信息;MB2-MB5 为保留,MB6 用于发送。由于 S32K146 Flex CAN0 为 7 MB 的那些有效载荷为 64 字节的消息,所以我的代码中的 CAN_USED_HRH_NUM 是 6。 3. 对于总线仲裁,我明白你的意思,很抱歉在我的照片中遗漏了一些快照。我把它们添加到了这里,请参考附件中的内容。在我的测试台中只有一个节点,那就是我的 ECU,除了测试仪(Vector CANOE VIN1640)之外,没有其他节点与我的 ECU 进行仲裁。为了在完成闪烁后唤醒 ECU,我发送了一条周期为 100ms 的 NM 信息。因此,从我的角度来看,这种延迟不应归因于总线仲裁。 4。为了捕获延迟发生的位置,我在代码中放了一个监测点,那就是 TLE9261_Write(你在回复中也提到了这一点)。通过这样做,我可以捕获通过调用 tle9261_Write () 触发信号的 SPI 信号,这是我的逻辑分析器项目中的测量起点,这意味着这个点就在传输消息之前(将数据写入发送 MB 还会更新 MB 的 CS 代码);而且我还在 canRx 和 cantX PIN 中测量数据;通过这样做,我发现了我拨打 TLE9261_之间的延迟 Write () 然后发送到 CAN Tx PIN 的消息差不多 223 毫秒!!真够长的。您可以在附件中看到我的测量结果。 5.因此,我猜延迟可能来自 TLE9261_Write 和 CAN_USED_HRH_NUM MB CS 字写入之间的代码,正如您在回复中所说的那样。但我在引导加载程序代码中使用的唯一中断是系统 tick(用来计算时间)和 hardfault(用来处理某些故障情况)。我想,这应该不会造成这么大的延误。 因此,能否请您再次检查这些信息,并帮我找出延迟的原因? 非常感谢。 Re: S32K146 Transmit Delay 您好, 您的 CAN init 看起来正常。只有 TDC 在 2Mbit 时根本不需要,反正 TDCOFF 看起来配置得很好。您也可以尝试保留默认的 TASD 值,但我不指望会有什么不同。 因此,从描述来看,只有一个 MB 用于传输,从你的代码来看,它是 CAN_USED_HRH_NUM(值?)。如果写入此消息缓冲区CS字,则MB开始参与仲裁程序,应被选为赢家并移至TX SMB,等待总线上的第一个机会真正传输。如果总线上还有其他ID较低的消息,则延迟可能由于总线仲裁而出现。因此,检查一下,您写的没有连接其他节点,但是 RX 消息中的一个具有更高的仲裁值(较低 ID)。 另一个延迟来源可能是代码本身。TLE9261_WRITE 和 CAN_USED_HRH_NUM MB CS 文字写作之间有一些代码。你确定这不会被其他代码/任务打断,所以在这里添加更多 SW 延迟吗? 此外,在传输过程中检测到的错误也会延迟实际传输,但是您可能会在总线/CAN 工具上看到错误的消息和错误消息。 BR, Petr
View full article
Problems with lpc5606 Hello everyone, I recently switched from keil to MCUXpressoide, but encountered a bit of a problem, when I ported the program from keil to MCUXpressoide, compiled no problem, but after downloading it to let him run, it feels that he is running very slowly, because there is a three-digit digital tube on the board, the digital tube refreshes strangely, three 8- >three 0- >Specific numbers - >a certain one, please have any ideas? LPC546xx Re: 使用lpc5606遇到的问题 Thank you for your reply, so far I have solved this problem, I added osgi.nl=en_US in the config.ini file and the compiler changed to English language! Re: 使用lpc5606遇到的问题 Hello @xxxxyyyy Please show the code. Are you using GUI Guider? BR Alice. Re: 使用lpc5606遇到的问题 Sorry, it was my mistake, it was lpc54606, I've found the specific problem so far, it's the Chinese date displayed by the _date_ macro definition, do you know how to change it to English please. Re: 使用lpc5606遇到的问题 Hi @xxxxyyyy 1) LPC doesn't have LPC5606 series, are you using LPC5506? 2) It is recommended to check the clock configuration, after porting, the clock configuration maybe different, which affects the refresh speed. BR Alice. Re: 使用lpc5606遇到的问题 Hello, this is the case I'm currently showing an exception, I may not have described it clearly in my question, sorry! Re: 使用lpc5606遇到的问题 Hi @xxxxyyyy May I ask if the binary is burned directly to the board and run off the IDE (disconnected from the debugger). Are the actual operating results normal? BR Alice.
View full article
IMXRT1170-EVKB - SAI TDM Hello everyone, I'm trying to implement a SAI with TDM protocol for audio data transfer. Starting from sai_edma_tdm_record_playback without CS42448, I've changed few configurations in order to implement a loopback between SAI1_RX/TX. Links are: TX_BCLK -> RX_BCLK TX_SYNC -> RX_SYNC TX_DA0 -> RX_DA0 On an oscilloscope connected to TX_DA0, it is possible to see data sent but they are uncorrect. someone can explain to me how to correctly configure a TDM communication and what is wrong in the code below? Thanks a lot, -F AT_NONCACHEABLE_SECTION_ALIGN(static uint8_t Buffer[BUFFER_NUMBER * BUFFER_SIZE], 4); #if defined(DEMO_QUICKACCESS_SECTION_CACHEABLE) && DEMO_QUICKACCESS_SECTION_CACHEABLE AT_NONCACHEABLE_SECTION_INIT(sai_edma_handle_t txHandle); AT_NONCACHEABLE_SECTION_INIT(sai_edma_handle_t rxHandle); #else AT_QUICKACCESS_SECTION_DATA(sai_edma_handle_t txHandle); AT_QUICKACCESS_SECTION_DATA(sai_edma_handle_t rxHandle); #endif static uint32_t tx_index = 0U, rx_index = 0U; volatile uint32_t emptyBlock = BUFFER_NUMBER; edma_handle_t dmaTxHandle = {0}, dmaRxHandle = {0}; extern codec_config_t boardCodecConfig; codec_handle_t codecHandle; /******************************************************************************* * Code ******************************************************************************/ static void rx_callback(I2S_Type *base, sai_edma_handle_t *handle, status_t status, void *userData) { if (kStatus_SAI_RxError == status) { /* Handle the error. */ } else { emptyBlock--; } } static void tx_callback(I2S_Type *base, sai_edma_handle_t *handle, status_t status, void *userData) { if (kStatus_SAI_TxError == status) { /* Handle the error. */ } else { emptyBlock++; } } /*! * @brief Main function */ int main(void) { sai_transfer_t xfer; edma_config_t dmaConfig = {0}; sai_transceiver_t saiConfig; BOARD_InitHardware(); PRINTF("SAI TDM record playback example started!\n\r"); /* Init DMA and create handle for DMA */ EDMA_GetDefaultConfig(&dmaConfig); #if defined(BOARD_GetEDMAConfig) BOARD_GetEDMAConfig(dmaConfig); #endif EDMA_Init(EXAMPLE_DMA, &dmaConfig); EDMA_CreateHandle(&dmaTxHandle, EXAMPLE_DMA, EXAMPLE_TX_CHANNEL); EDMA_CreateHandle(&dmaRxHandle, EXAMPLE_DMA, EXAMPLE_RX_CHANNEL); #if defined(FSL_FEATURE_EDMA_HAS_CHANNEL_MUX) && FSL_FEATURE_EDMA_HAS_CHANNEL_MUX EDMA_SetChannelMux(EXAMPLE_DMA, EXAMPLE_TX_CHANNEL, EXAMPLE_SAI_TX_SOURCE); EDMA_SetChannelMux(EXAMPLE_DMA, EXAMPLE_RX_CHANNEL, EXAMPLE_SAI_RX_SOURCE); #endif #if defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT #if defined(EXAMPLE_DMAMUX_TX_CHANNEL) && defined(EXAMPLE_DMAMUX_RX_CHANNEL) /* Init DMAMUX */ DMAMUX_Init(EXAMPLE_DMAMUX_TX); DMAMUX_Init(EXAMPLE_DMAMUX_RX); DMAMUX_SetSource(EXAMPLE_DMAMUX_TX, EXAMPLE_DMAMUX_TX_CHANNEL, (uint8_t)EXAMPLE_SAI_TX_SOURCE); DMAMUX_EnableChannel(EXAMPLE_DMAMUX_TX, EXAMPLE_DMAMUX_TX_CHANNEL); DMAMUX_SetSource(EXAMPLE_DMAMUX_RX, EXAMPLE_DMAMUX_RX_CHANNEL, (uint8_t)EXAMPLE_SAI_RX_SOURCE); DMAMUX_EnableChannel(EXAMPLE_DMAMUX_RX, EXAMPLE_DMAMUX_RX_CHANNEL); #else /* Init DMAMUX */ DMAMUX_Init(EXAMPLE_DMAMUX); DMAMUX_SetSource(EXAMPLE_DMAMUX, EXAMPLE_TX_CHANNEL, (uint8_t)EXAMPLE_SAI_TX_SOURCE); DMAMUX_EnableChannel(EXAMPLE_DMAMUX, EXAMPLE_TX_CHANNEL); DMAMUX_SetSource(EXAMPLE_DMAMUX, EXAMPLE_RX_CHANNEL, (uint8_t)EXAMPLE_SAI_RX_SOURCE); DMAMUX_EnableChannel(EXAMPLE_DMAMUX, EXAMPLE_RX_CHANNEL); #endif #endif /* SAI init */ SAI_Init(DEMO_SAI); SAI_TransferTxCreateHandleEDMA(DEMO_SAI, &txHandle, tx_callback, NULL, &dmaTxHandle); SAI_TransferRxCreateHandleEDMA(DEMO_SAI, &rxHandle, rx_callback, NULL, &dmaRxHandle); /* TDM mode configurations */ SAI_GetTDMConfig(&saiConfig, kSAI_FrameSyncLenOneBitClk, DEMO_AUDIO_BIT_WIDTH, DEMO_AUDIO_DATA_CHANNEL, kSAI_Channel0Mask); saiConfig.frameSync.frameSyncEarly = true; saiConfig.masterSlave = kSAI_Master; SAI_TransferTxSetConfigEDMA(DEMO_SAI, &txHandle, &saiConfig); saiConfig.masterSlave = kSAI_Slave; SAI_TransferRxSetConfigEDMA(DEMO_SAI, &rxHandle, &saiConfig); /* set bit clock divider */ SAI_TxSetBitClockRate(DEMO_SAI, DEMO_AUDIO_MASTER_CLOCK, DEMO_AUDIO_SAMPLE_RATE, DEMO_AUDIO_BIT_WIDTH, DEMO_AUDIO_DATA_CHANNEL); SAI_RxSetBitClockRate(DEMO_SAI, DEMO_AUDIO_MASTER_CLOCK, DEMO_AUDIO_SAMPLE_RATE, DEMO_AUDIO_BIT_WIDTH, DEMO_AUDIO_DATA_CHANNEL); /* master clock configurations */ BOARD_MASTER_CLOCK_CONFIG(); /* CS42888 initialization */ //DEMO_InitCodec(); memset((uint8_t *)&Buffer,'5', sizeof(uint8_t) * 4096); while (1) { if (emptyBlock > 0) { xfer.data = Buffer + rx_index * BUFFER_SIZE; xfer.dataSize = BUFFER_SIZE; if (kStatus_Success == SAI_TransferReceiveEDMA(DEMO_SAI, &rxHandle, &xfer)) { rx_index++; } if (rx_index == BUFFER_NUMBER) { rx_index = 0U; } } if (emptyBlock < BUFFER_NUMBER) { xfer.data = Buffer + tx_index * BUFFER_SIZE; xfer.dataSize = BUFFER_SIZE; if (kStatus_Success == SAI_TransferSendEDMA(DEMO_SAI, &txHandle, &xfer)) { tx_index++; } if (tx_index == BUFFER_NUMBER) { tx_index = 0U; } } } } Audio(PDM | I2S | SAI) Communication & Control(I3C | I2C | SPI | FlexCAN | Ethernet | FlexIO)
View full article