ラベル KL25Z の投稿を表示しています。 すべての投稿を表示
ラベル KL25Z の投稿を表示しています。 すべての投稿を表示

2014年4月27日日曜日

FRDM-KL25Z・FRDM-KL46Zをmbedインターフェースとして使う(更新)


ターゲットへの配線間違いを防ぐためにSWDとリセットのピンアサインを共通化してみました。
DAP_config.h

・uv4等でCMSIS-DAPが動かない時はSWDIO,SWCLKへの配線を確認。
・CMSIS-DAPは動くがドラッグアンドドロップ終了しない(MSC書込みLEDが点滅しない)時はリセットへの配線を確認。
・ドラッグアンドドロップが終了するがfail.txtが出来る時はSWDIO,SWCLKへの配線を確認。
・MBEDドライブが見えない時はUSB接続、ファームウェアの書込みを確認。
・ドラッグアンドドロップは出来るがシリアルポートが認識しない時はmbedWinSerial_16466.exeをインストール。

FRDM-KL25Z・FRDM-KL46Zをmbedインターフェースとして使う
http://mbed.org/users/va009039/notebook/frdm-kl25z-mbed-if/

(2014/4/27)
---

2014年2月27日木曜日

FRDM-KL46Z用USBホストライブラリの試作(2)

・ソフトウェアリトライに変更。
 KL46ZのUSBコントローラにリトライを任せずに、ソフトウェア側でステータスを見てトークン転送レベルで再送処理をするように修正しました。
 今までトークン転送でバスエラーになってしまったUSBフラッシュメモリーが読み取れるようになった。
 少なくとも以前に比べて安定しているので、使えるUSBデバイスが多くなります。

・USBハブに対応。
 接続数の制限はほぼありません。

・アイソクロナス転送を追加。
 WEBカメラが使えるようになりました。
 KL46Z-USBHostC270_example

・なるべく公式USBホスト互換のインターフェースに変更。
 多くの対応ソフトが僅かな修正で動くようになりました。
 ただし、RTOSを使っていないのでノンブロックでコールバックが必要な転送では USBHost::poll()を呼び続けます。
 使用例:KL46Z-USBHostMouse_HelloWorld

その他の細かい修正、改造はコミットメッセージを参考にして下さい。
https://bitbucket.org/va009039/kl46z_usbhost/commits/all

Simple USBHost library for FRDM-KL46Z
http://mbed.org/users/va009039/code/KL46Z-USBHost/

***

FRDM-KL25Zも同じUSBコントローラなので、USBコネクタに電源を供給できればUSBホスト機能が使えるようになります。



(2014/2/23)
---

2013年9月17日火曜日

FRDM-KL25Zでドラッグ・アンド・ドロップ



以前からFRDM-KL25Zのドラッグ・アンド・ドロップによる書き込みの仕組みが知りたかったので
USBデバイスのUSBMSDクラスで実装してみました。

USBMSDクラスでROMディスクを作成。パソコンからはラベルMBED2.0の64KBドライブとして認識します。
パソコンからドラッグ・アンド・ドロップするとdisk_write()にディレクトリ情報、FAT、ファイルデータが
流れ込むので、ブロック番号(セクター番号)を見て、ファイルデータだけを取り出す。
ファイルデータをSWDでターゲットに書き込む。

現在の問題点
・ディレクトリ情報からファイルのデータのサイズを取得していないので、書込み終了の判断が出来ない。
・mbed内蔵ストレージからの書込み方法に比べて、SWDプロトコルのエラーが多いような気がする。USBからのノイズの影響?
・FRDM-KL25Zのようにファイルは消えないし、ウィルススキャンエラーにもならない。仕組みが微妙に違う?

USBMSD_LPC_HelloWorld

(2013/9/17)
---

2013年4月17日水曜日

CMSIS-DAP debuggerの修正メモ。

AN11321: Porting the CMSIS-DAP debugger to the Cortex-M0 platform
をKL25Zで動くように修正した時のメモ。

