ATMELのAtmega88PでSPI通信制御付きの音声ICをI2Cで制御可能?

このQ&Aのポイント
  • ATMELのAtmega88PというマイコンでSPI通信のRX端子搭載の音声ICを制御したい。
  • Atmega88PにはSPI機能の端子が1つしかなく、デバッガの接続に専念させたい。
  • I2C端子も使用可能なので、SPIの送信のみに特化した使い方ができるか疑問。I2CはACKのビットが入ってきて、単純な送信ではダメかも?
回答を見る
  • ベストアンサー

SPI通信制御付きの音声ICをI2Cで制御可能?

SPI通信のRX端子搭載で、音声の再生や停止などを制御できる音声ICをATMELのAtmega88Pというマイコンで行おうと思っているのですが、Atmega88PにはSPI機能の端子が1つだけで、デバッガの接続のみに専念させたいと考えています。 一応、空いている端子があるので、プログラムで擬似的にSPI通信の作ってそれで制御することを考えているのですが、Atmega88PのI2C端子も空いているのですが、これをSPIの送信のみに特化したような使い方はできますでしょうか? 確か、I2CはACKのビットが入ってきて、単純に1バイトを8ビットで送信するという感じではダメだったような気がするのですが、可能でしょうか? どうぞ、ご教示頂きますよう宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • kaba__san
  • ベストアンサー率46% (27/58)
回答No.2

あらーやっぱりUSART使ってしまってたんですね。予想はしてましたが・・・ 対策としましては2案ほど思い浮かびます。 (1)SPIインターフェースをライターと音声ICで共用する。 デバッグにはSPI(ISP)を使用しませんので、信号の衝突さえ注意すれば共用することに問題は無いと思います。 その気があるなら具体例など追って補足いたします。 (2)汎用ポートとソフトウェアでSPIを実現する。 SPIはクロック同期式ですのでタイミングシビアなところが無く、さほど難しいものではありません。 自分で出す1クロック毎にデータの入出力処理を行えばいいのです。 デバッガって何をご使用ですか?

techhouse
質問者

お礼

回答頂きありがとうございます。 デバッガは Atmel-ICE http://akizukidenshi.com/catalog/g/gM-08285/ 対策の2案大変助かります。 (1)の”SPIインターフェースをライターと音声ICで共用する。” これは以前 ATmega88pを使用したもので経験があります。個人的にはちょっとやりたくないというのが正直なところです。なぜかというと、あまりATmelのデバッグ通信などのハード仕様に詳しいわけではなく、通信関連で不具合が生じた場合に、このSPI通信の共用を疑ってしまったりして時間がやけにかかりそうな気がするからです。 前回のプログラミングの際に、共用しているSPI通信のデバイスが、今回の送信のみだけでなく、TX,RXを常に行うようなものだったため、通信の不具合が発生した時に、ハード側の人がオシロスコープで波形を追おうとしても、デバッガ側の波形なのかを区別できず、とても大変だった気がします。 プログラミングでは、デバッガでお手軽に修正とかやってサッと済ましたいので、デバッガのSPIだけは周りに影響されたくない感じですね。 とりあえずクロックを手動でいれて行ってデータシフトで送るような(2)のやり方が簡単そうな感じはしています。

その他の回答 (1)

  • kaba__san
  • ベストアンサー率46% (27/58)
回答No.1

I2CでSPIの代替は無理があります。 そんな心配しなくても、SPIはもう一つ備わっています。 それはUSARTによるSPI動作モードです。 データシートのUSARTの項目を見れば説明がありますので読んでみてください。

techhouse
質問者

お礼

回答頂きありがとうございます。やはりI2C通信でSPI通信の代用は難しそうですね。 ATmega88pの 30番ピン:PD0/TXD 31番ピン:PD1/RXD このUARTがSPIに使えることは知っていたのですが、すでに別のデバイスとUART通信のため使用済みの状態でした。 ATmega88pにもう一つ余計にUARTが付いていればなという感じです。 助かります。

