2017-12-10 12 views
3

16ビットSPIメッセージを使用するDACチップのSPIドライバを作成しています...出力を表す値はビット11からビット4です8ビットDAC)。私はこのMASKを書いてきたが、私は他のビットに影響を与えることなく、データを更新達成するためにどのよう見当がつかない:uint16_tを他のビットに影響を与えずにuint16_tに挿入する方法

#define MCP4901_SPI_MASK_DATA    0x0FF0 
//So data mask in binary is 0000 1111 1111 0000 

extern uint16_t mcpA; 

static inline void mcpSetData(uint16_t* mcp, uint8_t value) { 
    //???? 
    *mcp =| value & MCP4901_SPI_MASK_DATA; //NOT WORKING 
} 
+0

なぜSPIデータレジスタの一部ではなく、すべてを書き込むのですか?それは意味をなさない。複雑な "デイジーチェーン"ハードウェアがありますか? – Lundin

+0

@Lundin他の設定ビットもあります(ビット15-12).1ビットで設定することもできますが、問題はちょうど8ビットDAC値を11から4にシフトしていました。 – DEKKER

答えて

3

次の2つの操作|&の使用に関する正しいですが、中にあなたがそれらを使用していませんオペランドの1つを正しく配置していません。ここで

はそれを行うための正しい方法である:

*mcp &= ~MCP4901_SPI_MASK_DATA; // Clear out the middle bits 
*mcp |= ((uint16_t)value) << 4; // Put in the value in the middle 

あなたは、ハードウェアレジスタへの書き込みされているので、単一の書き込みが可能な副作用を回避するために使用する必要があります。

*mcp = (*mcp & ~MCP4901_SPI_MASK_DATA) | (((uint16_t)value) << 4); 

MCP4901_SPI_MASK_DATAです反転して0x0FF0の外部のビットをクリアします。または、マスクを0xF00Fと定義して、演算子を削除することもできます。

8ビット値が4だけ左にシフトされ、16ビットの中央に配置されてから番号に「OR」されます。

Demo.

+2

SPIデータレジスタに複数回連続して書き込みます。書き込みや読み取りには、フラグがクリアされたり、データが送信されたりするなどの副作用があります。特定のハードウェアによって異なります。 – Lundin

+0

@ Lundinあなたが正しいです、私はOPがハードウェアレジスタに書いているという事実を完全に逃しました。ありがとうございました! – dasblinkenlight

+0

@Lundinディスカッションをお寄せいただきありがとうございます。私はその 'mcpSetData()'関数を使ってU16変数の内容を更新しました...他のビットと設定は他の関数で行われます。必要なデータが準備できたら、私はそれを単一のコマンド(STM32からのHAL_SpiTransmit)を使ってSPIに送ります。それは今うまく動作:) – DEKKER

関連する問題