SWDプロトコルをソフトウェアで実装している。
クロックの周期を作るのにCPUサイクル数を数えています。

SW_DP.cpp

void SWJ_Sequence (uint32_t count, uint8_t *data)
uint8_t SWD_Transfer(uint32_t request, uint32_t *data)

ループに必要なCPUサイクル数は数えていないようです。
Max Clock の設定より実際には低めのクロックで動いていると思う。

DAP_config.h

CPU_CLOCK 48000000
CPUのクロック 48MHz

IO_PORT_WRITE_CYCLES 1
I/Oポートに書きこむ時に必要なCPUサイクル数 は 2、Cortex-M0+は 1

DigitalOut を使った時のサイクル数がわからなかったし、他のmbedでも動くように
ワーストケースとして 1 にしている。

DAP.h

DELAY_SLOW_CYCLES 3
PIN_DELAY_SLOW(uint32_t delay) 関数でdelayあたりのCPUサイクル数

DELAY_FAST_CYCLES 0
PIN_DELAY_FAST(void)関数のCPUサイクル数、最適化されるので 0

DAP.cpp

static uint32_t DAP_SWJ_Clock(uint8_t *request, uint8_t *response)
SWDの Max Clock 最大クロックの設定

#define MAX_SWJ_CLOCK(delay_cycles) (CPU_CLOCK/2 / (IO_PORT_WRITE_CYCLES + delay_cycles))
MAX_SWJ_CLOCK(DELAY_FAST_CYCLES) は (48M/2/(1+0)) 24MHz になります。

最大クロックが MAX_SWJ_CLOCK(DELAY_FAST_CYCLES) 24MHz 以上の時は、
クロック作成で PIN_DELAY_FAST()関数を使います。ウェイトを作成しない。

SWD Max Clock で設定した時の delay, cycle の変化。
Max Clockdelaycycle
10MHz13
1MHz824
100kHz80240
10kHz8002400
5kHz16004800
Max Clock 5kHz に設定するとFlash書き込みはかなり遅くなります。
また、バッファリングしていないUSBHIDの場合はユーザインターフェースの反応が鈍くなります。
可能な限り Max Clock は多く設定するのがお勧めです。

(2013/4/17)

CPU_CLOCK CPUのクロックは uint32_t SystemCoreClock にした方がいいのかもしれない。
system_LPC17xx.c system_LPC11Uxx.c system_MKL25Z4.c で設定されている。

(2013/4/18追加)
---

2013年4月15日月曜日

CMSIS-DAPでLPC1114FN28に接続する





KL25ZのCMSIS-DAPがSWD出来るようになったので、LPC1114FN28に接続してみました。
LPC1114FN28のサンプルプログラムが見つからなかったので、
LPC1114の日本語ドキュメントを参考にして main.c を次のように書いてみました。
LEDチカチカです。
Debugモードに入って View - System Viewer - GPIO - GPIO0 でレジスタを直接変更出来て便利。
Peripherals でも同じように変更出来ます。

#include "LPC11xx.h"

void SystemInit()
{
}

void wait()
{
    __IO int i = 200000;
    while(i-- > 0)
            ;
}

int main()
{
    LPC_GPIO0->DIR = 1<<7; // PIO0_7 output
    while(1) {
        LPC_GPIO0->DATA ^= 1<<7;
        wait();
     }
}


参考:
mbedをデバッグアダプタにしてみた(mbed-Link)

(2013/4/15)
---

2013年4月12日金曜日

KL25ZとWIZ820ioでcosmへ送信する


WIZ820ioのインターフェースをEthetnetInterfaceのsocket互換に作り直して、cosmへのデータを送信しています。
cosmのベータ版ではあるが、httpプロトコルではなくてtcpプロトコルにJSON形式を載せています。
更に、DNSやDHCPを使わずにIPアドレス固定で接続することも可能です。

