2016-05-30 55 views
1

バスに8バイトの配列を送信するために(すべてのバイトを一度に転送する)マイクロチップからPIC18F452とSPI通信を設定しようとしています。ここに私の配列がどのように見えるかの例です:SPIへの8バイト配列の送信

array 0x0080 byte[8] 
array[0] 0x0080 0x01 
array[1] 0x0081 0x01 
array[2] 0x0082 '\0' 
array[3] 0x0083 0x01 
array[4] 0x0084 0x01 
array[5] 0x0085 0x01 
array[6] 0x0086 0x01 
array[7] 0x0087 '\0' 

値は、入力信号(音声ファイル、クロックなど)から来ると、アレイを満たすためにPORTDbits.RD0上で受信されています。値は常に1または0で、それ以外は何もありません。

まず、私はputcSPI()で一度に一つのバイトを送信することにより開始しています。配列を実行すると、SPIに1バイトを送り、結果は一致します。

/// SEND DATA TO SPI 
SPI_INT = 0;  // Enable SS 
putsSPI(array); 
SPI_INT = 1;  // Disable SS 
delay_ms();  // Delay 

しかし、私は(の終わりと考え0が発生したときにフレームの転送が停止される:

そして、Iは次のようputsSPI()を使用して、一度にすべてのバイトを送信しようとしました配列なので、それは正常です)。そして、私のフレームはチャンクに分割されています。アレイは、上記の表示のために

は、例えば、私は、SPIバス上で「1」を有し、その後、次の値が言われていること

に従うフレームからのものである、私は、データを変換すると考えバイナリから16進数(または整数)に変換し、SPIに送信します。 ここではいくつかの変換方法を試しましたが、これまで成功していませんでした。

完全なアレイをバスに直接送信するソリューションはありますか、誰かがこの特定のケースで変換を実行する方法についてのアイディアを持っていますか?

事前に感謝します。

+1

それぞれ2つの値のうちの1つだけを含む8バイトを送信するのはなぜですか?値を単純に1バイトにまとめることができます。 – EOF

+0

全く異なる方法で問題を解決しました。 私が後で使用した解決策を投稿します – Daymov

+0

'putsSPI'がヌルで終了する文字列を期待している場合、明らかに最初のヌル文字までしか文字を送信しません。一度に1バイトずつ送信しないのはなぜですか? @EOFが書いたように、8ビットは1バイトです。受信者に1バイトしか送る必要はありませんか? – Groo

答えて

0

最終的に私の目標を達成するために、私はこの問題を解決するために私の方法を完全に変えました。

私はまだ通信にSPIを使用しています。しかし、配列の代わりに、私は入力信号の値を(それに適用したすべての操作の後で)ある値で保存します。この値は後で2つの部分に分けられ、1バイトをバスに送ります。

// Definition 
unsigned int value = 0; 
unsigned char value_byte1 = 0; 
unsigned char value_byte2 = 0; 
unsigned int onTheBus_byte1 = 0; 
unsigned int onTheBus_byte2 = 0; 

// In main function, the value is modified using a counter (value++;) 

// Transfer to SPI 
value_byte1 = value >> 8; 
value_byte2 = value & 0xFF; 

SPI_INT = 0; // Enable SS 
onTheBus_byte1 = WriteSPI(value_byte1); 
onTheBus_byte2 = WriteSPI(value_byte2); 
SPI_INT = 1; // Disable SS 

だから、私が取得する場合:メインループで

value = 1505 (= 0x05E1) 

value_byte1 = 0x05 
value_byte2 = 0xE1 

(このコードはプロテウス上でテストされてきた、と私は両方のバイトを見ています値がバスに書き込まれたときのSPIデバッガ)

値を使用する必要がある場合は、別のピクチャで、2つの部分をアセンブルします私がそれらを読んだ後:

value = (value_byte1 << 8) | value_byte2; 
関連する問題