マイコン工作実験日記

Microcontroller を用いての工作、実験記録

まずはフック検出から

2015-11-22 14:26:12 | SLIC
Ag1171sとNUCLEO-L476RGは次のように接続しています。Vin/Vouには直流カット用のコンデンサがつながっていますが、この図では省略しています。





まずはSHK信号によるフッキングの検出処理から作業開始。PA0はEXTI0に設定して割り込みで検出することにしました。データシートにも明記されていますが、チャタリング処理を施す必要があります。実際に動作を確認してみたところ、写真の数年前に980円で購入した電話機ではオフフック時に10回程度、オフフック時に数回のチャタリングが発生していました。そこでデータシートにとおり10msのディレイをおいてフックイベントの判断してみたのですが、それでもまだチャタることがあるので、15ms待つことに。



チャタリングが除去されて、正しくイベント検出できるようになりました。

Ag1171

2015-11-20 12:26:30 | SLIC
今回のプロジェクトの目玉は、コレです。





SilvertelAg1171です。この会社、PoEやワイヤレス給電関連が目玉商品のようですが、わたしの目に止まったのは安価なSLICモジュールでした。以前、携帯できる電話機を製作した時には、SLICチップを単独で入手するのが困難であったため、150ドルくらいしたSilabsの評価ボードを購入して使っていました。このAg1171はなんと6ドルで買えてしまうのです(送料で23ドルかかりましたが..)。こんな安いモジュールがあったとは!!

ただし、SilabsのSLICチップと違って音声インタフェースはアナログとなります。また、SPIでコマンドを送っていろいろな制御するというような芸当もできません。SLICチップでは音声インタフェースはデジタルでしたので、PCMでつなげていましたが、Ag1171はアナログですので、マイコンのADC, DACを使ってつなげます。SLICチップはトーン生成機能を内蔵していましたから、SPIでコマンドを送ってやればダイアル・トーンやビジー・トーンを出すこともできました。Ag1171ではマイコン側でトーンを生成してDACで送出してやることになります。



制御信号もF/R, RM, SHKの3本しかありません。F/Rは極性反転の制御信号です。RMは着信音を鳴動させる際にHにします。Hの間にF/Rのトグルを繰り返すことで着信鳴動を発生させます。SHKはフック検出の信号で、オフフックするとHになります。電源は3.3Vで動作して、モジュール上のDC/DCで鳴動用の高電圧も生成してくれますが、その際に最大で500mA消費するといスペックになっています。

SLICモジュールは秋月の背の低いピンソケットを使って装着。電話機接続には、秋月のモジュラージャックDIP化キットを使ってみました。まずは、マイコンを使わずに単体での動作確認です。電源を入れて、TIP/RING間の電圧を確認。



45.5V出てますね。電話機をつないでオンフック/オフフックしてみてSHK端子が変化することも確認。モジュールはちゃんと動きそうです。

さて、6ドルのモジュールを買うのに送料で23ドル使うのはもったいないので、ついつい4台買ってしまいました。ひとつは予備でとっておきますが、残り2台をお分けします。ご希望の方はsirius506の売店でポチッてください。

ナンバーディスプレイに挑戦する -- 番外編

2008-12-21 18:20:14 | SLIC
SLICを使ってのナンバーディスプレイ表示問題はなんとか解決できたのですが、原因に気がつく前は、ちゃんとモデム信号が出ているかどうかを確認するために1200bpsのモデムを用意しようと考えていました。そのために手配していたOKIのMSM7512Bが届いたので、いまさらではあるのですが、せっかく買ったチップをこのまま死蔵させてしまうのも "もったいない"ので、モデムボードを組んでみました。



モデム用のチップなんて知らないので、グーグルさんにお伺いをたてて見つけたのが、MSM7512Bです。秋葉で買えるのかもしれませんが、どこで買えばいいのかわからないので、以前コーデックを買ったZaikostoreから通販で買いました。V.23専用の石なので、簡単に使えるようにできています。データシートに載っていた応用回路のとおりに組んで、ホスト側インタフェースのために、秋月のUSBシリアル変換モジュールをつなげてあります。トランスには、600Ω:600Ωのものを使うということで、SANSUIのST-71を使っています。

V.23は基本的に半2重通信で使います。DIP SWは、送受の切り替えとループバック試験のモードを設定しています。