下のグラフは一週間の大気圧センサの値です。
あまり精度はよくないが先週末からの低気圧が通過したのがわかります。


参考:
Socket Server
https://cosm.com/docs/beta/socket_server/
IP Addresses
https://cosm.com/docs/v2/ip_addresses.html


#include "mbed.h"
#include "WIZ820ioInterface.h"
#include "MPL115A1.h"

SPI spi(PTD2,PTD3,PTD1); // SPI_0
MPL115A1 bar(spi, PTA13); // spi, cs
WIZ820ioInterface eth(&spi,PTD0,PTD5); // spi, cs, reset

#define qq(...)  #__VA_ARGS__
const char* format = qq(
{
  "method" : "put",
  "resource" : "/feeds/12345678",
  "headers" : {"X-ApiKey":"APIKEYAPIKEYAPIKEYAPIKEYAPIKEYAPIKEYAPIKEYAPIKEY"},
  "body" : {
    "datastreams" : [
      {"id":"6", "current_value":"%.2f"},
      {"id":"7", "current_value":"%.2f"}  
    ]
  }
}
);

void cosm()
{
    char buf[512];
    snprintf(buf, sizeof(buf), format, bar.readPressure() * 10, bar.readTemperature());
    TCPSocketConnection sock;
    sock.set_blocking(false);
    int ret = sock.connect("173.203.98.29", 8081); // cosm tcp server
    if (ret < 0) {
        return;
    }
    sock.send(buf, strlen(buf));
}

int main()
{
    eth.init();
    eth.connect();
    while(1) {
        cosm();
        wait_ms(30*1000);
    }   
}

(2013/4/12)
---

KL25ZのUSBインターフェースクラス

KL25Zをmbed化した時のUSBのインターフェースクラスを調べてみた。

VID: 0x0d28
PID: 0x0204
インターフェースクラスサブクラスプロトコルエンドポイント
08(MSC)6(SCSI)80(bulk-only)82,02
12(CDC)2183
210(CDC-Data)0084,04
33(HID)0081,01
USBHostライブラリで最後のHIDのエンドポイントを開こうとしたら失敗するので調べみたら、
インターフェースは3個までしか登録できない。
newEndpoint()は出来るけど、addEndpoint()で登録失敗, getEndpoint()でNULLを返す。
ED,TDを使い果たしてしまう。
とりあえず、USBHostConf.h の #define MAX_INTF 4 に変更しておく。

pyOCDはPID,VIDでHIDクラスからDAPを探しているようだが、Keil uVision4はどうやって探しているのかまだわからない。

(2013/4/12)
---

2013年4月1日月曜日

シリアルSRAM 23LC1024 の接続テスト


1個128Kバイトの容量があります。SPIで接続します。

次のプログラムで動作テストしてみたところKL25Zで、360KBytes/secくらいの速度がでました。

SPIRAM_23LC1024
http://mbed.org/users/okini3939/code/SPIRAM_23LC1024/

SPI(MHz)write(KBytes/sec) read(KBytes/sec)
16 364.8 356.4
12 364.8 356.4
10 364.8 356.4
9 333.2 326.2
8 333.2 326.2
7 294.9 289.3
6 294.9 289.3
5 264.5 260.0
4 239.7 236.0
3 201.9 199.3
2 156.7 155.1
1 92.5 92.03

データシート
http://ww1.microchip.com/downloads/en/DeviceDoc/25142A.pdf
Recommended Usage of Microchip SPI Serial SRAM Devices

(2013/4/1)
---

2013年3月31日日曜日

気圧センサMPL115A1を使う


KL25Zのピン配置図には載ってないが、SPIライブラリにはコードのあるSPI_1のピンで使ってみました。
ピン配置図:http://mbed.org/handbook/mbed-FRDM-KL25Z
mbed / libraries / mbed / vendor / Freescale / capi / spi_api.c
SPISPI_0SPI_0SPI_1
mosi PTD2 PTC6 PTE1
miso PTD3 PTC7 PTE3
sclk PTD1 PTC5 PTE2
ssel PTD0 PTC4 PTE4

