RZ/G2UL Cortex-M33 RSPI機能にて受信データが0になる

RZ/G2UL Cortex-M33 RSPI機能にて受信データとして全て0が受信される現象が発生しており困っています。

RSPI機能にてRZ/G2UL側をマスター、ADC側をスレーブとして使用しています。

回路上にて通信電文を確かめると正常にMPU-ADC間で通信出来ている事が確認できています。

↓18byteの送受信を実施している波形

SPI機能の処理構造としては、SPI通信タスクで最初の1byteの転送データをデータレジスタに設定し、

その後受信バッファフル割込みがコールされたら、受信データ保管用バッファにデータレジスタの値をセット。

その後転送済みのバイト数を確認し、

最後まで転送し終わっていなければ、次の1byteの転送データをデータレジスタに設定、

最後まで転送し終わっていれば、ステータスを変更し終了。

という処理になっています。

RSPI0_MISOのポートがちゃんと回路に接続されている事は、ADCの変換完了(High→Low)をRSPI0_MISOのポート状態で判断出来ている事から、出来ていると判断しています。

又、1byte受信中はRSPI0_MISOポートの状態が常時Highになっている箇所もあるため、タイミングでもないのではないかと考えています。

以下にポートレジスタ設定、RSPI0のレジスタ設定、受信バッファフル割込みの処理を記載します。何かアドバイスお願い致します。

■ポート設定
//ポートモード制御レジスタ
// RSPI0_CK & RSPI0_MOSI & RSPI0_MISO & RSPI0_SSL : 周辺機能モード (周辺機能)
R_GPIO->PMC1F = 0x0F;
// 書き込み保護レジスタ
// PFCWE ビットへの値の書き込み無効(有効に設定)
R_GPIO->PWPR_b.BOWI = _OFF_;
// 書き込み保護レジスタ
// PFC レジスタへの値の書き込みが有効(有効に設定)
R_GPIO->PWPR_b.PFCWE = _ON_;
// ポート機能制御レジスタ
// RSPI0_CK & RSPI0_MOSI & RSPI0_MISO & RSPI0_SSL : Function1
R_GPIO->PFC1F = 0x00001111;
// 書き込み保護レジスタ
// PFC レジスタへの値の書き込みが有効(無効に設定)
R_GPIO->PWPR_b.PFCWE = _OFF_;
// 書き込み保護レジスタ
// PFCWE ビットへの値の書き込み無効(無効に設定)
R_GPIO->PWPR_b.BOWI = _ON_;
// 割り込み許可制御レジスタ
// RSPI0_CK & RSPI0_MOSI & RSPI0_MISO : 無効(初期値)
R_GPIO->ISEL1F = 0x00000000;
// 運転能力制御レジスタ
// RSPI0_CK & RSPI0_MOSI & RSPI0_MISO & RSPI0_SSL : 4mA(初期値)
R_GPIO->IOLH1F = 0x00010101;
// スルーレートスイッチングレジスタ
//RSPI0_CK & RSPI0_MOSI & RSPI0_MISO & RSPI0_SSL : 高速(初期値)
R_GPIO->SR1F = 0x00010101;
// プルアップ/プルダウンスイッチングレジスタ
// RSPI0_CK & RSPI0_MOSI & RSPI0_MISO & RSPI0_SSL : プルアップもプルダウンも設定しない(初期値)
R_GPIO->PUPD1F = 0x00000000;
// デジタルノイズフィルタスイッチングレジスタ
// RSPI0_CK & RSPI0_MOSI & RSPI0_MISO & RSPI0_SSL : フィルタは使用無し(初期値)
R_GPIO->FILONOFF1F = 0x00000000;
// デジタルノイズフィルタ番号レジスタ
// RSPI0_CK & RSPI0_MOSI & RSPI0_MISO & RSPI0_SSL : 4段フィルタ(初期値)
R_GPIO->FILNUM1F = 0x00000000;
// デジタルノイズフィルタクロック選択レジスタ
// RSPI0_CK & RSPI0_MOSI & RSPI0_MISO & RSPI0_SSL : 分周なし(初期値)
R_GPIO->FILCLKSEL1F = 0x00000000;
// ポートモードレジスタ
// RSPI0_CK 出力モード(入力無効)、RSPI0_MOSI 出力モード(入力無効)、RSPI0_MISO 入力モード、 RSPI0_SSL 出力モード(入力無効)
R_GPIO->PM1F = 0x009A;
// ポートレジスタ
// RSPI0_CK High、RSPI0_MOSI LOW(初期値)、RSPI0_MISO LOW(初期値)、 RSPI0_SSL LOW(初期値)
R_GPIO->P1F = 0x01;