裏側は水晶だけです。3.579545MHzが必要ですが、秋月にあったものを買ってきました。電源はUSB給電です。MSM7512Bは、USBシリアル変換モジュールから引き出した3.3Vで動作させています。



SLICボードとRJ11ケーブルでつないで、実験です。DIP SWでモデムは受信のモードに設定してあります。RJ11がつながった状態では、回線がトランスで終端されるので、SLIC側からはオフフック状態に見えます。モデム基板をつないだCOMポートを端末ソフトで開いて、1200bpsに設定します。バイナリでのダンプができるつなたーむを使うことにしました。

0120506に対応するモデム信号を送ると、きれいにデータが受信できました。90 813F CFの部分が実際に有効なデータ部分で、3FCFがCRCの値になっています。



30 B1 B2 30 35 30 36が、0120506に対応しているのですが、偶数パリティで送る約束になっているので、ダンプデータはB1 B2になっています。

やっぱり、動作確認は「耳で聞く」より、「目で見る」に限ります。0/1のデータが確認できるのがなんとありがたいことか。

ナンバーディスプレイに挑戦する -- その3

2008-12-17 00:17:32 | SLIC
モデム信号送出でハマっていましたが、ようやくと原因がわかりました。

正しくモデム信号が送られていないのではないかということで、前回は300bit分の送出所要時間を確認してみましたが、問題は無さそうでした。そこで、生成している周波数を確認してみようと考え、試しに3秒分の連続マーク(1300Hz)と連続スペース(2100Hz)を生成して実際の音を聞いてみました。すると、どうも低めの音が出ているように感じられたのです。試しに、ダイアルトーンの周波数を400Hzではなくて、1300Hzに設定して鳴らしてみると、明らかに音が違います!!

レジスタ設定値の算出に使ったGUIソフトを立ち上げて、FSK設定での周波数設定パラメータと、オシレータ設定での周波数設定パラメータを見比べて、ようやくと原因に気が付きました。FSK設定で算出されたパラメータはSi3210/3211用の値になっており、Si3215/3216用の値になっていなかったのです。Si3210/3211とSi3215/3216では、周波数生成に使う基本クロック周波数が異なっているので、周波数設定のパラメータ値が違ってきます。GUIソフトでは、使用するチップの種類に応じて、この違いを考慮して計算してくれるハズなのですが、どうやらFSK設定での処理がバグっているらしく、Si3215/3216が選択されていてもSi3210/3211用の値を算出しているようです。

オシレータ設定のタブでは、チップ種別に応じてちゃんと違う値を算出してくれます。どうやら、オシレータ設定の場合とFSK設定の場合では、周波数設定パラメータの算出手順は同じようなので、オシレータ設定のタブで設定値を求めてやりました。



上図がFSKのタブを使って周波数パラメータを求めた画面。下図が同様にオシレータ画面を使った時の画面です。同じ周波数を指定しているのに、Freq(Space/Mark)とOSC1/OSC2の値が全然違います。



ほんとは、正しいパラメータの導出方法に基づいて自分で計算して確認したいところですが、FSKパラメータの導出方法についてはデータシートにもAN32にも記載されていません。Freq/Ampはトーンと同じだろうと見当がつくのですが、Transistionパラメータについてはどういう値を設定すればいいのか全く見当がつかないので、Si3210用に算出された値をそのまま流用することにします。きっと、まっとうな顧客には代理店なりSilabsのサポートが対応してくれるのでしょう。

こうして求めた値を使うように変更して、試験をしてみたところ、メデタク番号が表示できるようになりました。



わかってみれば、たったこれだけのことなんですが、すっかりGUIソフトを信じていたので、ずいぶんと時間がかかってしましました。

ナンバーディスプレイに挑戦する -- その2

2008-12-13 23:20:06 | SLIC
モデム信号さえ出せば、番号表示できそうなところまではきたので、そのモデム信号の出し方を調べました。Si3215ではモデム信号で使うFSK信号の出力機能を持っているのですが、その説明はデータシートにはほとんど記載されておらず、別紙のAN32を参照せよという書き方になっていました。AN32の方をダウンロードして読んでみると、信号を出すのに必要な処理がレジスタの設定値例を含めて具体的に説明してあります。

