[[HobbyElectronicsWiki]] *DSPラジオM6955 [#paabe510] [[aitendo>http://www.aitendo.com/product/7012]]のDSPラジオモジュールを使ったマルチバンド(MW/SW/FM)のラジオです。LPC812でコントローラを作成してダ●ソーのスチロールケースに組み込みました。 &ref("DSP_radio.jpg",,50%); **参考情報 [#cde3ba6d] ***AKC6955 [#x9f08793] モジュールに使われているDSPラジオチップは AKC6955 というものです。I2Cでコントロールします。単体でも販売されています。スレーブアドレスは0x20です。 このAKC6955には小電力ですがアンプが内蔵されておりスピーカを直接鳴らす事が出来ます。またモノラル構成(私はこれで作成しました)の場合はL+Rを合成した信号でスピーカを鳴らす事が出来ます。小電力とは言っても室内で聴くには充分な音量が出たので外付けのアンプは取りつけていません。音量は内蔵の電子ボリュームで調整も出来ますが外付けのVRでも調整が出来き、デフォルトではモノラル・外付けボリュームとなっています。ボリューム端子を開放していると最大音量で鳴ります。 このICのI2Cは非常に癖があるというか、電流の引き込み能力が弱いです。ですからI2Cのプルアップ抵抗は慎重に選択して下さい。少しでも適正値から外れると書き込みや読み出しに失敗します。 ネット上では「400kHzでないとアクセス出来ない」「100kHzのデバイスと共存出来ない」という情報も散見されますが、おそらく適切な抵抗値を使っていないからだと思われます。制作したラジオのSCLのクロックは100kHzですが問題無くアクセス出来ています。 &ref("AKC6955_I2C.jpg"); 上記の写真はAKC6955のI2Cバスの様子を観察したものです。上がSCL下がSDAです。AKC6955のACKにあたる箇所りSDAのレベルが0Vより浮いているのが確認出来ると思います。このACKはAKC6955が電流を引き込む所なので、この能力が劣っていると考えられます。このACKのレベルがマイコン(マスタ)側でLと認識されないとNACK(デバイス無し)になってアクセスに失敗します。低消費電力のI2C LCDでも見られた現象なのでよくある事なのかもしれません。 上記の写真はAKC6955のI2Cバスの様子を観察したものです。上がSCL下がSDAです。AKC6955のACKにあたる箇所のSDAのレベルが0Vより浮いているのが確認出来ると思います。このACKはAKC6955が電流を引き込む所なので、この能力が劣っていると考えられます。このACKのレベルがマイコン(マスタ)側でLと認識されないとNACK(デバイス無し)になってアクセスに失敗します。低消費電力のI2C LCDでも見られた現象なのでよくある事なのかもしれません。 アクセスする前にPON端子をHにして下さい。PON端子がLのままだとACKだけでそれ以上通信が継続できません。またソフト的にもPOWER_ONビットがあるので内部レジスタ0x00のPOWER_ONビットを立ててから各種設定を行って下さい。 基本的な設定は +CTRL0のPOWER_ONビットに1を立てる +CTRL0のFM_ENビットでAMかFMかを指示する +CTRL1にバンドを設定する +CTRL2と3にチャンネルステップと周波数から計算した受信チャンネルを設定する +CTRL0のTUNEとSEEKビットを(念のため)クリアする +CTRL0のTUNEビットをセットする(0→1の変化でチャンネルセットが開始される) +CTRL0のTUNEビットをクリアする +ROR0のtunedビットに1が立つ→完了 I2Cのアクセスが安定していればそれほど難しい石ではないです。他の機能としてRSSIや電界強度、周波数偏差、電源電圧を知る機能があります。 バーアンテナは3アイコー電子360μHのPA-63Rを使いました。必要最低限の小型のバーアンテナですが良く聞こえます。ただ低い周波数は感度が弱いみたいです。 バーアンテナには向きがあるのでデジタル系の配線からは離した方が良いです。LCDに電界強度、周波数偏差を表示させるために定期的にアクセスしていますが、上手く配置してやればノイズは入らないみたいです。 ***LPC812 [#t4036f8f] 制御するマイコンはLPC81xシリーズで一番大きなフラッシュを持つLPC812を使用。内容を絞ればLPC811でも入らなくはないとは思います。LPCOpenを汎用に使えるように改造してペリフェラルのドライバとして使用しました。 現時点のLPCOpen(Ver2.01)にはI2CのROM APIを使うサンプルにはバグがあり、 periph_i2c_rom.cの中にある SendReadI2CMaster 関数の中で、本来はi2c_master_tx_rx_intr APIを呼び出すべき所を、i2c_master_receive_intr APIを呼び出しているのでそのままでは正しく動作しません。 LPCOpenで動作させると、そのままでは24MHzのクロックで動作します。消費電流は4mA程度です。M6955自身の消費電流が40mAぐらいあるので節電は特にしていません。 ***ロータリエンコーダ [#r2ad35b0] 共立電子の機械式のロータリエンコーダは1クリック2パルスなので2パルスで1検出になるようにしてます。 ***EEPROM [#y2bfd3e3] 現在の各バンドの周波数と受信局を記録する為の不揮発メモリ。 バンドを切り替えたりメモリモード時に記録操作をすると現在の受信周波数を記録する。 256chの周波数・バンドメモリとしても利用可能。 ***押しボタン [#j0d9d738] 外に出す押しポンは2つ。 | |マニュアル選局|メモリ選局|メモリ記録|h |PUSH SW0|バンド選択|状態記録|メモリ記録| |PUSH SW1|メモリ/マニュアル切替え|切替え・長押しでメモリ追加|切替え| -マニュアル選局時はバンドを選択してロータリーエンコーダで選局する -メモリ選局時はロータリーエンコーダで記録したメモリに従って選局する -メモリ選局時にSW1を長押しすると記録モードに変わるのでメモリCHを選択してSW0を押すと記録してメモリ選局モードに変わる -メモリ選局モード時にSW0を押すと現在の受信局をメモリに記録して次回起動時に再現する -マニュアル選局時はバンドを切替えると現在の受信局をメモリに記録する ***LCD [#v8a9d964] [[ストロベリー・リナックス>https://strawberry-linux.com/catalog/items?code=27001]]のI2C LCDです。 **回路図 [#b57dd3a8] &ref("M6955_rev1.png",,33%); -ISPモードでプログラムを書き込むだけならDEBUG I/Fは不要。 **ファーム [#ob597eb5] -バイナリ &ref("LPC812_M6955_DSP_Radio.zip"); -AKC6955のドライバ部分 &ref("akc6955.zip");