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 : Function1R_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.928571R_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; }}
自己解決しました。
受信バッファデータリセットが有効になっていたことによって、バッファの内容がクリアされていたのが原因だったみたいです。