0

µC PIC24FJ256GB106 を搭載した MPLAB スターター キット ボードがあり、接続された加速度計チップ ADXL375 ボード (これが問題の原因ではないようです) と 3 線式 SPI 接続 (SDO は使用されていません) の SPI 経由で通信しています。 SPI モジュール 1 を有効にするピン選択:

void MapSPIModulPins()
{
__builtin_write_OSCCONL(OSCCON&0xbf); //! PPSUnLock
RPOR1bits.RP3R = 8 ; //! Assign RP3 as Output Pin To SPI1 Clock Output.
RPOR2bits.RP4R = 7 ; //! Assign RP4 as Output Pin SPI1 Data Output.
//RPOR1bits.RP2R = 9 ; //! Assign RP2 as Output Pin Where is SPI1 Slave Select Output. SS1OUT
__builtin_write_OSCCONL(OSCCON|0x40);    //! PPSLock

//! Extra digital output as Chip Select
TRISDbits.TRISD8 = 0; // Thomas 18.11.2014
}

SPI は次のように構成されています。

void SPIsetup1ForMasterMode()
{
IFS0bits.SPI1IF = 0; // Clear the Interrupt flag
IEC0bits.SPI1IE = 0; // Disable the interrupt

// SPI1CON1 Register Settings
SPI1STATbits.SPIEN  = 0; //! Thomas(THOMAHPS) 20.11.2014  Disable SPI module
SPI1CON1bits.DISSCK = 0; // Internal serial clock is enabled
SPI1CON1bits.DISSDO = 0; // SDOx pin is controlled by the module
SPI1CON1bits.MODE16 = 0;// Communication is byte-wide (8 bits) // Thomas 17.11.2014

SPI1CON1bits.MSTEN = 1; // Master mode enabled
SPI1CON1bits.SMP = 0; // Input data is sampled at the middle of data output time
SPI1CON1bits.CKE = 0; // Serial output data changes on transition from Idle clock state to active clock state

// Idle clock state to active clock state
SPI1CON1bits.CKP = 0; // Idle state for clock is a low level;

// active state is a high level
SPI1STATbits.SPIEN = 1; // Enable SPI module
SPI1STATbits.SPIROV = 0 ; //! Thomas 20.11.2014 Clear the SPIROV bit !

// Interrupt Controller Settings
IFS0bits.SPI1IF = 0; // Clear the Interrupt flag
IEC0bits.SPI1IE = 1; // Enable the interrupt
}

私見では、SPI の送信と受信の間で非対称な動作を確立することはできません。

割り込みハンドラは次のとおりです。

void __attribute__((interrupt,no_auto_psv)) _SPI1Interrupt(void)
{
   IFS0bits.SPI1IF = 0;     //Clear Interrupt status of SPI1
}

次に、データバイトを送信しました

SPI1BUF = anyBytePattern;

時計と一緒にオシロスコープで観察できました。データの受信は次のようにトリガーできます (ステータスフラグのチェックはここでは省略しました!)

unsigned int recvData = SPI1BUF;

単一の操作でも無限ループでも、信号線にクロックがありません!

デモ アプリケーションの適切な場所にコードを埋め込んだため、問題が発生することはありません。
遅延、プロデューサーのサンプル コード、コミュニティなど、さまざまなことを試しました。
デバッグ セッションでは、異常なレジスタ値 (SPI エラー フラグ) は観察されませんでした。
スレーブ電子の分離は、動作に違いはありません。

これは PPS の問題ですか?

メーカーのSPIの説明に出くわしました。
ドキュメントPIC24FJ256GB110 ファミリ データ シート のセクション15.0 SERIAL PERIPHERAL INTERFACE (SPI) に は、次のように書かれ
ています 。選択またはフレーム同期 I/O パルス SPI モジュールは、2、3、または 4 ピンを使用して動作するように設定できます 3 ピン モードでは、SSx は使用されません 2 ピン モードでは、SDOx と SSx の両方が使用されません." 同じドキュメントは、 SPI データ信号 が 1 つしかない 64 ピン チップ PIC24FJ256GB106 のピン配列でした。





SDA1 と呼ばれ、ピン番号 43 に物理的に配置されています
。このチップで 3++ ワイヤ SPI ソリューションをどのように実現できますか?

表 10-3 :選択可能な出力ソース ( MAPS FUNCTION TO OUTPUT)を参照して、この信号と SPI クロックを PPS コマンドでマップし まし。) として 8。

SPI スレーブとの通信には、書き込み-読み取り-サイクルが必要です。レジスタ nr を彼に伝えると、彼はその値で応答しました。
この PPS マッピングは、その仕事をするのに十分ですか?

入力マッピングはどうですか?

表 10-2: 選択可能な入力ソース (MAPS INPUT TO FUNCTION) は、機能 SCK1IN ( SPI1クロック
入力)、レジスタ RPINR20、ビット SCK1R(5:0) およびSDI1 (SPI1 データ入力)、レジスタ RPINR20、ビット SDI1R( 5:0)

コード行を MapSPIModulPins() に追加しました。

RPINR20bits.SCK1R = 3 ; // because SCL1/RP“3“/PMCS2/CN55/RD10  
RPINR20bits.SDI1R = 4 ; // because DPLN/SDA1/RP“4“/CN54/RD9  

PIC24 SPI モジュール 1 では、マスター読み取りのクロック サイクルがまだ生成されていません。

なにが問題ですか?

誰かが助けてくれるなら - 前もって感謝します!
トーマス

4

1 に答える 1