関連するQ&A

  • I2CやSPIで通信できる音声IC

    アップする場所を間違えたように思いますので、こっちに再度アップします。 ご協力お願いします。 音質は問わず(AMラジオレベルの音質でOK)マイクとスピーカーを1チップに接続 出来て、通信ラインはI2CやSPIのシリアルで通信できるICを探しています。 USBで接続できるもので、完成品は世の中に色々あります。 例えば、 サンワサプライ:MM-ADUSB3(USBオーディオ変換アダプタ) バッファロー:BSHSAU01BK(USBオーディオ変換ケーブル) 共に中にはCmedia製のチップが内蔵されています。このチップは結構優れものですが、 何せUSBなので通信が面倒。通信相手は1チップのマイコンなので。そのマイコンも 実はUSBの通信を行うことは決めているのですが、何せ複数のUSBを同時に走らせる 事が難しい。音声は会話できる程度の品質で良いので通信レートを落としてCPUの負荷 を減らしたいというのが目的です。出来ればマイク感度設定やスピーカー音量調整機能 も付いていると尚使い勝手が良いです。 何か適当なチップあれば教えてください。

  • RTCの通信方法(I2C、SPI)について

    RTCの通信方法(I2C、SPI)について 1分間隔でRTCからマイコンに割り込みを入れて、その時の時刻を読み込むといった処理を考えています。 RTCとマイコンの接続方法として、I2CとSPIがありますが、両者のメリット・デメリットは一体何でしょうか? ご教授下さい。 よろしくお願い致します。

  • アトメルのマイコンで、SPI通信で送信ができない

    現在ラズパイ3とAtmelのマイコンATxmega128A1を乗せた基板とをSPI通信させようとしています。 (簡易的な通信の仕様) ・簡易的なパケットデータをラズパイ3側からSPI1の通信ポートからデータを送信。 ・ATxmega128A1側のSPIFポートでデータを受信して、受信内容に応じて1バイトデータをラズパイ3に返送します。 ・ラズパイ3側はパケットデータ3バイトで順番に0x02 -> 0x16 -> 0x00 と送信します。 ・ATxmega128A1側はこのパケットでATxmega128A1のPK1(76番ピン)の入力のH or Lの値をラズパイ3側に返送します。 ATxmega128A1にAtmel-ICEでデバッグしながらプログラムを作っていてわかったのは、ラズパイから送信されてきた3バイトのデータは配列のcmd_data[]の cmd_data[0] = 0x02 cmd_data[1] = 0x16 cmd_data[2] = 0x00 このようにデータが入ってきていて、この部分のSPI通信は問題ないと思うのですが、 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/M1601A_20161205/MainUnit/event.c こちらの140行目付近の case INPUT_CH18: testtest = get_ch18_Input(); if(testtest==0) { txdata=0x55; } else { txdata=0xaa; } get_ch18_Input()で入力ピンのPK1(76番ピン)のH or Lの値をとって、それによって、txdataに0x55 or 0xaaを入れているのですが、 そのデータを実際に送信しようと SPIF.DATA = txdata; while(!(SPIF.STATUS & 0x80)); dummy = SPIF.DATA; このようにコーディングしたのですが、データ送信されません。 SPIF.DATA = txdata; この部分をデバッガでレジスタの設定などを見ていくと、txdata = 0x55と入っていても SPIF.DATAの内容は全く0x55に書き換わらないのですが、この場合、何かSPI通信の設定で確認したほうがよい内容などをご教示頂きますよう、よろしくお願い致します。

  • LGのタッチパネルLCDのSPI通信について

    現在、LG社製のタッチパネルLCD部品でLB035Q02を検討しています。 http://www.devicemart.co.kr/15916#relgoods このLCDのインターフェースにSPIがあったので、マイコンの端子を節約できるなと思い、CPUとこのLCDとはSPIのみをつなげて制御する方法を考えていました。 しかし、他の方から指摘があり、SPIのみではこのLCDの制御は不十分ということを教えてもらったのですが、なぜ不十分なのかわかりません。 このLCDではSPI通信のみではすべて制御することはできないのでしょうか? ご存じのかたいらっしゃいましたら、ご教示頂きますよう、よろしくお願い致します。

  • I2Cについて

    現在、DALLASセミコンダクター社のDS1307というリアルタイムクロックICを制御しようとしています。 仕様書を見ると、I2Cという言葉が出てきたので、自分なりに調べて制御を試みています。 今は、SDA,SCLに与える信号をタイミングが合うように1bit毎に出力していますが、うまくいきません。 具体的には、DS1307からACK信号が帰って来ないためタイムアウトエラーなります。 何かアドバイスがある方がいましたらお願いします。

  • H8/SX で I2C通信

    H8/SX 1655 を使ってI2C通信を試みています。 マニュアルには、送信レジスタ(ICDRT)にデータを書き込めば 自動的にシフトレジスタ(ICDRS)に転送されて、SCL SDA 端子から クロックパルスが出力されると書かれています。 とすると、パルスの出力だけなら Reset 後 MSTP.CRB.BIT._IIC0 = 0;  /* 寝ているI2C0を叩き起こす */ IIC20.ICDRT = 0x90;  /* [Start byte] Slave Address + Write */ この2行で事足りると思うのですが、実際にはクロックパルスは 出力されません。きっと必要な何かが不足しているのだと 思うのですが、当方、初心者にて皆目見当がつきません。 どなたかご教示いただけないでしょうか。 因みに動作モードは、モード6とモード7で試してみました。 よろしくお願いいたします。

  • アトメルマイコンのSPI通信ISRルーチン書き方

    現在、ATxmega128A1Uのマイコンのプログラムを作成しています。プログラム内でSPI通信のSPIFポートでデータの送受信を行わせている箇所があります。 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/M1601A_20161205/MainUnit/event.c 現在、SPIFポートでのデータ受信は無限ループ内で、 if(SPIF.STATUS & 0x80) このコードでデータ受信の有無を確認して、受信バッファの配列変数に確保するようなやり方を在しています。 しかし、このコードだと受信とデータの送信のタイミングなどを考慮した書き方をしないとけなくて、プログラムが複雑になってしまうような気がしていて、もう少しスッキリさせたいと思い、ATMELのC言語で受信時の割り込み時にSPIFの割り込み時にその割り込みの割り込みルーチンのISR関数に飛ぶようにして、そこで受信データを配列変数に入れていくようにすれば、コードがスッキリするんじゃないかと思っています。 そこで、ISRを描きたいのですが、ISR(SPIFの受信ベクタ名)このSPIFの受信ベクタ名をご教示いただきますよう、宜しくお願い致します。 以前、ATmega88PマイコンでUARTの受信をISRのルーチンで同様のことをやった際のコードを見返してみたら、 ISR(USART_RX_vect) このようなベクタ名を書いていたのですが、この”USART_RX_vect”この文字列がどこのプログラムとリンクしているのか、プロジェクト全体で検索をかけてみても見つかりませんでした。 このベクタ名はどこで確認すれば良いかも教えて頂けると幸いです。

  • cpuとeeprom間のi2cバス通信の信頼性について教えてください

    I2Cバス通信の信頼性について教えてください。 cpuとeeprom間をI2Cバス通信で制御したく考えています。 その際、送受信のアドレスやデータのbitがこけたりして、データが書き換わってしまうことはありますか? 通常制御、あるいはノイズ環境での信頼性について分かる方がいましたら教えてください。 よろしくお願いします。

  • 2.42"oledのi2c接続

    amazonで 「Marhynchus OLEDディスプレイ2.42 OLEDディスプレイモジュール」を 買いました。 このOLEDの使い方の簡単な説明が商品説明に有りました。 それはSPIとI2Cのいずれかを使う場合の設定です I2CはR17を外し、R15とR13には半田をする。 (この半田をすると言うのがどの様に解釈してよいのか迷います。 半田でショートするのか抵抗でPULL-UPかDOWNか不明) 自分は念のために4.7Kを端子間にハンダしています。 SPIは初期設定としてR17が付いているのでそのまま使える。 これでI2Cとして使いたいので、R17を外し、R15・R13のそれぞれの端子間に 4.7Kをハンダ付けして、I2Cアドレスサーチで調べましたがNo-Foundで アドレスが見つかりません。 Netで色々な方がこのOLEDを使って実験されていますが、全てSPIでの 使い方でI2Cの記述は有りません。 もしどなたかごI2Cで使用された経験がお有りでしたら教えて下さい。

  • atmegaxマイコンのPDI端子

    現在Atmel Studio6.2 + JTAGICE3でプログラミングを行っています。ATxmega64Aマイコンを使用してプログラミングを行っていこうと思っているのですが、ファームウェアの書き込みやデバッグなどを今まで使用していたATmega88マイコンなどではmiso,mosi端子などを使用して行っていましたが、ATxmega64AマイコンにはPDI,PDO端子というのが設けられていますが、 この端子だけでJTAGICE3でのファームウェアの書き込みやデバッグは可能でしょうか? miso,mosiの端子は書き込みやデバッグでは必要なくなり、SPI通信専用端子として使用できるようことでしょうか? どうぞ、ご教示頂きますよう、よろしくお願い致します。