2016-04-08 9 views
1

私は自分のプロジェクトにADS1292を使用しています。自分自身がSPIプロトコルと混同しています。SPIプロトコル手順

私はインターネット上でいくつかのコードを見つけたので、一度に送受信していることがわかりました。

たとえば、0xFFをスレーブデバイスに送信したいとします。

次に、データを最初に送信し、受信を待ちます。

データを受信すると、ダミーバイトを送信してから受信します。

誰でもこの理由を教えてください。

uint8_t sEE_ReadByte(void) 
{ 
    return (sEE_SendByte(sEE_DUMMY_BYTE)); 
} 

uint8_t sEE_SendByte(uint8_t byte) 
{ 
    /*!< Loop while DR register in not empty */ 
    while (SPI_I2S_GetFlagStatus(sEE_SPI, SPI_I2S_FLAG_TXE) == RESET); 

    /*!< Send byte through the SPI peripheral */ 
    SPI_SendData(sEE_SPI, byte); 

    /*!< Wait to receive a byte => I do not understand this point*/ 
    while (SPI_I2S_GetFlagStatus(sEE_SPI, SPI_I2S_FLAG_RXNE) == RESET); 

    /*!< Return the byte read from the SPI bus */ 
    return (uint8_t)SPI_ReceiveData(sEE_SPI); 
} 

答えて

3

これはこれがSPIバスの性質であり、これがバス通信が行われる方法であるため、これを行います。見て:

データ伝送

すべてのSPIクロック・サイクルは、全二重データ伝送です。マスタはMOSIピンにビットを送信し、スレーブはそれを読み取り、スレーブはMISOピンにビットを送信し、マスタはそれを読み取ります。このシーケンスは、一方向のデータ転送だけが必要な場合でも、真です。

enter image description here

だからすべての送信が固定サイズ(例のために8ビット)の2個のシフトレジスタを含む(ウィキペディアから)この画像を参照してください。 1つはマスタデバイスにあり、もう1つはスレーブにあります。すべてのクロックサイクルで、データはシフトされます。続けて十分なパルス(レジスタのサイズ分)をクロックアウトすると、マスタとスレーブはレジスタ値を交換します。これでデータを読んで続行できます。 もちろんそれだけではありません。

デイジーチェーン構成

は、複数のスレーブデバイスは、MISOおよびMOSIラインの同じチェーンに接続されているこの構成でもあります。各スレーブのMOSIは前のスレーブのMISOなどに接続されています(下の画像参照)。この構成では、完全なサイクルのクロックパルスが今もwikipediaを見ることができます詳細については(デバイスの数)*(バッファのsizo)

enter image description here

です。上記の結果

結論

。マスターがバイトを送信するためには、バイトも受け取らなければなりません。このバイトには通信のための値はありません。ダミーバイトで、マスタがそれを破棄します。またバイトを受け取るためには、1バイトも送信する必要があります。再びマスタはダミーバイトを送信します。通信のスレーブ部分についても同様です。

hoo2