秋月などで買えるRL78G1C(R5F10JBCAFP, 32pin)ですが、「Renesas USB MCU, USB Peripheral Human Interface Devices Class Driver (PHID) using Basic Mini Firmware」で公開されているソースコード、そのまま動かないようです。なお、USBキーボードとして動作させるモードを使おうとしてます。
今、作業始めて見つけた条件の違いは、
(1) 48pinが、前提で、32pinにはないポートをスイッチに割り当てている。再配置が必要かも。←sw1,sw2,sw3で使ってるポートは、32pinにもありました。(2) 外付け水晶を使った発信が前提で、内蔵発信器になっていないこと。ロースピードで良いので、内蔵発信器で動くようにしたい。(3) 今後の作業で見つけていきます。
上記の3つの中で、(2)の変更をするための情報が知りたく、お願い致します。
RL78G10と同様の回路で、制御プログラムは書き込めているようです。
ユーザズマニュアルでは、下記の記載がヒントかな。
② 高速オンチップ・オシレータオプションバイト(000C2H)により,fHOCO = 48 MHz (TYP.) /24 MHz (TYP.)から周波数を選択し,発振させることができます。CKSELRビット(MCKCレジスタのビット0)を"0"に設定すると,周波数fHOCOをRDIV0, 1ビット(MCKCレジスタのビット1, 2)の設定によって,2/4/8分周(2分周がデフォルト)したクロックがメイン・システム・クロック・ソース(fIH)として選択されます。リセット解除後,CPUは必ずこの高速オンチップ・オシレータ・クロックで動作を開始します。USBクロックとして高速オンチップ・オシレータ・クロックをソースクロックとして選択(USBファンクション・コントローラ機能のロウ・スピード転送時のみ使用可能)する場合は,fHOCOの周波数選択を48 MHzとした上で,メイン・システム・クロック(fMAIN)に必ずfHOCOを分周したメイン・システム・クロック・ソース(fIH)を選択して使用してください。STOP命令の実行またはHIOSTOPビット(CSCレジスタのビット0)の設定により,発振を停止することができます。オプション・バイトで設定した周波数は,高速オンチップ・オシレータ周波数選択レジスタ(HOCODIV)で変更できます。周波数は,図5-9 高速オンチップ・オシレータ周波数選択レジスタ(HOCODIV)のフォーマットを参照してください。
③ PLL(Phase Locked Loop)による高速システム・クロックの逓倍機能USBホスト/ファンクション・コントローラ用のクロック供給を主目的としたクロック機能で,PLL発振周波数(fPLL)が48MHzとなるようにDSCCTLレジスタを設定して使用します。また、CKSELRビットを"1"に設定すると,周波数fPLLをRDIV0, 1ビットの設定によって,2/4/8分周したクロックがメイン・システム・クロック・ソース(fIH)として選択されます。USBクロックとしてPLLクロックをソースクロックとして選択する場合はメイン・システム・クロック(fMAIN)として必ずfPLLを分周したメイン・システム・クロック・ソース(fIH)を選択して使用してください。DSCONビット(DSCCTLレジスタのビット0)の設定により,PLLを動作,停止させることができます。なお,PLLの設定の詳細およびUSBクロックとの接続関係に関しては図5-12,表5-3を参照してください。
これの具体的なプログラムがどうなうのか? でも、②と③で、混乱
試しに、「// MCKC |= 0x01; /* Select PLL clock (fPLL) */」とコメントアウトすると、下写真のエラーメッセージがでるようになったが、どう設定するのだろうか?
上写真は、ロースピードでつけろと書いてあったコンデンサを外した時のエラー。
前提として、USBデバイスとして、使うときは、水晶発振器が必須ということではないですよね。
-------
デバイスマネージャのダイアログを見ていると、一瞬、HIDキーボードデバイスとして、認識されているようだ。
digipontaさん
図5-1 クロック発生回路のブロック図を見ると、内蔵高速発振器をUSBに接続するには以下の設定でよさそうですよ。
DSCCTL=0x00;//DSFRDIV=0分周なし(PLLを使わない場合はDSCCTLの設定は不要かも) HOCODIV=0x00;//48MHz MCKC=0x00;//FIOCO選択
内蔵発振器の精度だとUSB規格的にLow-speedにしか対応できないんですよねー。
ちなみに、LowSpeedなので、G1CのD-/D+のラインにそれぞれ0.22uF 220pFくらいのコンデンサをつけてます?
Kirinさん、情報、有難うございます。試すと、残念ですが、認識エラーのままでした。
とりあえず、RL78G1Cの32pinに、外付けで12MHzの水晶振動子を付けて、動作確認をしたところ、サンプルソースコードを無修正で、PCからHIDキーボードデバイスとして認識されました。
現状までの確認では、RK78G1C/32pinに、外付け12MHz水晶振動子(外部コンデンサは2個とも10pF、抵抗は零Ω)を付けると、サンプルソースコードは無修正で、キーボードモードが稼働。SW1,SW2, SW3のポートは、32pinパッケージにも出廷ます。
しかし、秋葉原の店頭で買える12MHz水晶振動子が、大きすぎる(;^ω^)
Kirin さん
有難うございます。
不安定ながら、HIDキーボードとして認識されるようです。ブレッドボードでの実験に問題があるようです。
あと、D+とD-のポートを、いじくっていると、チップが簡単に壊れるようで、困惑中。
結局、外付け水晶振動子なしで、HIDキーボードに認識が正常にできました。
但し、E20を接続していないと、認識されない状況(;^ω^)
ソースコードの修正は、レス通りの下記です。低速モードで、D+とD-に必要になるコンデンサ値が、ユーザズマニュアル・ハードウェア編のページ693の図だと、200nF-450nFとありますが、これがまずミスプリですよね(;^ω^) 200pF-450pFの読み替えるのが正しい?
void usb_cpu_mcu_initialize(void){ volatile uint8_t ostc_reg_val;
#if 1 // 外付け水晶振動子無しのの場合 *((volatile unsigned short *)0xf06C4) = 0x0001; //UCKSEL DSCCTL = 0x00; //DSFRDIV=0分周なし(PLLを使わない場合はDSCCTLの設定は不要かも) HOCODIV = 0x00; //48MHz MCKC = 0x00; //FIOCO選択
#else // もともとのソースコード /* To operate the X1 oscillator */ CMC = 0x41; /* X1, 10MHz<fx<=20MHz */
/* Select the oscillation stabilization time of the X1 oscillator at releasing of the STOP mode. */ OSTS = 0x05;
/* To start oscillating the X1 oscillator */ MSTOP = 0; /* Start X1 (12MHz)*/
/* To set the PLL multiplication and division */ DSCCTL = 0x06; /* Divided by 2, 16 times (8 times) */
/* Main Clock Control Register (MCKC) Address F02E6h */ MCKC = 0x00; /* Devided by 2, High-speed on-chip oscillator clock (fHOCO) */
/* PLL Control Register (DSCCTL) Address F02E5h */ DSCCTL |= 0x01; /* Ocsillation, output */ usb_cpu_delay_1us(40); /* wait 40us */
/* Main Clock Control Register (MCKC) Address F02E6h */ MCKC |= 0x01; /* Select PLL clock (fPLL) */ usb_cpu_delay_1us(40); /* wait 40us */
/* Wait oscillation stabilization time */ usb_cpu_delay_1us(40); while ( 1 ) { ostc_reg_val = OSTC; if ( ostc_reg_val == (uint8_t)0xFC ) { break; } }#endif } /* eof usb_cpu_mcu_initialize() */
バグあり基板を、ジャンパで訂正して、動作確認しまいした。D+とD-のコンデンサは、220pFいれました。抵抗器はいれてないです。ないとだめなのか不明。
あとは、E20を繋げないでも、正常動作させる不具合の解決。
E20が無いと動かないというのはGNDが問題かな?
抵抗は速度通知のために必要です。
http://www.kumikomi.net/archives/2007/03/22usb1.php?page=4
このプロセッサは内蔵のプルアップ・プルダウン抵抗があるんですね。
DRPD、DPRPU、DMRPUを設定すればOKみたい。
Yamamoto さま
情報、有難うございまいます。D+とD-のプルアップは、サンプルソース側で、設定しているようです。
説明不足で申し訳ないですが、抵抗値で分かりかねているのは、下画像のR1,R2です
だいぶ動いてきて良かったですね。
G1Cの電気的特性やRSKの回路図を見る限り、ロースピード・非ロースピード共にD+D-は抵抗なしでコネクタとCPUを直結で問題なさそうですよ。 documentation.renesas.com/.../r20ut1981eg0100_rskrl78g1c_schematics.pdf 最近のマイコンはUSBのダンピング抵抗(R1,R2)も内蔵になっていそうですから。
差動90Ωは、ロースピードならあまり気にしなくても大丈夫です。(どうしてもというなら、空中配線でケーブルをよってツイストペアにすれば100Ω前後になりますし)
すみません、勘違いしていました。
ところでE20を外して動作が出来ないことはまだ解決できていないんですよね?先にそちらを潰さないとR1,R2,C1,C2の議論が出来ないような気がします。D+/D-いじってチップが壊れるって書かれているは電気的に壊れるってことですよね?回路を見ないでの発言なので無責任ですが、どこか間違いがあると思います。E20をつないだ状態でだけ動くようになっているのがとても気になります。E20とDUTは同じPCにつながっているんですよね?
もっと先の話かもしれませんが、D+/D-にはTIのTPD2E001 みたいなESD対策部品を置けるようにしておくと良いかと思います。
Kirin さま
有難うございます。外部水晶発振子付ける場合でしが、ブレッドボードでの動作確認も、USBのD+とD-は、直結とすれば、何とかPCからの接続を維持してくれるようです。この構成だと、USB電源でも動作しました。
外付け水晶振動子付けた場合で、上記は、E20を繋げなくても、PCから認識されるようになりました。
現在、ロースピードの動作確認で、E20を外すと、PCから、認識されたり、見えなくなったりと不安定な況です。やはり、アナログ的な問題と考えています。
外付けの水晶振動子12MHzを使う方向が安定しているようなので、紹介の外付け水晶振動子を付けられるようにPCBを修正中です。
現在の基板は、RL78G1Cから水晶振動子のピンを出してなかったので、試せないのが、残念無念。
【備考】
上記のBCBは、RL78G1Cのオンボードと、GR-KURUMI(RL78G13)と、9軸モーションセンサと、16個のフルカラーシリアルLEDと、13個のプッシュスイッチ(ファンクションケキー専用)を搭載した片手用ゲームコントローラになる予定です。
M16Cの資料なので参考までに
documentation.renesas.com/.../rjj05b1554_m16cap.pdf
あと、Teseraが設計したRL78/G13 Stick ボードのデバッガ側のマイコン78Kですが、これのR1,R2に相当する抵抗は33Ωでした。データシート通りならアートワークでインピーダンスマッチングがバッチリならダンピング抵抗は無くて大丈夫です(私は小心者なので過去の設計は全て27Ωが根本に付いていたりします・・・)。
Yamamotoさん
あれですよ、あれ!
USBは受信端に終端抵抗がないので、全反射しちゃいます。そのため、 D+/D-の根元で直列終端することで反射を吸収できる仕組みなので、「USBドライバの出力インピーダンス+直列抵抗」=45Ω (=90Ω÷2)になる必要があります。 外付けの抵抗はドライバーの出来上がりに合わせて調整するため、27Ωが推奨されているUSBドライバーはドライバーの出力インピーダンスが18Ωに仕上がっているということになります。同様に33Ωが推奨されているUSBドライバーは出力インピーダンスが12Ωということになります。 きっとG1CのUSBドライバーは出力インピーダンスがジャスト45Ωに仕上がっているので、外付け抵抗が不要なんだと思います。
アイパターンを見ながら出力抵抗を調整すればバッチリな信号品質になるかと思いますけれども、USBのコンプライアンステストしないなら、抵抗値が±10Ωくらいずれてても全然OKです。
もちろん、Yamamotoさんのおっしゃるとおりアートワークで差動90Ωにするのが大前提ですけれども。
Kirinさん
あれですね・・・アレ?
私は工作したくてUSBマイコンを探しているのですが(気持ちの悪い)PICで行くか(気持ちよくなくはない)RL78で行くか悩んでいる最中です。個人的興味で調べたところこのマイコンのデータシート通りならR1,R2に相当する抵抗は内蔵されていて無くて大丈夫だと思います。出力インピーダンスZDRV=28〜44Ωとのこと(フルスピードのドライバだけみたい)。あとは開発環境なんだけどGCCのRL78クロスコンパイラが作成できたら(MACで作業したい)RL78で行こうかなと考えています(素直にAVRにすれば幸せなのかもしれない)。
それでも小心者なので私ならチップ抵抗のパターンを引いておきます。
いらないなら0Ωを実装しとけばいいって事ですので。
そうそう、それっ!(笑)
USB規格的にはスピード毎にドライバーの出力インピーダンスの規定がありますけれども、 ロースピードは規定されていないのでG1CのUMには、あえてロースピードドライバーのZDRVを記載していないみたいですね。
抵抗パッドがあれば、あとあと何かと便利ですよね^^