SPI通信での制御レジスト書き込みについて

22 Jul 2013

はじめまして!

自分は学生で、mbedを使った回路制作をしています。 今はSPI通信を使ってLPS331APという気圧計の制御をしようとしていますが、 レジスタ(WHO_AM_Iを読み込めました)の読み込みは可能なのですが、 どうやってもレジスタに書き込むことができません。 どうか、助言をお願い致します。

http://mbed.org/users/okini3939/notebook/SPI_jp/ このページを参考にし、 SPIフォーマット設定、SPI周波数設定については問題ないと思うのですが、 spi.writeを使ったレジスト書き込みを取り扱ってるサイトがなく、まさに八方ふさがりです・・・。

以下に、自分が作成したプログラムを記載します。

  1. include "mbed.h"

SPI spi(p5, p6, p7); mosi, miso, sclk DigitalOut cs(p8);

Serial pc(USBTX, USBRX); tx, rx

int main() { spi.format(16,2); spi.frequency(10000);

cs = 0; spi.write(0x2090);

wait_ms(10);

spi.write(0x20); int whoami = spi.write(0xff); pc.printf("WHOAMI register = 0x%X\n", whoami);

cs = 1; } どうか、よろしくお願い致します。

追記:タイトルですが、「レジスト」でなく「レジスタ」でした。申し訳ないです

24 Jul 2013

こんにちは。

SPIに関して詳しいわけではありませんが、少しコメントします。

フォーラムへの投稿やnotebook等でソースコードを引用する場合は、<<code>> マークアップを使用すると見やすくすることが出来ます。

https://mbed.org/cookbook/Wiki-Syntax

Quote:

レジスタ(WHO_AM_Iを読み込めました)の読み込みは可能なのですが、 どうやってもレジスタに書き込むことができません。 どうか、助言をお願い致します。

読み込みに関しては動作を確認済みと言うことでしょうか?書き込みできないという現象に関しては、もう少し内容を詳しく記載してもらえれば、他の方からもヒントが出てくるかもしれません。

Quote:

SPIフォーマット設定、SPI周波数設定については問題ないと思うのですが、 spi.writeを使ったレジスト書き込みを取り扱ってるサイトがなく、まさに八方ふさがりです・・・。

format 設定について少し気になる点がありました。

 spi.format(16,2);
 spi.frequency(10000);

とありますが、16-bit 指定は正しいでしょうか?LPS331AP のデータシートを見たところ、SPI frame は、8-bit 単位で行っているように見えました。 また、mode = 2 (POL=1, PHA=0) になっていますが、こちらもデータシートのプロトコルと一致していないように見えました(PO=1, PHA=1 のような気がします)。 Clock polarity と clock phase については、ここに分かりやすい解説がありましたので、ご覧下さい。

http://www.diolan.com/dln_doc/spi-transfer-modes.html

的外れな内容かも知れませんが参考になれば幸いです。

以上です。

24 Jul 2013

LPS331APではありませんが、同じSTマイクロ製の加速度センサ(LIS302)用のライブラリが公開されています。 SPIの制御に関して参考になるかもしれません。

http://mbed.org/users/simon/code/LIS302/

24 Jul 2013

お返事返すのが遅れ、申し訳ありません。

Quote:

読み込みに関しては動作を確認済みと言うことでしょうか?書き込みできないという現象に関しては、もう少し内容を詳しく記載してもらえれば、他の方からもヒントが出てくるかもしれません。

秋月さんのページに有りました、 http://akizukidenshi.com/download/ds/akizuki/AE-LPS331.pdf この説明書を読みまして、

Quote:

 はじめに「WHO_AM_I」(0x0F)を読みます。「WHO_AM_I」は、LPS331と正しく通信出来ているか、確認する為のレジスタです正しく通信出来ている場合、0xBBが読み取れます。 

とありましたので、

spi.write(0x2F);
int whoami = spi.write(0x00);
pc.printf("WHOAMI register = 0x%X\n", whoami);

このようなプログラムを走らせ、戻り値がBBだったので読み込めたと判断しました・・・。

Quote:

format 設定について少し気になる点がありました。

修正してみましたが、変化ありませんでした。

Quote:

LPS331APではありませんが、同じSTマイクロ製の加速度センサ(LIS302)用のライブラリが公開されています。 SPIの制御に関して参考になるかもしれません。

http://mbed.org/users/simon/code/LIS302/

アドレスを変更して試してみます!

お二方とも、お返事本当にありがとうございます! 今月中にはプログラムを完成させないといけないため、SPIモードで駄目でしたらI2Cも試してみようと思います。 本当にありがとうございました!