FSKというのは、データの0/1に応じて搬送波の周波数を変化させる変調方式です。Si3215では、マーク(データ1)ならびにスペース(データ0)の時に使用する周波数と、その時間を設定できるようになっています。基本的に1ビットの出力機能しか持っていないので、送信するデータに応じて、正しくタイミングを取って順番にビット列を送出してやる操作はソフトウェアで実現してやらなくてはなりません。
内部には2ビット分のバッファを持っているので、1ビット分データの周波数を送出している時間内に、次の送信ビットをあらかじめ用意しておいてやります。送出時間が経過すると、タイマー満了割り込みがかるとともに2ビット目のデータの送信が始まります。割り込み処理で、次に送信すべきビットを書き込んでやることで、連続したデータの送信がおこなわれるという仕組みです。

こういった処理の手順もAN32に書いてあったのですが、内容を確認してみると。。。
  1. 表2で説明されているSi3215を使う場合に設定すべき間接レジスタの番号が間違っている
  2. 例示されている設定値は、周波数として2200Hz/1200Hzを使用した場合の値になっている

ことに気が付きました。WikipediaでCaller IDを調べてみるとどうやら米国ではBell 202という規格のFSKを使用しており、そこで使用されている周波数が2200Hz/1200Hzになっているようです。

NTTのナンバーディスプレイではモデム信号としてはV.23が使用されていますので、周波数として2100Hz/1300Hzを使用するように設定を変更しなければなりません。Silabsが用意してくれている、GUIソフトの出番です。周波数と出力レベルを指定してやると、設定すべきレジスタの値を算出してくれます。



算出された設定値を使って、発信者番号の送信処理を組んでみたのですが、まだ番号表示できません。実験には新たにclidコマンドを用意しました。端末起動信号用のRINGを送出したら、オフフックを待って、それを検出したらモデム信号を送出するという一連の処理を連続的に行うコマンドです。



送信しているのは発信者番号 0120506 に相当するモデム信号です。実際のデータが始まる前に充分に長い連続したマークを送出することで、全体が300bitになるようにわざと長さを調節してみました。1200bpsのレートで送出しているので、送出時間は1/4秒となるハズで、ほぼそれに近い248msが所要時間として表示されています。ですので、送出に要する割り込み処理が間に合っていないとかいうことは無いと考えているのですが。

安もの電話をつないで、実際の音を聞いてみると、モデムっぽい音はちゃんと出ているようなのですが。。。モデム信号を確認する方法を考えた方がいいのかなぁ。

ナンバーディスプレイに挑戦する -- その1

2008-12-11 00:09:10 | SLIC
予想していたよりも簡単にDTMF検出ができてしまって、SLICの基本的な使い方もわかってしまいました。SIPの方も発信は確認できているので、基本通話ができるメドが立った感じです。しかし、せっかく$150も払って買ったSLICボードですので、もう少し使いこなしてやろうという欲が出てきました。そんなわけで、ナンバーディスプレイに挑戦してみることにしまいた。

アナログ電話に関する技術的な情報は、NTTが電話サービスのインタフェースとして公開しています。この技術参考資料の中でナンバーディスプレイについても解説されているので、この仕様に沿って必要な信号をSLICから送出してやれば、電話機は発信者番号を表示してくれるはずです。

技術参考資料からナンバーディスプレイのシーケンスを抜き出すと下図のようになります。NTTの方が書いたこの記事からの拝借です。



極性反転というのは、RJ11の2本の線の極性を反転してやる操作で、これはSLICの64番レジスタで操作できます。次の情報受信端末起動信号というのは、0.5秒鳴動/0.5秒休止の周期で呼出し信号を送出してやることのようです。ですので、これもSLICのRING関連のレジスタを設定してやることで、実現できます。普通の2秒/1秒の周期の呼出し信号の場合には電話機は着信音を鳴らしますが、この情報受信端末起動信号の場合にはナンバーディスプレイ対応の電話機は着信音を鳴らさないのです。ナンバーディスプレイに対応していない安物電話機では、こんな芸当はできないので、短い周期でベルが鳴り始めます。

一次応答信号というのは、なんのことはない、Off-hook信号のことです。実際には人間が受話器をとりあげているわけではないですが、電話機が自動的にオフフック操作をすると思えばいいでしょう。これを受けて、SLIC側から発信者番号情報をモデム信号として送信してやります。モデム信号については、SLICが持っているFSK信号の送信機能を利用することで送信できます。

