2017年1月
Cosmo-Zのデータ形式
2017.01.25
Cosmo-Zで保存した計測データがファイル形式なのか、と問い合わせをいただくことがあります。
パケットにしてヘッダを付けて、それを複数個束ねてファイルに保存しているのですが、しっかりと文章に書いて、Webサイトに掲載しました。
こちらをご覧ください。
http://www.tokudenkairo.co.jp/cosmoz/fileformat.html
Windowsで動くデコードソフトもダウンロードできます。
Cosmo-ZのVivadoデザイン
2017.01.24
昨年の9月27日にCosmo-ZのデザインをVivado 2016.2用に作ったものがあったのですが、Vivado 2016.3に移行しようと思っていたら「IPを全部作り直さなければならない」という噂を聞いて躊躇していました。
そしたらあっという間にVivado 2016.4が出て、完全に取り残されてしまいました。
今週、優秀なアルバイトさんが、Cosmo-ZのVivadoデザインを2016.4に対応してくれました。どうやら、メモリとかクロックジェネレータに至るまで、IPは全部作り直したそうです。
さて、2016.2から2016.4に移行した際、リソース使用量が変わっていないかどうか気になります。
下の図は、Vivado2016.2で合成したときのものです。
出ているCritical Warningは、CoreGen FIFOのバグによるものです。(クロックがないというやつ)
![]()
次の図は、Vivado 2016.4によるものです。
Critical Warningは同じくCoreGen FIFOが出しています。
Cosmo-Z Type Cの出荷開始
2017.01.20
Cosmo-Z Type Cの出荷を開始しました。
Cosmo-Z Type Cの特長としては、
- RTC(リアルタイムクロック)搭載
- GPS用コネクタを増設
- メザニン拡張コネクタへの配線が3本増えている
- 電源を強化
- 12Vの電源を加えても大丈夫(なはず。テストはしていない)
- リセットスイッチを少し下にずらし、ネジ穴と干渉しないようにした
などです。
この新しいCosmo-Zが、皆様の実験やご研究の役に立つことを願っています。
ZYNQに接続したRTCが動いた!
2017.01.14
Cosmo-Zの新バージョンはRTCを搭載しています。
ZYNQからI2C経由でRTC(Microchip MCP79411)を操作することができました。その手順を示します。
まず、EDK(最近の人はVivadoですね)で、PSの設定を開き、I2Cの0番を有効にします。
そして、Export Hardware SDKを行い、fsblを再生成し、boot.binを再生成します。
新しいboot.binで起動したら何かキーを押してブートを止め、u-bootのコンソールに入ります。
u-bootにはi2cという便利なコマンドがあります。i2c probeと打つと、I2Cのバスに様々なアドレス(1,3,5,7,9,11,13…)を順番に出力して、どんなデバイスがつながっているかを調べてくれます。
上の画面はi2c probeを行ったときの表示で、57と6Fのデバイスが見つかっています。57がMCP79411内のEEPROMで、6FがMCP79411内のRTCとSRAMです。
i2cコマンドを通じたメモリの読み書きは、以下のコマンドで行えます。
メモリリード:i2c md デバイスアドレス サブアドレス 長さ
メモリライト:i2c mw デバイスアドレス サブアドレス 値
これでひととおりMCP79411の動作が確かめられたら、Linuxで使えるようにしたいのですが、そのためにはデバイスツリーというのを書かなければなりません。
デバイスツリーの正しい書き方はよくわかりませんが、
ps7-i2c@e0004000 {
compatible = "cdns,i2c-r1p10";
status = "okay";
clocks = <0x2 0x26>;
interrupt-parent = <0x3>;
interrupts = <0x0 0x19 0x4>;
reg = <0xe0004000 0x1000>;
#address-cells = <0x1>;
#size-cells = <0x0>;
clock-frequency = <0x9c40>;
という記述を追加しました。clocksなどの設定の意味はよくわかりませんが、これでうまくいきました。clock-frequencyは40kHzにしています。ZYNQではI2C_0のレジスタは0xe0004000にあるようで、これはデザインによらず固定です。
これでLinuxを起動すると、(dmesgの部分に)
cdns-i2c e0004000.ps7-i2c: 40 kHz mmio e0004000 irq 57
と表示されます。
そして、/dev/i2c-0というデバイスが出来ています。

i2c-0というのは、ZYNQのI2C_0に相当します。これは汎用のI2Cデバイスのマスタなので、ユーザがプログラムを組めば自由に操作できます。
このデバイスを使うには、まず
#include#include
をincludeし、open("/dev/i2c-0",O_RDWR)でオープンします。
int i2c = open("/dev/i2c-0",O_RDWR);
if(i2c < 0) {
printf("I2C Open error");
return -1;
}
デバイスのスレーブアドレスを指定するには、
ioctl(i2c, I2C_SLAVE, 0x6f);
とします。そうしたら、read()やwrite()を使って読み書きします。
char val = 0x00; char data[32]; write(i2c, &val, 1); read(i2c, &data, 32);
とすれば、サブアドレス0から、32バイトのデータが読み出されます。
実際に作ったプログラムを載せます。
#include#include #include int main() { int i2c = open("/dev/i2c-0",O_RDWR); if(i2c >= 0) { unsigned char dat[256]; unsigned char addr; ioctl(i2c, I2C_SLAVE, 0x6f); printf("RTC\n"); addr = 0x0; write(i2c, &addr, 1); read(i2c, &dat, 32); for(i=0;i<32;i++) { if((i & 15) == 0) printf("%04X ",i); printf("%02x ",dat[i]); if((i & 15) == 15) printf("\n"); } printf("\n"); printf("SRAM\n"); addr = 0x20; write(i2c, &addr, 1); read(i2c, &dat, 64); for(i=0;i<64;i++) { if((i & 15) == 0) printf("%04X ",i+0x20); printf("%02x ",dat[i]); if((i & 15) == 15) printf("\n"); } printf("\n"); printf("EEPROM\n"); addr = 0x00; ioctl(i2c, I2C_SLAVE, 0x57); write(i2c, &addr, 1); read(i2c, &dat, 128); for(i=0;i<128;i++) { if((i & 15) == 0) printf("%04X ",i); printf("%02x ",dat[i]); if((i & 15) == 15) printf("\n"); } printf("\n"); printf("Unique ID\n"); addr = 0xf0; ioctl(i2c, I2C_SLAVE, 0x57); write(i2c, &addr, 1); read(i2c, &dat, 8); for(i=0;i<8;i++) { if((i & 15) == 0) printf("%04X ",i); printf("%02x ",dat[i]); if((i & 15) == 15) printf("\n"); } printf("\n"); } else { printf("no i2c\n"); } return 0; }
これで実行すると、

これでMCP79411のすべてのレジスタが表示されています。
(最後のUnique IDの部分はMACアドレスに使われる部分なので、モザイクをかけています。)
ICの購入時点ではRTCは止まっています。RTCをスタートするには、アドレス0にbit7(STビット)に'1'を書き込みます。また、初期状態ではVBATの端子にバックアップ電源をつないでいても、電源OFFで消えてしまいます。VBATを使えるようにするには、アドレス3のbit3(VBATENビット)を'1'にします。
RTCの複数のバイトに書き込むには、
dat[0] = 0; // アドレス0から dat[1] = 0x80; // スタート 0秒 dat[2] = 0x18; // 18分 dat[3] = 0x15; // 15時 dat[4] = 0x08; // VBATEN 曜日は無視 dat[5] = 0x14; // 14日 dat[6] = 0x01; // 1月 dat[7] = 0x17; // 2017年 dat[8] = 0x80; write(i2c, &dat, 9); // 8バイト書き込み
のようにすればよいようです。
![]()
今回使っているのはMCP79411ですが、MCP79410とMCP79412でも同じようにできると思います。
本当は、デバイスドライバを作ってデバイスツリーに組み込むか、どこかからMPC7941x用のデバイスドライバを探してくれば、OS起動時に自動的に時刻をセットしたりもできるのだとは思いますが、ユーザモードアプリでいいんじゃないかという気になってきました。
Cosmo-Zの新バージョンが出来上がってきた
2017.01.13
Cosmo-Zの新しいバージョンの実装があがってきました。
今回は7台製造しました。
お客様によって、LEMOコネクタだったり、アナログフロントエンドの特性が異なっていたりするので、7台ともすべて異なる構成です。
今回の基板の改版点は、
- ZYNQからI2Cを出し、RTCを実装した
- RTCと一緒にMACアドレス用にIDを搭載
- 拡張コネクタに3本の汎用I/O信号を追加
- GPS用のコネクタを搭載
- 電源の強化と、12Vを入れても壊れないようにした
などです。
まず、第一の改良点ですが、基板裏のこの部分。
ここに、RTC用のIC(Microchip MCP79411)とバックアップ用の電気二重層コンデンサを実装しました。
バックアップといったらバッテリではないの?と思うかもしれませんが、バッテリが入っていると航空機に乗せるのが面倒になったりするので、輸出とかで困ることになるかもしれません。
そこで、バックアップは電気二重層コンデンサにしました。この大きさでも70mFあるので、27時間程度のバックアップはできるのではないかと思います。
さて、MCP79411というRTCのチップは、なかなか面白いICです。内部に1024bitのEEPROMと、64byteのSRAM、それから48bitのUnique IDを持っています。
Unique IDというのはMACアドレスに使えるIDのようで、調べてみると確かにMicrochip社のMac IDのベンダコードになっていました。これでCosmo-Zも正式なMACアドレスが与えられるようになりました。
![]()
また、基板表面の拡張コネクタの部分にシルクを入れ、何番のポートかわかるようにしたのと、拡張コネクタの上のほうにGPS用の6ピンのコネクタを設けました。

1mmピッチのピンヘッダ端子に、「GND、1.8V、TX、RX、1PPS、3.3V」の順に端子が並んでいます。ここにGPSモジュールをつなぐのですが、ZYNQのI/O電圧を1.8Vにしているので、1.8V対応のGPSでなければなりません。候補として、LYNX TECHNOLOGIES社の「RXM-GPS-F4-T」が挙げれます。Digikeyでモジュールを購入して、試してみようと思います。
また、右側にある電源部はTIのTPS54620RGYRというICに置き換えました。いままではTPS62065を使っていたのですが、TPS62065は2Aまでしか出せないのと、12Vを加えたときに壊れるという問題がありました。
思い起こせば、ET2015の当日。先に会場に着いたアルバイトさんがCosmo-Zをセットアップしてくれたのですが、ちゃんと説明しておかなかったため、12VのACアダプタをつないでしまいました。このときの教訓から、12V耐性のない機械は危険だということを思い知りました。
また、最近、Cosmo-ZのFPGAが進化した結果、消費電流が増えて電源が足りなくなって落ちてしまうということが発生していました。そのため、4Aの電源モジュールを別途搭載して出荷していたのですが、TPS54620RGYRと表面実装インダクタ「CDRH8D28NP-3R3NC」のおかげでオンボードで4A電源を乗せることができました。
そういうわけで、この電源回路にはかなり思い入れがあります。
これから動作テストをして、出荷開始です。













