Intel Quark D2000 Zephyr BMC150

Intel Quark Microcontroller Dev Kit D2000には、ボード上にBOSCH社製6軸センサ(3軸加速度、3軸磁気)BMC150を搭載しています。
https://www.bosch-sensortec.com/bst/products/all_products/bmc150
BMC150は、I2CとSPIで接続できますが、D2000とは、I2Cで接続されています。SPピンのレベルでインターフェースの毛帝をします。Kitは、SPピンがプルアップされているのでI2Cとなります。
今回は、ZephyrのI2C APIを使って接続します。
I2Cのアドレスもピン設定で2種類選択できます。SDOピンをGNDレベルにすると加速度センサのアドレスが0x10、磁気センサのアドレスが0x12となります。SDOピンをVDDレベルにすると加速度センサのアドレスが0x11、磁気センサのアドレスが0x13となります。この設定は、J1ジャンパーで切り替えられます。J1をオープンにするとSDOがGNDにプルダウンされ、加速度センサのアドレスが0x10、磁気センサのアドレスが0x12となります。J1をクローズするとSDOがVDDにつながり、加速度センサのアドレスが0x11、磁気センサのアドレスが0x13となります。
今回は、J1はオープンのまま使用します。
I2Cの使用方法は、Zephyrのサンプルにあるi2c_lsm9ds0を利用しました。APIのリファレンスは以下にあります。
http://docs.zephyrproject.org/api/io_interfaces.html#i2c-interface
Zhephyrのサンプルの中にBMC150はありませんが、QMSI側にBMC150のサンプルAccelerometerがあります。これも参考にしました。
I2Cの初期化はそのまま使用できます。
cfg.raw = 0;
cfg.bits.use_10_bit_addr = 0;
cfg.bits.speed = I2C_SPEED_STANDARD;
cfg.bits.is_master_device = 1;

dev = device_get_binding(“I2C_0”);
if (!dev) {
printk(“I2C0: Device not found.\n”);
return;
}

if (i2c_configure(dev, cfg.raw) != 0) {
printk(“Error on i2c_configure()\n”);
return;
}

I2Cの読み書きは、以下の関数で行えます。
i2c_write(dev, &data, sizeof(data), ADDR) ;
i2c_read(dev, &data, sizeof(data), ADDR) ;
次にBMC150から温度の取得を行ってみたいと思います。

Intel Quark D2000 Zephyr UART BY INTERRUPT

UART_Aが使用できるようになりましたが、割り込みを使用した方が、効率が良いので割り込みを使ってみます。

プロジェクトのprj.confファイルで周辺機器の設定を行います。

CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_UART_QMSI_0=y
CONFIG_UART_QMSI_0_HW_FC=n
CONFIG_UART_QMSI_0_BAUDRATE=57600

割り込みの設定CONFIG_UART_INTERRUPT_DRIVENをyにします。その他は、前と一緒です。

uart0_init(void)初期化関数で
uart_irq_callback_set(uart0_dev, uart0_isr);
割り込み関数uart0_isrを登録します。
uart_irq_rx_enable(uart0_dev);
次に受信割り込みを有効にします。

受信が入るとこの関数が呼ばれます。
static void uart0_isr(struct device *x);

int len = uart_fifo_read(uart0_dev, rx_buf, BUF_MAXSIZE);
受信データをバッファに読み出します。最後に受信文字を送信します。ループバックのサンプルになっています。

以下にサンプルがあります。
https://github.com/jendo1969/d2000/tree/master/UARTint

Intel Quark D2000 Zephyr UART

UART_Aを使用しようと思いましたが、
Zephyrには、サンプルがありません。
探したところ、以下のURLを参考にしました。
https://lists.linuxfoundation.org/pipermail/zephyr-users/2017-January/000537.html

プロジェクトのprj.confファイルで使用する周辺機器の有効無効が設定できます。

CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=n
CONFIG_UART_QMSI_0=y
CONFIG_UART_QMSI_0_HW_FC=n
CONFIG_UART_QMSI_0_BAUDRATE=57600

ここでは、シリアルを使用し、割り込みは使用しない設定です。
UART_Aを使用する。
ハードウェアのハンドシェイクは行わない。
通信速度は、57600bpsとするとなっています。

通信確認にはFTDIのUSB・シリアル変換ケーブル(3.3V)を使用しました。
http://akizukidenshi.com/catalog/g/gM-05840/
これでArduinoのシールドでUARTが使用できるようになりました。サンプルは、ただ、aを送るだけのコードです。

サンプルは以下にあります。
https://github.com/jendo1969/d2000/tree/master/UART

Intel Quark D2000 Zephyr Blinky

Zephyr OSでサンプルを動かします。ISSMを起動し、
Project for Micro controllersで新しいプロジェクトを作ります。
Select a developer boardで
Intel Quark D2000 Developer Boardを選択します。
次にSelect firmwareで
Zephyr Project「[1.7.0]
を選択します。

Select a platform configuration画面はそのまま進めます。

次にサンプルを選択します。
ここでBasicのBlinkyを選択します。
BuildしてデバッグするとD2000のボード上のLEDが1秒間隔で点滅します。

周辺機器は、ライブラリ化されてるので初期化など関数化され
非常に短いコードになっています。
このサンプルでは、OSに関係する関数は、k_sleep()くらいです。

Intel Quark D2000 Getting Started

開発環境のIntel® System Studio for Microcontrollers(ISSM)を起動するとGetting Startedが表示されます。
https://software.intel.com/en-us/node/651119
https://software.intel.com/en-us/node/651138
1.Update ROM Image on your device
2.Create a project with the “LED_ Blink” sample project file
3.Build and deploy your project
4. Begin the Accelerometer Tutorial
まずは、1から3番を行い、LEDの点滅を確認しました。


まずROMのアップデートをします。

完了するとメッセージが表示されます。

LED_Blinkを読み込みます。あとは、ビルドとデバッグができます。通常のECLIPSEの使い方と同じなので特に戸惑うことはありません。

目標は、Zephyr OSを使用するのでQMSIは、ここまでとします。

© 2014 Spineedge Corporation.