電話機側ではモデム信号を受信して、それに対応する番号情報を表示すると、受信完了信号を送信します。この信号もなんのことはない、実体はオンフック信号です。

シーケンスは理解できたので、初めの部分だけでも早速実験してみようということで、実験環境構築。自宅の電話機をつなげてみました。



ファームウェアの側では、最初に極性反転して、ベル周期を変えた鳴動を開始するためのコマンドslic clidを追加しただけです。



コマンドを入れて、しばらくするとOff-Hookが検出されてます。つまり、電話機が情報受信端末起動信号に対して一次応答信号を送ってきているのが確認できたことになります。この時、電話機のLCDには次のように表示されていました。どうやら番号情報の受信待ちの間は、このように表示するようになっているようです。



本来であれば、ここで番号情報をモデム信号で送ってやるべきなのですが、まだそんな機能は用意できていないので、何も送れません。待つこと数秒で電話機側がタイムアウトして送ってくるのが受信完了信号に対応するOn-Hookです。電話機側の表示は次のようになりした。



何も情報送ってませんからね。と、いうわけで送るべきモデム情報さえ送ってやれば、番号表示してくれそうです。

DTMFを検出する

2008-11-30 21:11:03 | SLIC
フッキング操作の検出と、ダイアルトーンの送出はできたので、次はいよいよダイアル番号の検出をせねばなりません。ダイアルされた番号は電話機の設定に応じてDTMF(トーン)信号またはパルス信号で送出されてきますので、このどちらか(あるいは両方)を検出してやる必要があります。先の記事で書いたように、今更パルス信号でもないので、おのずとDTMF信号を検出することになります。ところが、Si3215ではDTMF検出の機能はサポートされていません。Si3210やSi3216を使えば、DTMFの検出ができるのですが。。

そういうわけで、DTMFの検出はマイコン側でやってやらねばなりません。電話機が生成したDTMF音はu-LawにエンコードされたPCM信号としてAT91SAM7XのSSCで受信できるので、これを解析してDTMF検出することになります。Googleさんに助けを求めてARM用のコードを探すと、簡単にonARMにあるSTM32用のコードが見つかりました。ターゲットはSTM32用となっていますが、DTMF検出の部分は全てCで書いてあるのでAT91SAM7Xで使うことには何の問題も無さそうです。ただし、Keil/ARMの息がかかっているので、KeilのuVisionで使うことという条件付きになってしまっていました。

しかたなくもう少し探したところ、NXPのサイトでLPC2138を使った電話の自動応答装置のプロジェクトを見つけました。しっかりとした説明とソースも含まれており、かなり参考になる記事です。ちょっと調べてみたら、NXPの前身であるPhilipsが2005年に開催したARM Design Contestで最優秀賞をとったTAM-TAMという作品のようです。ENC28J60を使ってethernetをつなぎ、TCP/IPにはuIPを使うという定番がキッチリおさえられています。基板もきれいにこさえて、開発にはuVision/Keil使っているみたいなので、やはり玄人さんが趣味で作った作品という感じでしょうか。こちらのコードもすべてCで書いてあり、Goertzelのアルゴリズムに基づいてDTMFが使う8つの周波数成分毎のエネルギーを計算しています。Keilのコードもそうでしたが、整数演算で済むようにあらかじめ入力されるサンプルの値はオーバフローが発生しないようにレベルを調整しておく必要があります。このTAM-TAMの場合にはサンプルの値は-256~256の範囲にあることを想定しているようです。

SLICからのPCM信号はu-Lawになっているので、これを展開して-256~255の範囲におさままるようにテーブルで変換してからTAMA-TAMのDTMFprocess()関数を呼び出してやると、いとも簡単にDTMF検出できちゃいました。うーん、デジタル信号処理って素晴らしいですねぇ。実際のところ、変換しないでu-Lawのままで直接 DTMFprocess()関数を呼び出しても DTMF検出できてしまったのですが、誤検出する可能性が高くなるかもしれないので、一応変換してから処理することにしました。

