GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
GR-SAKURAを使ってGR-KURUMIにbinファイルを書き込もうと試したのですが、うまく行きませんでした。
接続は、写真のようにSCI_SCI0P2xを使って書こうと思って、TxDとRxDをクロスさせる中間基板を作りました。また、GNDと3.3Vは2枚目の写真のように配線しています。
CTSは未接続です(^^;。
これで、下記のようなプログラムを書きました。
#include <rxduino.h> void setup() { pinMode(PIN_LED0,OUTPUT); pinMode(PIN_LED1,OUTPUT); pinMode(PIN_LED2,OUTPUT); pinMode(PIN_LED3,OUTPUT); //基板の青ボタンを有効にします pinMode(PIN_SW, INPUT); Serial.begin(115200); Serial.setDefault(); //現在のシリアルポートを標準出力とするprintfでも出力する setvbuf(stdout,NULL,_IONBF,0); sci_convert_crlf(CRLF_NONE,CRLF_NONE); //バイナリを通せるようにする Serial1.begin(115200, SCI_SCI0P2x); //KURUMI接続ポート sci_convert_crlf_ex(Serial1.get_handle(), CRLF_NONE, CRLF_NONE); //バイナリを通せるようにする // IO2番 出力ポート定義 pinMode( PIN_P22, OUTPUT); digitalWrite( PIN_P22, LOW); //delay(100); //digitalWrite( PIN_P22, HIGH); //何か受信があるまで待つ while(!Serial.available()) { //基板の青ボタンが押されたらKURUMIをリセットする if( digitalRead(PIN_SW)==LOW ){ digitalWrite( PIN_P22, HIGH); while(true); } } //LED0を点灯させる digitalWrite( PIN_LED0, HIGH ); //KURUMIをリセット digitalWrite( PIN_P22, HIGH); delay(10); digitalWrite( PIN_P22, LOW); delay(10); } void loop() { while(Serial.available()) //何か受信があった { Serial1.write( (unsigned char)Serial.read() ); } while(Serial1.available()) //何か受信があった { Serial.write( (unsigned char)Serial1.read() ); } //基板の青ボタンが押されたらKURUMIをリセットする if( digitalRead(PIN_SW)==LOW ){ digitalWrite( PIN_P22, HIGH); while(true); } }
KURUMIを挿して、このプログラムを動かして、PCからKurumiWriter_Win.exeでがじぇっとるねさすのUSBポートにKURUMIのbinファイルを書き出しても、しばらくするとKurumiWriter_Win.exeがエラーを出します。
CTSの制御はやっぱりいるのでしょうか(^^;。DTRはLOWにしっぱなしでいいのでしょうか。
何も考えないで、垂れ流せばいいのかなと思ったら、そうではないようでした。
もし、プロトコルなどご存知の方がいらっしゃれば、後を次いでください。私はここで一旦保留にします。
面白い試みですね。Kurumi WriterはFTDIのEEPROMにアクセスするため、そこのキャンセル処理が不明ですが、少なくともモード引き込みは必要になります。CTS->TOOL0, DTR->RESETに配線されており、以下のドキュメントにプロトコルが掲載されています。
documentation.renesas.com/.../r01an0815jj0100_rl78.pdf
GR-SAKURA の初回のプロデューサミーティングの際に公開された『GR RL78版ボード プログラム作成~マイコン書き込み』の資料では CTS は使用されず、拙作の『Yet Another~』のソースを確認しましたが CTS の制御はなんでかやってなかったにも関らず書き込みできているので←GR-KURUMI の基板上で、TXD を LOW に落とすことで TOOL0 が LOW になる仕組みになってたので取り消し CTS の制御は多分やらんでも大丈夫な気がします。
不安な要素としては、現在の GR-SAKURA のライブラリでは通信のタイミングによって USB の仮想 COM ポート以外でのシリアル通信でけっこう文字をこぼす不具合があるので、その点ですね。←試したら意外と大丈夫だった。
あ、あと書き込みプロトコルの資料によると プログラマ→RL78 のストップビット長が 2ビット ということになってるので、自前で SCI 制御やらんといけない気がします。
書き込みプログラムは Simple Writer を使ったほうが良い気がしますね。
て、あれ? GR-SAKURA でのシリアル通信では start1 data8 parity0 stop1 で通信してるとなんとなく信じてたけど合ってるのかな? どっかに明記されてるのだろうか?
いろいろな情報ありがとうございます。ストップビット長が2ですか。そこで先ずアウトですね。
GR-SAKURAのシリアル通信はボーレート以外の条件設定は持っていないのかな。 sta1 d8 non sto1でしか使ったことが無かったです。
また、時間ができたときに挑戦してみます。
ストップビット長等はシリアルモードレジスタ(SMR)の設定でできるので、度々再設定されたりするのでなければ、Serial1.begin(115200, SCI_SCI0P2x) の後にすれば行けそうな気がします。
PCのWriter側も相手がKURUMIだと思ってストップビット長2で送信してきているとすれば、USBの方もstop2で受ける必要がありますね。
スレが進んでますね、、
CTSは確かに書き込み時は使ってないです。すみません。E1用の配線ですね。
Yamamoto Minao(たろサ)様、
USB の仮想 COM ポートは、物理的なプロトコルはフリしてるだけじゃないでしょうか? 9600bps とかで繋いでもなんか速いし。
Okamiya Yuuki様、
CTS については、書き込みプロトコルのドキュメント上では TOOL0(CTS) への操作について説明があるので従うべきとは思います。
Fujitaさん、コメントありがとうございます。FTDIのときはTOOL0はTXOで擬似的に00送信でローに落として、通信を止めて、その間にRESETを解除してモード引き込みしていたと思います。とはいえSAKURAで書くときはIO制御+シリアルで行えばいいと思いますが、この辺はKurumi Writerからのコマンドに応じたものにしないといけなそうですね。ハックしてみようかなと考え中です。
sakuraがPCから00を受信したらモード引き込みをエミュレーションしてやればできそうですね。
あれ? CTS って制御できるの?←KURUMIの回路図見て納得しました。上手いことやってるのね。
マネして中間基板つくってみました。
GR-KURUMI 側テストプログラム
#include <RLduino78.h> #define LED_R 22 #define LED_G 23 #define LED_B 24 void setup() { Serial.begin(115200); Serial.println("START"); pinMode(LED_R, OUTPUT); pinMode(LED_G, OUTPUT); pinMode(LED_B, OUTPUT); digitalWrite(LED_R, HIGH); digitalWrite(LED_G, HIGH); digitalWrite(LED_B, HIGH); } void loop() { static int color = 0; if (Serial.available()) { char buf[100]; int c = Serial.read(); sprintf(buf, "%02x: '%c'", c, isprint(c) ? c : '-'); Serial.println(buf); color = (color % 7) + 1; digitalWrite(LED_R, color & 1 ? LOW : HIGH); digitalWrite(LED_G, color & 2 ? LOW : HIGH); digitalWrite(LED_B, color & 4 ? LOW : HIGH); } }
GR-SAKURA 側テストプログラム
#include <rxduino.h> void setup() { Serial.begin(115200); Serial1.begin(115200, SCI_SCI0P2x); pinMode(PIN_P22, OUTPUT); digitalWrite(PIN_P22, LOW); delay(1); digitalWrite(PIN_P22, HIGH); pinMode(PIN_SW, INPUT); } void loop() { if (Serial.available()) { Serial1.write(Serial.read()); } if (Serial1.available()) { Serial.write(Serial1.read()); } digitalWrite(PIN_P22, digitalRead(PIN_SW)); }
使い方
GR-KURUMI と GR-SAKURA を 中間基板で接続し、GR-SAKURA を USB ケーブルにて PC と接続し、PC で Tera Term を起動して GR-SAKURA の COM ポートを開く
・キーボードから入力した文字の文字コードが Tera Term の画面に表示され、文字を入力するたびに GR-KURUMI の LED の色が変化するか?
・GR-SAKURA の ボード上の青のタクトスイッチを押すと GR-KURUMI がリセットされるか(LED が消灯するか)?
以上の確認ができたら(多分)オッケー
なんか書き込みできたクサイので投稿
#include <rxduino.h> #include <iodefine_gcc63n.h> #define PIN_TXD 1 #define PIN_RESET 2 void setup() { // PC 接続ポート設定 Serial.begin(115200); sci_convert_crlf_ex(Serial.get_handle(), CRLF_NONE, CRLF_NONE); // バイナリを通せるようにする // TXD 出力ポート設定 pinMode(PIN_TXD, OUTPUT); digitalWrite(PIN_TXD, LOW); // RESET 出力ポート設定 pinMode(PIN_RESET, OUTPUT); digitalWrite(PIN_RESET, LOW); // モード引き込みの際に PC から 0x00 が送信されてくる筈なので待つ while (!Serial.available()) { ; } (void)Serial.read(); // ゴミなので捨て // フラッシュ・メモリ・プログラミング・モードへの引き込み const int tRT = 723; const int tTM = 16; const int tMB = 62; digitalWrite(PIN_RESET, HIGH); delayMicroseconds(tRT); digitalWrite(PIN_TXD, HIGH); delayMicroseconds(tTM); digitalWrite(PIN_TXD, LOW); delayMicroseconds(1000000L / 115200L * (1 + 8)); // KURUMI 接続ポート設定 Serial1.begin(115200, SCI_SCI0P2x); sci_convert_crlf_ex(Serial1.get_handle(), CRLF_NONE, CRLF_NONE); // バイナリを通せるようにする SCI0.SMR.BIT.STOP = 1; // ストップビット長を2にする delayMicroseconds(tMB); } void loop() { // PC から来たデータを KURUMI に送る while (Serial.available()) { Serial1.write(byte(Serial.read())); } // KURUMI から来たデータを PC に送る while (Serial1.available()) { Serial.write(byte(Serial1.read())); } }
SimpleWriter でも KurumiWriter でも書き込みできました。
更新:
#include <rxduino.h> #include <iodefine_gcc63n.h> #define PIN_TXD 1 #define PIN_RESET 2 void setup() { // SAKURA の青タクトスイッチを SAKURA のリセットに使用 pinMode(PIN_SW, INPUT); // PC 接続ポート設定 Serial.begin(115200); sci_convert_crlf_ex(Serial.get_handle(), CRLF_NONE, CRLF_NONE); // バイナリを通せるようにする // TXD 出力ポート設定 pinMode(PIN_TXD, OUTPUT); digitalWrite(PIN_TXD, LOW); // RESET 出力ポート設定 pinMode(PIN_RESET, OUTPUT); digitalWrite(PIN_RESET, LOW); // モード引き込みの際に PC から 0x00 が送信されてくる筈なので待つ while (!Serial.available() || Serial.read() != 0x00) { // 青タクトスイッチが押されたら SAKURA をリセット if (!digitalRead(PIN_SW)) { SYSTEM.SWRR = 0xa501; } } // フラッシュ・メモリ・プログラミング・モードへの引き込み const int tRT = 723; const int tTM = 16; const int tMB = 62; digitalWrite(PIN_RESET, HIGH); delayMicroseconds(tRT); digitalWrite(PIN_TXD, HIGH); delayMicroseconds(tTM); digitalWrite(PIN_TXD, LOW); delayMicroseconds((1 + 8) * 1000000 / 115200); delayMicroseconds(tMB); // KURUMI 接続ポート設定 Serial1.begin(115200, SCI_SCI0P2x); sci_convert_crlf_ex(Serial1.get_handle(), CRLF_NONE, CRLF_NONE); // バイナリを通せるようにする } void loop() { // PC から来たデータを KURUMI に送る if (Serial.available()) { Serial1.write(byte(Serial.read())); Serial1.flush(); delayMicroseconds(1 * 1000000 / 115200); } // KURUMI から来たデータを PC に送る if (Serial1.available()) { Serial.write(byte(Serial1.read())); } // 青タクトスイッチが押されたら SAKURA をリセット if (!digitalRead(PIN_SW)) { SYSTEM.SWRR = 0xa501; } }