■RSPIレジスタ設定
// バッファ制御レジスタ
// 受信バッファデータトリガー数
R_RSPI0->SPBFCR_b.RXTRG = 0;
// 送信バッファデータトリガー数
R_RSPI0->SPBFCR_b.TXTRG = 0;
// 受信バッファデータリセット有効
R_RSPI0->SPBFCR_b.RXRST = _ON_;
// 送信バッファデータリセット有効
R_RSPI0->SPBFCR_b.TXRST = _ON_;
// 制御レジスタ
// モード障害エラー検出の有効化(マスターモードは0で使用)
R_RSPI0->SPCR_b.MODFEN = _OFF_;
// マスター/スレーブモード選択
R_RSPI0->SPCR_b.MSTR = 1;
// エラー割り込み有効(マスターモードは0で使用)
R_RSPI0->SPCR_b.SPEIE = _OFF_;
// 送信割り込み有効(初期化時は0設定)
R_RSPI0->SPCR_b.SPTIE = _OFF_;
// ピン制御レジスタ
// ループバック
R_RSPI0->SPPCR_b.SPLP = _OFF_;
// MOSIアイドル固定値
R_RSPI0->SPPCR_b.MOIFV = _OFF_;
// MOSIアイドル値固定の有効化
R_RSPI0->SPPCR_b.MOIFE = _OFF_;
// ビットレートレジスタ(SPE ONする前に設定する必要有り)
// n ≒ 100MHz / ( 700kbps * 2 * 2^BRDV(3) ) - 1
// n ≒ 7.928571
R_RSPI0->SPBR_b.SPR = 8;
// データ制御レジスタ
// アクセス幅の仕様
R_RSPI0->SPDCR_b.SPLW = 1;
// ダミーデータ送信有効
R_RSPI0->SPDCR_b.TXDMY = _OFF_;
// クロック遅延レジスタ
R_RSPI0->SPCKD = 0;
// スレーブ選択否定遅延レジスタ
R_RSPI0->SSLND = 0;
// 次回アクセス遅延レジスタ
R_RSPI0->SPND = 0;
// コマンドレジスタ
// RSPCK位相設定
R_RSPI0->SPCMD0_b.CPHA = 1;
// RSPCK??極性設定
R_RSPI0->SPCMD0_b.CPOL = 1;
// ビットレート分割設定
R_RSPI0->SPCMD0_b.BRDV = 3;
// SSL信号レベル維持
R_RSPI0->SPCMD0_b.SSLKP = _OFF_;
// データ長設定
R_RSPI0->SPCMD0_b.SPB = 7;
// LSBファースト
R_RSPI0->SPCMD0_b.LSBF = 0;
// 次回アクセス遅延有効
R_RSPI0->SPCMD0_b.SPNDEN = _OFF_;
// SSL??否定遅延設定の有効化
R_RSPI0->SPCMD0_b.SLNDEN = _OFF_;
// RSPCK遅延設定の有効化
R_RSPI0->SPCMD0_b.SCKDEN = _OFF_;


■受信バッファフル割込み
void Rspi0ReceiveBufferFullIrq( void )
{
 AD_RX_BUFF[ProcessedDataNumber] = R_RSPI0->SPDR_byte.LL;

 // ステータスによって処理を分ける
 switch ( _AD_Status ) {
 case _AD_CONVERSION_START_COMMAND_SENT:
  ProcessedDataNumber++;
  if ( ProcessedDataNumber >= ProcessDataNumber ) {
   _AD_Status = _AD_CONVERTING;
  } else {
   // 送信バッファエンプティチェック
   while ( R_RSPI0->SPSR_b.SPTEF == _OFF_ ) {
    // wait
   }
   // 全部送信し終わるまで送信バッファにデータをセット
   SendBuffer++;
   R_RSPI0->SPDR_byte.LL = (usigned char)*SendBuffer;
  }
  break;
 case _AD_RESET_COMMAND_SEND:
  ProcessedDataNumber++;
  if ( ProcessedDataNumber >= ProcessDataNumber ) {
   _AD_Status = _AD_CONVERSION_START_WAIT;
  } else {
   // 送信バッファエンプティチェック
   while ( R_RSPI0->SPSR_b.SPTEF == _OFF_ ) {
    // wait
   }
   // 全部送信し終わるまで送信バッファにデータをセット
   SendBuffer++;
   R_RSPI0->SPDR_byte.LL = (usigned char)*SendBuffer;
   }
   break;
 case _AD_READ_RESULT_COMMAND_SENT:
  ProcessedDataNumber++;
  if ( ProcessedDataNumber >= ProcessDataNumber ) {
   _AD_Status = _AD_DATA_COMMUNICATION_COMPLETE;
  } else {
   // 送信バッファエンプティチェック
   while ( R_RSPI0->SPSR_b.SPTEF == _OFF_ ) {
    // wait
   }
   // 全部送信し終わるまで送信バッファにデータをセット
   SendBuffer++;
   R_RSPI0->SPDR_byte.LL = (usigned char)*SendBuffer;
   }
   break;
 default:
   break;
 }
}

Parents Reply Children
No Data