こんにちは、NXP チームの皆様、
私はNXP S32K144ボードを使用しており、SPI通信を介してUJA1169シングルボードコンピュータと通信しようとしています。私の目標は、SBCから製造元IDレジスタを読み取ることです。
このため、SPI通信コードを作成しました。参考として、以下に添付します。回路図に従って、以下のピン構成を持つLPSPI1インスタンスを選択しました。
PTB14 → SCK
PTB15 → シン
PTB16 → SOUT
PTB17 → PCS3
MEXファイルに設定されているSPIドライバ設定のスクリーンショットも添付しました。
しかし、UJA1169 SBCから有効なデータを受信できません。SPIクロックは生成されていますが、SBC側から受信データが正しく送信されていません。
SPIの設定または通信シーケンスのどこかに間違いがあるかもしれないので、どなたか教えていただけませんか?
参考までに、私のコードを以下に示します。
/*
* 著作権 2020 NXP
*
* NXP機密情報。このソフトウェアはNXPが所有または管理しており、厳密に使用することはできません。
* 適用されるライセンス条項に従って。
*/
#ifdef __cplusplus
extern "C" {
#endif
/*==================================================================================================
* ファイルを含める
==
#include "Mcu.h"
#include "Port.h"
#include "Spi.h"
#include "Platform.h"
#include "spi_cfg.h"
/*==================================================================================================
* ローカル変数
==
#define UJA1169_ID_REGISTER (0x7EU)
#define UJA1169_READ_COMMAND(reg) ((uint8)(((reg) << 1U) | 0x01U))
/* S32K144EVB 回路図は UJA1169TK/F を使用し、その識別値は 0xEF です。*/
#define UJA1169_EXPECTED_ID (0xEFU)
/* SPI転送完了フラグ */
volatile boolean SpiTransferDone = FALSE;
/* 結果をグローバル変数として保持することで、デバッガで簡単に検査できるようにします。*/
volatile uint8 Uja1169DeviceId = 0U;
/*==================================================================================================
* グローバル関数
==
/* SPI転送完了コールバック */
void SpiJobEndNotification(void)
ヤージュ
SpiTransferDone = TRUE;
}
static Std_ReturnType Uja1169_ReadRegister(uint8 RegisterAddress, uint8 * RegisterValue)
ヤージュ
Std_ReturnType ステータス;
uint8 TxBuffer[4] = {0U, 0U, 0U, 0U};
uint8 RxBuffer[4] = {0U, 0U, 0U, 0U};
if (NULL_PTR == RegisterValue)
ヤージュ
E_NOT_OK を返します。
}
/*
* UJA1169A SPIコマンドバイト:アドレス[7:1] + 読み取りビット[0]。
* レジスタ0x7Eの読み出しコマンドは0xFDです。4バイトが使用されるのは、
* 現在のSpiChannel_SBC構成は32ビットです。SBCは32ビットSPIをサポートしています。
*/
TxBuffer[0] = UJA1169_READ_COMMAND(RegisterAddress);
SpiTransferDone = FALSE;
Status = Spi_SetupEB(SpiConf_SpiChannel_SpiChannel_SBC, TxBuffer, RxBuffer, 4U);
if (E_OK != Status)
ヤージュ
ステータスを返します。
}
ステータス = Spi_AsyncTransmit(SpiConf_SpiSequence_SpiSequence_1);
if (E_OK != Status)
ヤージュ
ステータスを返します。
}
while(FALSE == SpiTransferDone)
ヤージュ
}
/* 選択されたレジスタ値は最初のデータバイト中に返されます。*/
*RegisterValue = RxBuffer[1];
E_OKを返します。
}
/**
* @brief メイン機能
*/
int main(void)
ヤージュ
Std_ReturnType ステータス;
uint8 DeviceId = 0U;
/* MCUを初期化する */
#if (MCU_PRECOMPILE_SUPPORT == STD_ON)
Mcu_Init(NULL_PTR);
#elif (MCU_PRECOMPILE_SUPPORT == STD_OFF)
Mcu_Init(&Mcu_Config_VS_0);
#endif
/* クロックを初期化します */
Mcu_InitClock(McuClockSettingConfig_0);
#if (MCU_NO_PLL == STD_OFF)
while (MCU_PLL_LOCKED != Mcu_GetPllStat())
ヤージュ
/* PLLロックを待機 */
}
Mcu_DistributePllClock();
#endif
Mcu_SetMode(McuModeSettingConf_0);
/* ポートの初期化 */
Port_Init(NULL_PTR);
/* プラットフォームの初期化 */
Platform_Init(NULL_PTR);
/* SPIを初期化します */
Spi_Init(NULL_PTR);
/* SPI割り込みモードを設定します */
Status = Spi_SetAsyncMode(SPI_INTERRUPT_MODE);
if (E_OK != Status)
ヤージュ
while(1)
ヤージュ
}
}
ステータス = Uja1169_ReadRegister(UJA1169_ID_REGISTER, &DeviceId);
Uja1169DeviceId = DeviceId;
((E_OK != Status) || (UJA1169_EXPECTED_ID != Uja1169DeviceId)) の場合
ヤージュ
while(1)
ヤージュ
}
}
while(1)
ヤージュ
}
return (0U);
}
#ifdef __cplusplus
}
#endif
問題の特定にサポートいただければ幸いです。私の方から追加情報、スクリーンショット、ロジックアナライザのキャプチャが必要な場合はお知らせください。
できるだけ早くご返信いただけることをお待ちしております。
ありがとう。 S32K144 Schematic Diagram PinsS32K144 Schematic Diagram PinsS32K144 Schematic Diagram PinsS32K144 Schematic Diagram PinsS32K144 Schematic Diagram PinsS32K144 Schematic Diagram PinsS32K144 回路図ピン
SPI Clock SettingSPI Clock SettingSPI Clock SettingSPI Clock SettingSPI Clock SettingSPI Clock SettingSPIクロック設定
Pin mappingPin mappingPin mappingPin mappingPin mappingPin mappingピンマッピング
Port setting Pic1Port setting Pic1Port setting Pic1Port setting Pic1Port setting Pic1Port setting Pic1ポート設定図1
Port setting Pic2Port setting Pic2Port setting Pic2Port setting Pic2Port setting Pic2Port setting Pic2ポート設定図2
Port setting Pic3Port setting Pic3Port setting Pic3Port setting Pic3Port setting Pic3Port setting Pic3ポート設定図3
Port setting Pic4Port setting Pic4Port setting Pic4Port setting Pic4Port setting Pic4Port setting Pic4ポート設定図4
SPI driver Config Pic1SPI driver Config Pic1SPI driver Config Pic1SPI driver Config Pic1SPI driver Config Pic1SPI driver Config Pic1SPIドライバ設定図1
SPI driver Config Pic2SPI driver Config Pic2SPI driver Config Pic2SPI driver Config Pic2SPI driver Config Pic2SPI driver Config Pic2SPIドライバ設定図2
SPI driver Config Pic3SPI driver Config Pic3SPI driver Config Pic3SPI driver Config Pic3SPI driver Config Pic3SPI driver Config Pic3SPIドライバ設定図3
SPI driver Config Pic4SPI driver Config Pic4SPI driver Config Pic4SPI driver Config Pic4SPI driver Config Pic4SPI driver Config Pic4SPIドライバ設定図4
SPI driver Config Pic5SPI driver Config Pic5SPI driver Config Pic5SPI driver Config Pic5SPI driver Config Pic5SPI driver Config Pic5SPIドライバ設定図5
SPI driver Config Pic6SPI driver Config Pic6SPI driver Config Pic6SPI driver Config Pic6SPI driver Config Pic6SPI driver Config Pic6SPIドライバ設定図6
こんにちは、ロビンさん。
ご返信ありがとうございます。
私はUJA116xのサンプルパッケージをインストールしておらず、付属のサンプル構成も参照していません。
S32K1xx_SBC_UJA116xA_R21-11_0.8.0_CD01_DS_updatesite_D2401.zip
SW32K1_S32M24x_RTD_4.4_R21-11_2.0.0_D2308_DS_Updatesite.zip
現在、私はUJA1169シングルボードコンピュータとの通信に、独自のSPI実装を使用しています。
ご要望どおり、テスト用のプロジェクトを別途添付いたしました。
S32K144EVB-Q100ボードで使用し、ロジックアナライザを使用してSPI信号を検証できます。
プロジェクトに関して追加情報や修正が必要な場合はお知らせください。
よろしくお願いします、
ヴァムシ
ハイ
テスト用のプロジェクトを別途送っていただけますか?
こうすることで、S32K144EVB-Q100にロジックアナライザを接続して、SPI通信が正しく行われているかどうかを確認できます。
ちなみに、S32DS v3.5 に「S32K1xx_SBC_UJA116xA_R21-11_0.8.0_CD01_DS_updatesite_D2401.zip」と「SW32K1_S32M24X_RTD_4.4_R21-11_2.0.0_D2308_DS_Updatesite.zip」をインストールしました。このバージョンもインストールしましたか?
インストール後、UJA116xのサンプルがいくつか表示されます。既にその設定を確認しましたか?
よろしくお願いします、
ロビン
-------------------------------------------------------------------------------
注記:
この投稿があなたの質問への回答になっている場合は、「解決策として承認」ボタンをクリックしてください。ありがとう!
- 最後の投稿から7週間はスレッドをフォローしますが、それ以降の返信は無視されます。
後日、関連する質問がある場合は、新しいスレッドを作成し、閉じられたスレッドを参照してください。
-------------------------------------------------------------------------------
こんにちは、ロビンさん。
ご返信ありがとうございます。
サンプルプロジェクト「Sbc_uja116xa_example_S32K148」と関連パッケージ「S32K1xx_SBC_UJA116xA_R21-11_0.8.0_CD01_DS_updatesite_D2401.zip」が見つかりません。
参考となるプロジェクトと関連ファイルを共有していただけますか?
よろしくお願いします。
よろしくお願いします、
ヴァムシ
S32K1 RTD 2.0.0 P04をインストールしたところ、 S32 設定ツールを正しく開くことができるようになりました。
申し訳ありませんが、 Uja1169_Transfer 、 Uja1169_ReadDeviceIdなどが定義されているようです。
しかし、 S32CTとCodeのエラーが複数見つかり、まだすべてを修正する時間が取れていません。
S32K1xx_SBC_UJA116xA_R21-11_0.8.0_CD01_DS_updatesite_D2401.zipをインストールしてから、 Sbc_43_uja116xa_ReadRegister ( SBC_UJA116XA_IDENTIF , ReceivedData); などの公式 API を使用することをお勧めします。
下記の赤い枠で囲まれた定義を修正する必要があります。
S32設定ツールで変更する必要がある箇所は以下のとおりです。
ご注意ください。私はあなたのプロジェクトを簡単に確認し、修正しただけです。S32K1xx_SBC_UJA116xA_R21-11_0.8.0_CD01_DS_updatesite_D2401.zipをインストールし、そのサンプルSbc_uja116xa_example_S32K148を参照することを強くお勧めします。