XxkanakoxXさん、
まず、SPI通信の確認
Wikipediaの説明から、
マスターとスレイブがあって、マスターは、クロック(SCLK)の生成ととスレーブセレクト(SS)をLOWにしてデバイスを選択、
- MISO (MasterInSlaveOut マスター入力 スレーブ出力)
- MOSI (MasterOutSlaveIn マスター出力 スレーブ入力)
の2つのピンで同時に通信を行います。
次に、MCP3008のデータシートでデータのやり取りの仕方を見ます。英語ですが.
page 18のFigure 6-1の図がこのチップでの通信のやりかたで、3バイトで通信を行います。
D_INがMCP3008への入力で、D_OUTが、MCP3008からの出力です。
D_INに送るデータですが、
- 1バイト目: 8bit目にStartの1を送るので、 0x01 を入力します。
- 2バイト目: SGL/DIFFは、Single-End-Input(1) か pseudo-differential input(0)のモード選択ですが、GNDとCH間を測るでしょうから、=1で
D2/D1/D0で、Ch番号の指定、下位4ビットは、XXXXとなってて、特に指定なしです。
なので、(( (1<<3) + Ch ) << 4) が、2バイトの入力. [ (1<<3) => 8 です。 ]
- 3バイト目: MCPからの出力を受け取るだけなので、0 としています。(これをいれないと、SCLKが作られないので.)
同様に、D_OUT側ですが、2バイト目の下位2ビットと、3バイト目で、10ビットのデータになる、とのことで、 ((adc[1] & 3) << 8) + adc[2]) となります。
その次、pythonのspidevをみます。下の方にChip-Selectの制御の違いがかいてありますね。
- xfer(list of values[, speed_hz, delay_usec, bits_per_word])
Performs an SPI transaction. Chip-select should be released and reactivated between blocks. Delay specifies the delay in usec between blocks.
- xfer2(list of values[, speed_hz, delay_usec, bits_per_word])
Performs an SPI transaction. Chip-select should be held active between blocks.
で、質問の件ですが、
・spi.xfer2()とはどういう意味なのか、
↑の説明にかいてあるとおりのCS(=SS)制御の仕方で通信する関数。
また引数を3つとっているがそれぞれのどういう役割なのか
引数はリスト1つ。で、MCP3008との通信に必要な3バイト分が入ってます。
・8+channelとは何なのか、なぜ4bitシフトさせるのか
↑で説明したとおり、MCP3008の通信仕様、ですね。
追記:
XxkanakoxXさん、
((SGL_DIFF << 3) | ((D2<<2) | (D1 << 1) | D0) ) << 4
SGL_DIFF = 1
((D2<<2) | (D1 << 1) | D0)
=> Channel番号
で、どうでしょう? データシートの図と見比べてみてください
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/03 08:10
2019/04/03 15:28
2019/04/04 03:53
2019/04/04 16:22
2019/04/05 07:48