8 years, 3 months ago.

mbed HRM1017のPortOutの使い方について(再記入)

PortOutでp0からp7をデータバスとして一気に変更しようとしていますが、アクセスを行うと他のポートが勝手に変更されてしまう現象で悩んでします。 使い方、誤り等ご指摘いただけますと幸いです。

以下のソースで動かしています。 内容としまして、

  • 1.DigitalOutでp19をHighに設定
  • 2.PortOutでp0からp7を一斉に0(ゼロ)設定
  • 3.DigitalOutでp19をHighに設定

各操作の後にはpc.printf()を行い3秒空けています。 この状態とp19出力をオシロで観測すると、2.のPortOutを実行した時に、p19がLowになってしまいます。

#include "mbed.h"
#include "BLEDevice.h"

Serial pc(USBTX, USBRX); // tx, rx for DEBUG
I2C i2c0(p22, p20);       // sda0, scl0

DigitalOut testout(p19);  // TEST out
DigitalOut led(p18);      // access LED
DigitalIn sw1(p16);       // next SW1
DigitalIn sw2(p17);       // next SW2

#define DBUS_MASK 0x000000FF
PortOut dbus(Port0, DBUS_MASK);  // data bus


///////////////////////////////////////////////////////////////////////////////
int main(void)
{
	testout = 1;          // H output p19
	pc.printf("p19 = H output.\r\n");
	wait(3.0);
	
	dbus = 0x00000000;    // Data Bus write 0x00
	pc.printf("data = 0x00 output.\r\n");
	wait(3.0);
	
	testout = 1;          // H output p19
	pc.printf("p19 = H output.\r\n");
	wait(3.0);
	
	for(;;){
		wait(0.5);
	}
}

Question relating to:

Switch Science is one of the open source hardware retailers in Japan. We are manufacturing our own products.

1 Answer

8 years, 3 months ago.

私もnRF51822(RedBearLab)で同じ症状発生を確認しました。
HRM1017特有の問題ではなく、nRF51822使用のNordicファミリー全体の問題です。
mbed-dev(従来はmbed-srcでしたが、今はmbedソースファイルがこちらで管理されている)を覗いてみると、すぐに問題がわかりました。
/mbed-dev/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/port_api.c
の中で、書き込み時にマスクパターンを利用せずに、引数をポート全体(32Bit)に書き込んでいる単純なミスです。

port_api.c

void port_write(port_t *obj, int value)
{
    *obj->reg_out = value;
}

修正は下記のようにすると良いでしょう(というより他のmbedのコードを拝借してきました)。

void port_write(port_t *obj, int value)
{
#if 0 // original
    *obj->reg_out = value;
#else // Other mbed's implementation
    *obj->reg_out = (*obj->reg_out & ~obj->mask) | (value & obj->mask);
#endif
}

急ぎで修正したいのであれば、
1) mbedライブラリーを削除
2) mbed-devのライブラリーインポート
3) 上記のファイル修正
で動きます(全ての状態を調べていないのでBugfixと呼べるか不明)。

Kenji Araiさん、ありがとうございます。仰る通り、マスクパターンが抜けているようですね。nRF51のみならず、他のプラットフォームでも同様のマスク忘れが見うけられるので、mbedチームに相談して修正に動きたいと思います。

posted by Yoshihiro TSUBOI 31 Jan 2016

Kenjiさん、早速のアドバイス&有用な情報をありがとうございます。動いたらここでまた報告させていただきます。

posted by yama ken 31 Jan 2016

port_write()の修正にて、動作確認ができました。ありがとうございます。

posted by yama ken 01 Feb 2016