mbed用のMPL115A1ライブラリは既にありました。
http://mbed.org/users/mk/code/MPL115A1/
MPL115A1のデータシート
http://www.freescale.com/files/sensors/doc/data_sheet/MPL115A1.pdf
http://www.freescale.com/files/sensors/doc/app_note/AN3785.pdf

レジスタ値だけを読み出すテストプログラム。

#include "mbed.h"
#include "mbed_debug.h"

#if defined(TARGET_KL25Z)
SPI spi(PTE1,PTE3,PTE2); // SPI_1
DigitalOut cs(PTE4);
#endif

int main()
{
    cs = 1;
    
    debug(" Read Coefficient(a0,b1,b2,c12)\n");
    cs = 0;
    for(int addr = 0x04; addr <= 0x0b; addr++) {
        spi.write((addr<<1)|0x80);
        uint8_t data = spi.write(0x00);
        debug("%02x: %02x\n", addr, data);
    }
    spi.write(0x00);
    cs = 1;

    while(1) {
        debug("Start Conversion\n");
        cs = 0;
        spi.write(0x12<<1);
        spi.write(0x00);
        cs = 1;
        wait_ms(3); //3ms delay
        debug("Read Results(Padc,Tadc)\n");
        cs = 0;
        for(int addr = 0x00; addr <= 0x03; addr++) {
            spi.write((addr<<1)|0x80);
            uint8_t data = spi.write(0x00);
            debug("%02x: %02x\n", addr, data);
        }
        spi.write(0x00);
        cs = 1;

        wait_ms(5*1000);
    }
}


(2013/3/31)
---

2013年3月27日水曜日

mbedライブラリI2CでAquesTalk pico LSIを使う



mbedライブラリのI2C通信で使う時のアドレス
#define AQTK_I2C_ADDR (0x2E<<1)
mbedとArduinoではI2Cのアドレスの扱い方が違うのを今まで知らなかった。
USARTでは喋るのに、I2Cでは反応しなくて結構手間がかかってしまった。

参考
[Arduino] AquesTalk pico LSI を I2C で制御する
I2Cバス仕様書

(2013/3/27)
---

2013年3月24日日曜日

FRDM-KL25ZとWIZ820ioでインターネット接続


1年ほど前に作ったmbedのEthernetNetIf互換のWIZ820ioのライブラリがあったのでKL25ZでもSPI接続して動かしてみました。

KL25Z用に再コンパイルするだけで簡単かと思ったのですが、EthernetNetIfのNetServiesに依存していたために、
EthernetNetIfライブラリが存在しなくて、ソースコードファイルNetServiesSourceを探して取り込みました。

WIZ820ioは動作中は最大150mAくらい流れるのでKL25ZのP3V3からの供給では足りなくて、
SPI通信は出来るがLinkUpにならない。LANコネクタのLEDが点灯しません。mbedを3.3V電源だけに使いました。

WIZ820io(W8200)は同時に8個のソケット開けるので1つをDNS用にUDPソケットで使って、残り7個で同時接続が出来ます。HTTPクライアントとHTTPサーバーを同時に動かすことも出来ます。

WIZ820ioインターフェースライブラリ
http://mbed.org/users/va009039/code/WIZ820ioNetIf/

(2013/3/24)
WIZ820ioとFRDM-KL25Zの結線図
nRESET J2P5 --- PTD5 reset
nSS      J1P5 --- PTD0 cs
MOSI    J1P3 --- PTD2 mosi
MISO    J2P6 --- PTD3 miso
SCLK    J1P4 --- PTD1 sclk
GND     J2P1 --- GND
3V3D   J2P3 --- 外部電源3.3V
PWDN  J2P4 --- GND
(2013/3/26追加)

参考資料
NetServices Stack source
http://mbed.org/users/donatien/code/NetServicesSource/

(2013/3/27追加)
---