秋月などで買える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水晶振動子が、大きすぎる(;^ω^)
こんなの も売ってるみたいですよ。
情報、有難うございます。一昨日、行ったときに、見つけられなかった模様です。でも、更に10pFのコンデンサ2個付けるスペースが捻出するのが難しそう。今、空中配線でも良いかと挫折しようかと
USBコネクタから、RL78G1Cまで、10cm弱あるので、PBC側のスペース捻出よりも、USBの2芯シールドケーブルで内部接続するのが、無難か。
ブレッドボードでUSBの実験するのが、駄目そうな気がしてきました。
現状は、E20付けて、3.3V電源つなぐと、正常に、HIDキーボードとして認識されるが、5V電源に変えると、USBケーブルを短くしないと、正常に認識されないことが、判明。E20を繋げずに、直接、電源をつなげると、一瞬、PCのデバイスマネージャが再描画されて、不明なUSBデバイスになるか、一覧から消失したままという状況。USBから電源をとると、PCのデバイスマネージャが再描画も起きずにだんまり。アナログ的な条件なのか、そもそも何かがずれているのか、E20付けて、3.3V電源つないだ状態が、なぜ安定して動作しているのかが不思議。あと、D+とD-のそれぞれに直列に、51Ω(有り合わせなので、45Ωなかった)を入れると、E20付状態だけど、5V電源でも、PCに正常に認識される状態になった。やはり、E20の有無で何が異なるのか気になる。
動きませんでしたか、、、 ちなみにC2h番地のオプションバイトはF0h(48MHz)ですよね?
あと追加で、 UCKSEL=0x0001;//USBクロックに高速オンチップ・オシレータ・クロック(fHOCO)を選択する を設定する必要がありそうです。
UCKSEL=0x0001;//USBクロックに高速オンチップ・オシレータ・クロック(fHOCO)を選択する
PS と思ったら、UCKSELはL1Cにしかないレジスタみたいです。同じUSBじゃないのかなぁ、謎だぁ。。。。
*((volatile unsigned short *)0xf06C4)=0x0001; //UCKSELとかやったらダメかな。。
*((volatile unsigned short *)0xf06C4)=0x0001;
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Ω前後になりますし)