プロが教える店舗&オフィスのセキュリティ対策術

現在マイコン初心者でD/A変換、SPI通信について勉強しております。現在ポテンショメータの入力に応じて電圧を変化させLEDの明るさを調整しようとしています。(master側からの一方通行)
使用チップ:atmel atmega328p(master)
mcp4921 (slave)
配線図:添付画像を参照ください
開発環境:atmel studio 7(c言語)

ADCを用いてポテンショメータの値はとれるようになったのですが、SPI通信でつまずいております。色々なサイトでコードを見てみているのですが、どのようにmaster側とslave側でコードを分けているのかが分からない状態です。両方にmain関数があるのですがどのようにファイルを配置してビルドしているのでしょうか?

なにか参考になるサイトなどがありましたら、そちらも教えていただけると助かります。

「マイコンSPI入門」の質問画像

A 回答 (2件)

オシロスコープかロジックアナライザがあれば良いのですが、無いという前提で。


MOSIとMISOを接続しておいてSPIFフラグが立った時にデータレジスタを読めば自分が送信したデータが受信されているはずです。
しかし、このエコーバックではクロック速度と動作モードがスレーブの仕様に合っているかは確認できません。
まあ、スレーブは20MHzのクロックまで行けますし、MODE0で使えるようなので、そこは大丈夫かと思います。
補足提示いただいたコードは特に間違っていないと思いますよ。
    • good
    • 0
この回答へのお礼

またの回答ありがとうございます。なんとかLEDが点灯するところまでこぎつけることができました。もうすこし試行錯誤してがんばってみます。

お礼日時:2017/06/04 18:33

ちょっと混乱されているようです。

質問の意味が分かりません。
スレーブであるmcp4921は単なるDAコンバータICですから、プログラムなんて不要ですよね。
マスターであるatmega328pがマスターとして動作すれば良いだけです。スレーブとしてのプログラムは必要ありません。
    • good
    • 0
この回答へのお礼

さっそくの回答ありがとうございます。いくつかのサイトでマスターとスレーブでそれぞれコードを用意しているところがあったのでこんがらがってしまいました。

とりあえずマスター側の初期設定を
DDRB = (1<<DD_MOSI)|(1<<DD_SCK); // DD_MOSI = PORTB3, DD_SCK = PORTB5
SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
として通信を
SPDR = cData; // cDataはchar
while(!(SPSR & (1<<SPIF)));
で試してみたのですが通信がうまくいっているかがよくわかりません。これはどのように確認したらいいのでしょうか?

お礼日時:2017/06/04 10:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!