以下、動作の様子です。
]]] MMnetSAM7X Console Monitor [[[
> slic init
ProSLIC detected.
1652ms
> dtmf start

"dtmf start"でDTMF検出を呼び出すPCM受信タスクを起動しています。
> Off-Hook.
DTMF: 0
DTMF: 1
DTMF: 2
DTMF: 3
DTMF: 4
DTMF: 5
DTMF: 6
DTMF: 7
DTMF: 8
DTMF: 9
DTMF: *
DTMF: 0
DTMF: #

受話器を取り上げて、ボタンを順番に押していくと、きれいに認識できています。
On-Hook.
Off-Hook.
DTMF: 0
DTMF: 1
DTMF: 2
DTMF: 3
DTMF: 4
DTMF: 5
DTMF: 6
DTMF: 7
DTMF: 8
DTMF: 9
DTMF: *
DTMF: 0
DTMF: #

> On-Hook.

いったんオンフックして、再度オフフック。今度は、リダイアル・ボタンを押してみました。さきぼどの順番で欠けることなくきれいに認識できています。思わず、ヤッター!と声が出てしまいました。DTMFの検出なんてコードの実装に時間かかるんじゃないかと心配していたのですが、あっけなくできちゃってビックリです。

フッキングの検出とダイアルトーン

2008-11-27 23:05:38 | SLIC
SLICの初期化と音声の送出の確認はとれたので、次にオンフック/オフフック操作の検出とダイアル・トーンの送出をやってみました。

オンフック/オフフックでは割り込みをかけられるので、これを使って検出をおこなっています。オンフック/オフフックに伴い回線ループが開/閉されると、Loop Closure Transition Interruptが発生します。この割り込み要因はレジスタ19を読んで判別できますが、これだけでは状態が変化したことがわかるだけです。そこで、さらにレジスタ68を読んで実際のフッキング状態を確認することで、オンフック/オフフックのいずれであるかを判断してやります。
]]] MMnetSAM7X Console Monitor [[[
>
> slic init
ProSLIC detected.
1652ms
> Off-Hook.
On-Hook.

> slic ring
> Ring Trip
On-Hook.

>

ちょっと特別なのが、着信に対して応答する際のオフフック操作です。呼出音がなっている最中にオフフックした場合には、ループ状態変化の割り込みではなく、Ring Trip Interruptが発生します。ベルとベルの間の1秒間の休止期間の間にオフフックすれば、Loop Closure Transition Interruptになります。Ring Tripというのは電話屋さん用語なのでしょうが、日本語では何と訳すのでしょうか?

ダイアルトーンの送出はとっても簡単です。オシレータに周波数と送出レベルを設定して、オシレータをイネーブルするだけ。周波数の設定はすでにSLICの初期化処理のなかでやっているので、単にイネーブル/ディスエーブルするだけでダイアルトーンの生成開始/終了ができちゃいます。アプリケーションノートAN35に記載されているレジスタ設定値は米国仕様でしかもSi3210/3211用の値なので、日本仕様の400HzをSi3215で生成できるように設定値を計算しなおしてやります。計算の具体的な手順はデータシートで説明されていますが、Windows GUIソフトを使って求めることもできます。GUIソフトは、普通は評価ボードをつなげて使うのですが、ボード無しでも使えるようになっており、各種レジスタの設定値を求めることができます。気がきいてますね。

AN35に記載されているレジスタ設定値を読んで、初めて知ったことがひとつ。上記のように日本ではダイアルトーンは400Hzの単一トーンですが、USでは350Hzと440Hzの和音なんですね。確かに、そう言われてみれば、「ポー」というサイン波的な音ではなくて、「ボー」という感じに聞こえる音ですよね。改めて納得した次第です。Wikipediaによると欧州では425Hzの単一トーンが一般的なようです。

おっと、ひとつ確認したかったことがあったのを思い出しました。ダイアルパルスの検出です。今どき、電話機をわざわざパルスダイアルの設定に設定にすることも無いので忘れてましたが、パルスって一定のタイミングで回線ループの開閉をおこなっているだけですから、オンフック/オフフックで検出できていいはずです。さっそく、実験してみました。
>
> Off-Hook

>
> On-Hook
Off-Hook
On-Hook
Off-Hook
On-Hook
Off-Hook
On-Hook
Off-Hook
On-Hook
Off-Hook

>
> On-Hook

>

まずは、電話機を20PPSのパルスダイアリングに設定します。こういう時、安もの電話機はスライドスイッチだけで設定変更できますから、便利ですねぇ。受話器をオフフックした時に表示されたのが最初のOff-Hookメッセージです。

続いてダイアルボタンの5を押してみました。On-Hook/Off-Hookがバラバラと連続して5回表示されました。最後のOn-Hookは実際に受話器をオンフックした際のメッセージです。電話機の設定を10PPSに変更すると、表示される間隔が目に見えて長くなるのがわかります。

パルスダイアリングの検出の仕掛けは確認できましたが、わざわざこれを使うこともないでしょうから、実験はこれでオシマイにしてパルス・ダイアルのデコード処理には取り組まないことにします。

SLICの初期化

2008-11-24 22:39:35 | SLIC


Si3215MLにはたくさんのレジスタがあるので初期化だけでも大変なのではないかと心配していましたが、アプリケーションノートのAN35に手順が明記されていました。RESET端子をLOWにする事から始まり、キャリブレーションも実行したりして、全部で28ステップにも及ぶ手順が記載されています。最初はAN35のとおりにプログラムを組んだのですが、実際に動作させたり調べたりした結果、以下の点を変更しています。
  1. 呼出し周期の変更 呼出し音は米国仕様の2秒鳴って4秒止まる設定になっているので、評価ボードでの実験の時と同じように日本流の1秒/2秒に変更
  2. オンフック電圧の変更 オンフック時にTIP/RING間に加わる電圧を48Vから12Vに変更
  3. オシレータ1の周波数設定の変更 日本仕様ダイアルトーンの生成に備えて400Hzに変更
オンフック電圧については、このあたりの情報を元に12Vにしてみました。実験用の電話機は6Vでも動作してくれました。

呼出時にかかる電圧としては、75Vを設定しています。ここも低くできそうなので、試しに74番レジスタを48Vにしてみたのですが、キャリブレーションが終了できなくなってしまいました。おそらく関係する他のレジスタの設定変更も必要となるのでしょう。

初期化ができたので、早速音声出力の試験です。全ての操作はモニタから対話的にコマンドを入れて行っています。
]]] MMnetSAM7X Console Monitor [[[
> 
> slic dump
   0: 33    1: 88    2: 00    3: 00    4: 00    5: 00    6: 60    8: 02
   9: 00   10: 08   11: 33   14: 10   15: 00   18: 00   19: 00   20: 00
  21: 00   22: 00   23: 00   28: 00   29: 00   30: 00   31: 00   32: 00
  33: 00   34: 00   36: 00   37: 00   38: 00   39: 00   40: 00   41: 00
  42: 00   43: 00   48: 00   49: 00   50: 00   51: 00   52: 00   63: 54
  64: 00   65: 61   66: 03   67: 1f   68: 00   69: 0a   70: 0a   71: 00
  72: 20   73: 02   74: 32   75: 10   76: 00   77: 00   78: 00   79: 00
  80: 00   81: 00   82: 00   83: 00   84: 02   85: 02   86: 00   87: 00
  88: 00   89: 00   92: ff   93: 34   94: 00   96: 1f   97: 1e   98: 10
  99: 10  100: 11  101: 11  102: 08  103: 88  104: 00  105: 00  107: 08
 108: 00
   0: fb97   1: 23fe   2: a981   3: 4b9e   4: c7dc   5: ff34   6: 3e57   7: fffb
   8: b2a9   9: ef71  13: edb6  14: 1a7e  15: e6ff  16: c333  17: dfec  18: 42c7
  19: bf6c  20: aeff  21: 2bdf  22: d94a  23: 32f8  24: e3f7  25: 236d  26: 5783
  27: bef9  66: c7ff  69: af54  70: e0b6  71: 68fd  72: f45d  73: f735  74: ffaf

> slic init
ProSLIC detected.
1652ms
> 
> slic dump
   0: 33    1: a8    2: 00    3: 00    4: 00    5: 00    6: 60    8: 00
   9: 00   10: 28   11: 33   14: 00   15: 00   18: 00   19: 00   20: 00
  21: 00   22: 03   23: 00   28: 00   29: 0c   30: 40   31: 00   32: 00
  33: 00   34: 00   36: 00   37: 00   38: 00   39: 00   40: 00   41: 00
  42: 00   43: 00   48: 40   49: 1f   50: 80   51: 3e   52: 00   63: 54
  64: 11   65: 61   66: 03   67: 1f   68: 04   69: 0a   70: 0a   71: 00
  72: 08   73: 02   74: 32   75: 10   76: 00   77: 00   78: 08   79: 00
  80: 07   81: 28   82: 3f   83: 3f   84: 01   85: 01   86: 00   87: 00
  88: 01   89: 00   92: 60   93: 38   94: 07   96: 00   97: 00   98: 11
  99: 10  100: 10  101: 0f  102: 03  103: 23  104: 09  105: d8  107: 07
 108: eb
   0: 7e70   1: 0038   2: 0000   3: 7870   4: 007d   5: 0000   6: 0000   7: 7ef0
   8: 0160   9: 0000  13: 4000  14: 4000  15: 1000  16: 3600  17: 1000  18: 0080
  19: 07c0  20: 376f  21: 1b80  22: 8000  23: 0320  24: 008c  25: 008c  26: 0010
  27: 0200  66: 1000  69: 00da  70: 6b60  71: 0074  72: 79c0  73: 1120  74: 3be0

> 
まずは初期化処理を実施。リセットして、各種レジスタの設定ならびにキャリブレーション。具体的にどのような調整をしているのかという詳細はてんで理解できていないのですが、全ての初期化処理を実施するのに1.652秒かかっています。初期化処理の最後ではSLICをアクティブ状態とし、オンフック電圧が印加されます。

> slic ring
>
> slic active
>
試しに呼出音を鳴動させてみます。うん、ちゃんと1秒/2秒の周期で鳴ってくれます。アクティブ状態に戻すことで、呼出音を止めます。掲載した写真では電話機のLEDが赤く点灯しているのがわかりますが、この電話機は呼出音の鳴動周期に合わせてLEDが点灯/消灯します。
> hello start
started.
> hello stop
> 
SSCを使ってSLICに対して音声PCM信号を送出するタスクを起動。受話器から"Hello, World"が聞こえます。SPI関連とPCM関連の両方とも問題なく動作しているようです。


SLIC評価ボード経由で音声を出す -- その2

2008-11-19 23:44:20 | SLIC
評価ボード側の準備ができたので、続いてTA基板側の作業です。TA基板側ではコネクタだけでなく、クロックの準備が必要です。Si3215Mで使用できるPCLKの周波数は256K, 512K, 768K, 1.024M, 1.536M, 2.048M, 4.096M, 8.192MHzのいずれかである必要があります。以前、タッチパネル・ジャケットを作った時に使った2.048MHz水晶発振器の買い置きがあったので、これを使うことにします。写真からはわかりませんが、基板の裏側に配置してあります。



さて2.048MHzからPCLKとFSYNCを作るわけですが、水晶発振器の出力をタイマの外部クロック入力端子であるTCLK2に接続し、TC1とTC2のふたつのタイマーを使って分周しています。



PCLKに2.048MHzをそのまま使わずに、2分周している理由は... 正直言ってよくわかりません。2.048MHzそのままだと、なぜか音声信号を出力するSSCの送信がうまく動いてくれなかったからです。どういうわけか2分周するとちゃんと動いてくれます。何か原因があるはずですが、究明できずにいます。とりあえず、これで動くので、先に進もうかと。。じつは、他にもトラブルがあったのですが、その件についてはまた次の記事に書くことにします。



TA基板上では、いつもの "Hello, World"をSSCに出力するタスクを作成しておき、2枚の基板を接続です。さらに、電源、PCと電話機を接続して動作試験開始です。
  1. まずはTA基板から電源投入。PCLK/FSYNCの生成開始。SLICが動作するのに、これらのクロックが必要ですので。
  2. SLIC評価ボードに電源投入。GUIソフトを使って、SLICリセット、初期化、レジスタ初期設定。
  3. SLIC状態設定。調べてみるとレジスタ初期設定の段階でPCMはmu-Lawに設定されて音声を流す準備が整っていました。SLICをactiveな状態にするために64番レジスタに0x01を書き込み。
  4. TA側音声出力タスク起動。

電話機から"Hello, World"が聞こえました!! PCに頼っているSPIでのSLIC制御の部分をTA基板に実装すれば、電話機制御できることが明らかになりましたので、SIP TAが実現できることとが確実になったと言えます。

ボード間接続用コネクタは入力と出力の両方を用意しておきましたが、出力できることが確認できたので、入力側の実験は省略することにします。次のステップはいよいよ、SLICボードとTA基板の合体です。