最近、MMA7660のデバッグをしています。他の部分はすべて正常に動作しているのですが、割り込みレベルが最初はハイレベルから始まり、ポジション変更後にローレベルに下がり、その後ハイレベルに戻らなくなります。 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
以下が私のコードです: /* * mma7660.c- 3軸方向/モーション用のLinuxカーネルモジュール * 検出センサー * * 著作権 (C) 2009-2010 フリースケール・セミコンダクタ株式会社 * * このプログラムはフリーソフトウェアです。再配布および改変が可能です。 * GNU General Public Licenseの条件に従って、 * フリーソフトウェア財団; ライセンスのバージョン2、または * (オプション) それ以降のバージョン。 * * このプログラムは役に立つことを期待して配布されていますが、 *ただし、いかなる保証もなし。 * 商品性または特定目的への適合性。参照 * 詳細については GNU General Public License を参照してください。 * * GNU General Public Licenseのコピーを受け取っているはずです * このプログラムと一緒に。そうでない場合は、フリーソフトウェア * Foundation, Inc.、675 Mass Ave、Cambridge、MA 02139、米国。 / #include #include #include #include #include #include #include #include #include #include #include #include #include /* * 定義 / #1の場合 #define assert(式)\ if(!(式)) {\ printk("アサーションに失敗しました!")%s,% d、 %s,% s\n",\ __FILE__ 、 __LINE__ 、 __func__ 、#expr);\ } #それ以外 #define assert(expr) do{} while(0) #endif #define MMA7660_DRV_NAME "mma7660" #MMA7660_XOUT 0x00 を定義します #MMA7660_YOUT 0x01 を定義します #MMA7660_ZOUT 0x02 を定義します #MMA7660_TILT 0x03 を定義します #MMA7660_SRST 0x04 を定義します #MMA7660_SPCNT 0x05 を定義します #define MMA7660_INTSU 0x06 #MMA7660_MODE 0x07 を定義します #MMA7660_SR 0x08 を定義します #MMA7660_PDET 0x09 を定義します #MMA7660_PD 0x0A を定義します #define MK_MMA7660_SR(FILT、AWSR、AMSR)\ (FILT<<5 | AWSR<<3 | AMSR) #MK_MMA7660_MODE(IAH、IPP、SCPS、ASE、AWE、TON、MODE) を定義します\ (IAH<<7 | IPP<<6 | SCPS<<5 | ASE<<4 | AWE<<3 | TON<<2 | モード) #define MK_MMA7660_INTSU(SHINTX、SHINTY、SHINTZ、GINT、ASINT、PDINT、PLINT、FBINT)\ (SHINTX<<7 | SHINTY<<6 | SHINTZ<<5 | GINT<<4 | ASINT<<3 | PDINT<<2 | PLINT<<1 | FBINT) #MODE_CHANGE_DELAY_MS 100 を定義します ssize_t show_orientation(構造体デバイス*dev、構造体属性*attr、char *buf); ssize_t show_axis_force(構造体デバイス *dev、構造体属性 *attr、char *buf); ssize_t show_xyz_force(構造体デバイス*dev、構造体属性*attr、char *buf); 静的構造体デバイス *hwmon_dev; 静的 int test_test_mode = 0; 静的構造体 i2c_client *mma7660_i2c_client=NULL; //static struct mxc_mma7660_platform_data* plat_data; //リン 静的 u8 方向; static SENSOR_DEVICE_ATTR(all_axis_force, S_IRUGO, show_xyz_force, NULL, 0); //linux/include/linux/hwmon-sysfs.h で定義されています。34行目 静的SENSOR_DEVICE_ATTR(x_axis_force、S_IRUGO、show_axis_force、NULL、0); 静的SENSOR_DEVICE_ATTR(y_axis_force、S_IRUGO、show_axis_force、NULL、1); 静的SENSOR_DEVICE_ATTR(z_axis_force、S_IRUGO、show_axis_force、NULL、2); 静的SENSOR_DEVICE_ATTR(orientation, S_IRUGO, show_orientation, NULL, 0); 静的構造体属性* mma7660_attrs[] = { &sensor_dev_attr_all_axis_force.dev_attr.attr、 &sensor_dev_attr_x_axis_force.dev_attr.attr、 &sensor_dev_attr_y_axis_force.dev_attr.attr、 &sensor_dev_attr_z_axis_force.dev_attr.attr、 &sensor_dev_attr_orientation.dev_attr.attr, ヌル }; 静的定数構造体 attribute_group mma7660_group = { .attrs = mma7660_attrs、 }; 静的void mma7660_read_xyz(int idx, s8 *pf) { s32 結果; mma7660_i2c_client をアサートします。 する { 結果=i2c_smbus_read_byte_data(mma7660_i2c_client、idx+MMA7660_XOUT); アサート(結果>=0); }while(result&(1<<6)); //アラートの場合は再度読み込み *pf = (結果&(1<<5)) ?(結果|(~0x0000003f)) : (結果&0x0000003f); printk("dbg:mma7660_read_xyz()/*pf=0x%x\n",*pf); } 静的void mma7660_read_tilt(u8* pt) { u32 結果; mma7660_i2c_client をアサートします。 する { 結果 = i2c_smbus_read_byte_data(mma7660_i2c_client、MMA7660_TILT); アサート(結果>0); }while(result&(1<<6)); //アラートの場合は再度読み込み *pt = 結果 & 0x000000ff; } 静的 int print_orientation(int orient,char *buf) { int 結果 = 0; char buf1[10], buf2[10]; スイッチ((orient>>2)&0x07) { ケース1: //結果 = sprintf(buf, "左\n"); 結果 = sprintf(buf1, "左"); 壊す ケース2: //結果 = sprintf(buf, "右\n"); 結果 = sprintf(buf1, "右"); 壊す ケース5: //結果 = sprintf(buf, "下向き\n"); 結果 = sprintf(buf1, "下向き"); 壊す ケース6: //結果 = sprintf(buf, "上向き\n"); 結果 = sprintf(buf1, "上向き"); 壊す デフォルト: 結果 = sprintf(buf1, "不明"); } スイッチ(方向 & 0x03) { ケース1: //結果 = sprintf(buf, "Front\n"); 結果 = sprintf(buf2, "Front"); 壊す ケース2: //結果 = sprintf(buf, "Back\n"); 結果 = sprintf(buf2, "戻る"); 壊す デフォルト: //結果 = sprintf(buf, "不明\n"); 結果 = sprintf(buf2, "不明"); } 結果=sprintf(buf," %s,% s",buf1,buf2); 結果を返します。 } ssize_t show_orientation(構造体デバイス *dev、構造体属性 *attr、char *buf) { int 結果; 結果 = print_orientation(orientation,buf); 結果を返します。 } ssize_t show_xyz_force(構造体デバイス *dev、構造体属性 *attr、char *buf) { 整数 i; s8 xyz[3]; (i=0; i<3; i++) の場合 mma7660_read_xyz(i, &xyz); printk("dbg:show_xyz_force()/(xyz[0]= %d,xyz[1]=% d,xyz[2]=%d)\n", xyz[0], xyz[1], xyz[2]); sprintf(buf, "( %d,% d,%d)\n", xyz[0], xyz[1], xyz[2]); を返します。 } ssize_t show_axis_force(構造体デバイス *dev、構造体属性 *attr、char *buf) { s8 フォース; int n = to_sensor_dev_attr(attr)->index; mma7660_read_xyz(n, &force); printk("dbg:show_axis_force()/force=%d\n", フォース); sprintf(buf, "%d\n", force) を返します。 } 静的 void mma7660_worker(構造体 work_struct *work) { u8 傾き、新しい方向; char buf1[20], buf2[20]; int 結果 = 0; mma7660_read_tilt(&tilt); new_orientation = 傾斜 & 0x1f; if(orientation!=new_orientation){ //printk("dbg:/mma7660_worker(),orientation= %d,new_orientation=% d\n",orientation,new_orientation); print_orientation(orientation,buf1); print_orientation(新しい方向、バッファ2); printk("dbg:/mma7660_worker(),方向が%sから%sに変わります\n",buf1,buf2); 方向 = 新しい方向; //アクティブ+自動ウェイクモードを再度開始する mma7660_i2c_client の場合 { 結果 = i2c_smbus_write_byte_data(mma7660_i2c_client, MMA7660_MODE, MK_MMA7660_MODE(0, 0, 0, 0, 0, 0, 0)); //スタンバイ状態に入る アサート(結果==0); 結果 = i2c_smbus_write_byte_data(mma7660_i2c_client, //MMA7660_MODE、MK_MMA7660_MODE(0, 1, 0, 0, 0, 0, 1)); MMA7660_MODE、MK_MMA7660_MODE(0, 1, 0, 1, 1, 0, 1)); //IPP=1、ASE=1、AWE=1、MODE=1 アサート(結果==0); } } それ以外 printk("dbg:/mma7660_worker(),自動スリープモードを終了して自動ウェイクモードに移行します\n"); } DECLARE_WORK(mma7660_work、mma7660_worker); // 割り込みハンドラ 静的irqreturn_t mmx7660_irq_handler(int irq, void *dev_id) { スケジュール作業(&mma7660_work); printk("dbg:/mmx7660_irq_handler(irq= %d,dev_id=% s)\n",irq,(char*)dev_id); IRQ_RETVAL(1)を返す。 } /* 初期化関数 / 静的 int mma7660_init_client(構造体 i2c_client *client) { int 結果; 整数 irq; struct hrtimer タイマー; printk("%s %d\n", __func__ , __LINE__ ); mma7660_i2c_client = クライアント; //plat_data = (struct mxc_mma7660_platform_data *)client->dev.platform_data; //assert(plat_data); if(テスト_テスト_モード) { /* * デバイスをプローブします。デバイスをテストモードに設定し、 * XYZレジスタの書き込みと検証 / 結果 = i2c_smbus_write_byte_data(クライアント、MMA7660_MODE、MK_MMA7660_MODE(0, 0, 0, 0, 0, 1, 0)); アサート(結果==0); mdelay(MODE_CHANGE_DELAY_MS); 結果 = i2c_smbus_write_byte_data(クライアント、MMA7660_XOUT、0x2a); アサート(結果==0); 結果 = i2c_smbus_write_byte_data(クライアント、MMA7660_YOUT、0x15); アサート(結果==0); 結果 = i2c_smbus_write_byte_data(クライアント、MMA7660_ZOUT、0x3f); アサート(結果==0); 結果 = i2c_smbus_read_byte_data(クライアント、MMA7660_XOUT); printk("%sx %x\n", __func__ , 結果); 結果 = i2c_smbus_read_byte_data(クライアント、MMA7660_YOUT); printk("%sy %x\n", __func__ , 結果); 結果 = i2c_smbus_read_byte_data(クライアント、MMA7660_ZOUT); printk("%sz %x\n", __func__ , result); アサート(結果=0x3f); } // 方向検出ロジックを有効にする 結果 = i2c_smbus_write_byte_data(クライアント、 MMA7660_MODE, MK_MMA7660_MODE(0, 0, 0, 0, 0, 0, 0)); //スタンバイ状態に入る //printk("結果=i2c_smbus_write_byte_data(クライアント、MMA7660_MODE、MK_MMA7660_MODE(0, 0, 0, 0, 0, 0, 0))=%d\n",結果); アサート(結果==0); 結果 = i2c_smbus_write_byte_data(クライアント、MMA7660_SRST、0x03); //AWSRS=1、AMSRS=1 結果 = i2c_smbus_write_byte_data(クライアント、 MMA7660_SR, MK_MMA7660_SR(2, 2, 1)); //REG = 0x08,サンプルレートレジスタ, //MMA7660_SR, MK_MMA7660_SR(2, 2, 2)); //REG = 0x08、サンプルレートレジスタ、 //FILT = 2、AMSR[2:0]またはAWSR[1:0]で設定されたレートでの3つの測定サンプル // デバイスが縦向き/横向きのデータを更新する前に一致する必要があります // TILT(0x03)レジスタ内。 //AWSR = 2、8 サンプル/秒 自動ウェイクモード //AMSR = 1、64サンプル/秒、アクティブおよび自動スリープモード //AMSR = 2、32サンプル/秒、アクティブおよび自動スリープモード //printk("結果=i2c_smbus_write_byte_data(クライアント、MMA7660_SR、MK_MMA7660_SR(2, 2, 1));= %d\n",結果); アサート(結果==0); 結果 = i2c_smbus_write_byte_data(クライアント、 MMA7660_INTSU、MK_MMA7660_INTSU(0、0、0、0、1、0、1、1)); //MMA7660_INTSU、MK_MMA7660_INTSU(1、1、1、1、1、1、1、1)); // ASINT =1、自動スリープを終了すると割り込みが発生します // PLINT =1、上/下/右/左の位置変更により割り込みが発生します // FBINT =1、前後位置の変化により割り込みが発生する //printk("結果=i2c_smbus_write_byte_data(クライアント、MMA7660_INTSU、MK_MMA7660_INTSU(0、0、0、0、1、0、1、1));= %d\n",結果); アサート(結果==0); 結果 = i2c_smbus_write_byte_data(クライアント、 MMA7660_SPCNT、0xA0); //printk("結果=i2c_smbus_write_byte_data(クライアント、MMA7660_SPCNT、0xA0); = %d\n",結果); アサート(結果==0); 結果 = i2c_smbus_write_byte_data(クライアント、 MMA7660_MODE、MK_MMA7660_MODE(0, 1, 0, 0, 0, 0, 1)); //MMA7660_MODE、MK_MMA7660_MODE(0, 1, 0, 1, 1, 0, 1)); //IPP=1、ASE=1、AWE=1、MODE=1 //printk("結果=i2c_smbus_write_byte_data(クライアント、MMA7660_MODE、MK_MMA7660_MODE(0, 1, 0, 0, 0, 0, 1)); = %d\n",結果); アサート(結果==0); // MMA7660のINTはimx51EVKのGPIO4_17に接続されています // ここで割り込みハンドラをインストールします //printk("plat_data->irq=%d\n",plat_data->irq); //assert(plat_data->irq); クライアント->irq = 13; 結果 = request_irq(client->irq, mmx7660_irq_handler, IRQF_TRIGGER_FALLING、MMA7660_DRV_NAME、NULL); アサート(結果==0); mdelay(MODE_CHANGE_DELAY_MS); { u8 ティルト; char buf1[20]; mma7660_read_tilt(&tilt); 方向 = 傾き&0x1f; print_orientation(orientation,buf1); printk("dbg:/mma7660_init_client(),初期化状態 %s\n",buf1); } 結果を返します。 } 静的構造体 input_polled_dev *mma7660_idev; #POLL_INTERVAL 100 を定義する #INPUT_FUZZ 4 を定義する #INPUT_FLAT 4 を定義する #include 静的void report_abs(void) { 整数 i; s8 xyz[3]; s16 x、y、z; (i=0; i<3; i++) の場合 mma7660_read_xyz(i, &xyz); /* 符号付き10ビットを符号付き16ビットに変換する */ x = (short)(xyz[0] << 6) >> 6; y = (short)(xyz[1] << 6) >> 6; z = (short)(xyz[2] << 6) >> 6; input_report_abs(mma7660_idev->input、ABS_X、x); input_report_abs(mma7660_idev->input、ABS_Y、y); input_report_abs(mma7660_idev->input、ABS_Z、z); 入力同期(mma7660_idev->入力); printk("dbg:report_abs()/x= %d,y=% d,z=%d\n",x,y,z); } 静的void mma7660_dev_poll(構造体input_polled_dev *dev) { report_abs(); } ////////////////////////////終わり////// /* * I2C 初期化/プローブ/終了関数 / 静的int __devinit mma7660_probe(構造体i2c_client *クライアント、 定数構造体 i2c_device_id *id) { int 結果; 構造体 i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); 構造体 input_dev *idev; if(!i2c_check_functionality(アダプタ、I2C_FUNC_SMBUS_BYTE|I2C_FUNC_SMBUS_BYTE_DATA)) { printk("%s I2Cチェック機能が失敗しました。\n", __func__ ); -ENODEV を返します。 } // アサート(結果); /* MMA7660チップを初期化する */ 結果 = mma7660_init_client(クライアント); アサート(結果==0); 結果 = sysfs_create_group(&client->dev.kobj,&mma7660_グループ); アサート(結果==0); hwmon_dev = hwmon_device_register(&client->dev); アサート(!(IS_ERR(hwmon_dev))); dev_info(&client->dev, "ビルド時間 %s %s\n", __DATE__ , __TIME__ ); /*入力ポーリングデバイスレジスタ */ mma7660_idev = 入力_割り当て_ポーリング_デバイス(); もし (!mma7660_idev) { dev_err(&client->dev, "alloc poll device に失敗しました!\n"); 結果 = -ENOMEM; 結果を返します。 } mma7660_idev->ポーリング = mma7660_dev_poll; mma7660_idev->ポーリング間隔 = POLL_INTERVAL; idev = mma7660_idev->入力; idev->name = MMA7660_DRV_NAME; idev->id.bustype = BUS_I2C; idev->dev.parent = &client->dev; idev->evbit[0] = BIT_MASK(EV_ABS); //絶対座標の最大範囲を設定します (-512,512)? input_set_abs_params(idev、ABS_X、-512、512、INPUT_FUZZ、INPUT_FLAT); input_set_abs_params(idev、ABS_Y、-512、512、INPUT_FUZZ、INPUT_FLAT); input_set_abs_params(idev、ABS_Z、-512、512、INPUT_FUZZ、INPUT_FLAT); 結果 = input_register_polled_device(mma7660_idev); if (結果) { dev_err(&client->dev, "ポーリングデバイスの登録に失敗しました!\n"); 結果を返します。 } //呼び出し側はプルメソッドを設定し、capabilities(id,name,phys,bits)を設定する必要があります。 //対応するinput_dev構造体 ///////////////////////////// 結果を返します。 } 静的int __devexit mma7660_remove(構造体i2c_client *クライアント) { int 結果; 結果 = i2c_smbus_write_byte_data(クライアント、MMA7660_MODE、MK_MMA7660_MODE(0, 0, 0, 0, 0, 0, 0)); アサート(結果==0); free_irq(mma7660_i2c_client->irq, NULL); sysfs_remove_group(&client->dev.kobj, &mma7660_group); hwmon_device_unregister(hwmon_dev); 結果を返します。 } #ifdef CONFIG_PM 静的int mma7660_suspend(struct i2c_client *client, pm_message_t mesg) { int 結果; 結果 = i2c_smbus_write_byte_data(クライアント、 MMA7660_MODE、MK_MMA7660_MODE(0, 0, 0, 0, 0, 0, 0)); アサート(結果==0); 結果を返します。 } 静的 int mma7660_resume(構造体 i2c_client *クライアント) { int 結果; 結果 = i2c_smbus_write_byte_data(クライアント、 MMA7660_MODE、MK_MMA7660_MODE(0, 1, 0, 0, 0, 0, 1)); アサート(結果==0); 結果を返します。 } #それ以外 #定義 mma7660_suspend NULL #定義 mma7660_resume NULL #endif /* CONFIG_PM */ 静的定数構造体 i2c_device_id mma7660_id[] = { { MMA7660_DRV_NAME, 0 }, { } }; モジュールデバイステーブル(i2c、mma7660_id); 静的構造体 i2c_driver mma7660_driver = { .driver = { .name = MMA7660_DRV_NAME、 .owner = このモジュール、 }, .suspend = mma7660_suspend、 .resume = mma7660_resume、 .probe = mma7660_probe, .remove = __devexit_p(mma7660_remove)、 .id_table = mma7660_id、 }; 静的 int __init mma7660_init(void) { i2c_add_driver(&mma7660_driver) を返します。 } 静的void __exit mma7660_exit(void) { i2c_del_driver(&mma7660_driver); } MODULE_DESCRIPTION("MMA7660 3軸方向/モーション検出センサードライバー"); MODULE_LICENSE("GPL"); モジュールバージョン("1.1"); モジュールの初期化(mma7660_init)。 モジュール終了(mma7660_exit); Re: 我最近在调试MMA7660,其他都行,就是中断一开始是高电平,位置变化后变为低电平,无法恢复为高电平 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
こんにちは、トーマス: 皆様のフィードバックに基づいて修正した後も、以前と同じままです。 一つ言い忘れていましたが、もう一つの現象は割り込み関数に入ることができないことです。 私は AM335X プラットフォームを使用しており、割り込み機能に入っても問題はないだろうと見積もっています。
[email protected] 送信者:
[email protected] 送信日時: 2015-03-04 17:43 受信者: jive-47801551-50wr-2-afcg 件名: Re: Re: - 最近MMA7660のデバッグをしています。他の部分はすべて正常に動作しているのですが、割り込みレベルが最初はハイレベルですが、ポジション変更後にローレベルに落ちてしまい、ハイレベルに戻すことができません。 ありがとう、トーマス!あなたの提案に従って修正します。
[email protected] 出典:トーマス・ヴァヴェルカ 送信日時: 2015-03-04 17:28 受信者: 張雲峰 件名: Re: - 現在、MMA7660 をデバッグ中です。他の部分はすべて正常に動作しているのですが、割り込みレベルが最初はハイレベルから始まり、ポジション変更後にローレベルに落ちてしまい、ハイレベルに戻すことができません。 最近、MMA7660のデバッグをしています。他の部分はすべて正常に動作しているのですが、割り込みレベルが最初はハイレベルから始まり、ポジション変更後にローレベルに下がり、その後ハイレベルに戻らなくなります。 センサーに関するTomas Vaverkaからの返信 - 全文を見る こんにちは、張さん。 次の手順で構成される簡単なテストを実行することをお勧めします。 1. MODEレジスタのMODEビットをクリアして、デバイスをスタンバイモードにします。 2. SRレジスタのAMSR[3:0]ビットとFILT[2:0]ビットを使用して、目標の消費電力レベルや希望する応答速度に基づいてサンプルレートを選択します(詳細については、AN3837の表5を参照してください)。 3. INTSUレジスタのPLINTビットとFBINTビットの両方を設定して、方向割り込みを有効にします。 4. ニーズに応じて MODE レジスタの IPP ビットと IAH ビットの両方を設定し (オープン ドレインまたはプッシュプル、アクティブ ハイまたはアクティブ ロー)、MODE レジスタの MODE ビットを設定してデバイスをアクティブ モードにします。 5. ISR で TILT レジスタを読み取って割り込みピンをデアサートし、オシロスコープまたはロジック アナライザを使用して割り込みピンのアクティビティを監視します。 お役に立てれば幸いです。それでも割り込みが機能しない場合はお知らせください。さらに調査いたします。 よろしくお願いいたします トーマス 追伸: 私の回答が質問の解決に役立った場合は、「正解」または「役に立った」とマークしてください。ありがとう。 あなたの質問は解決しましたか? もしそうなら、コミュニティ スレッドで「正解」をクリックして感謝の意を表しましょう。 このメールに返信するか、Freescaleコミュニティのメッセージにアクセスしてこのメッセージに返信してください。 電子メールまたはFreescaleコミュニティでセンサーに関する新しいディスカッションを開始してください 最近のMMA7660のデバッグでは、他のすべては正常に動作しますが、割り込みは最初はハイになり、位置変更後にローになり、これらのストリームではハイに戻すことができません。受信トレイ Re: 我最近在调试MMA7660,其他都行,就是中断一开始是高电平,位置变化后变为低电平,无法恢复为高电平 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
ありがとう、トーマス!あなたの提案に従って修正します。
[email protected] 出典:トーマス・ヴァヴェルカ 送信日時: 2015-03-04 17:28 受信者: 張雲峰 件名: Re: - 現在、MMA7660 をデバッグ中です。他の部分はすべて正常に動作しているのですが、割り込みレベルが最初はハイレベルから始まり、ポジション変更後にローレベルに落ちてしまい、ハイレベルに戻すことができません。 最近、MMA7660のデバッグをしています。他の部分はすべて正常に動作しているのですが、割り込みレベルが最初はハイレベルから始まり、ポジション変更後にローレベルに下がり、その後ハイレベルに戻らなくなります。 センサーに関するTomas Vaverkaからの返信 - 全文を見る こんにちは、張さん。 次の手順で構成される簡単なテストを実行することをお勧めします。 1. MODEレジスタのMODEビットをクリアして、デバイスをスタンバイモードにします。 2. SRレジスタのAMSR[3:0]ビットとFILT[2:0]ビットを使用して、目標の消費電力レベルや希望する応答速度に基づいてサンプルレートを選択します(詳細については、AN3837の表5を参照してください)。 3. INTSUレジスタのPLINTビットとFBINTビットの両方を設定して、方向割り込みを有効にします。 4. ニーズに応じて MODE レジスタの IPP ビットと IAH ビットの両方を設定し (オープン ドレインまたはプッシュプル、アクティブ ハイまたはアクティブ ロー)、MODE レジスタの MODE ビットを設定してデバイスをアクティブ モードにします。 5. ISR で TILT レジスタを読み取って割り込みピンをデアサートし、オシロスコープまたはロジック アナライザを使用して割り込みピンのアクティビティを監視します。 お役に立てれば幸いです。それでも割り込みが機能しない場合はお知らせください。さらに調査いたします。 よろしくお願いいたします トーマス 追伸: 私の回答が質問の解決に役立った場合は、「正解」または「役に立った」とマークしてください。ありがとう。 あなたの質問は解決しましたか? もしそうなら、コミュニティ スレッドで「正解」をクリックして感謝の意を表しましょう。 このメールに返信するか、Freescaleコミュニティのメッセージにアクセスしてこのメッセージに返信してください。 電子メールまたはFreescaleコミュニティでセンサーに関する新しいディスカッションを開始してください 最近のMMA7660のデバッグでは、他のすべては正常に動作しますが、割り込みは最初はハイになり、位置変更後にローになり、これらのストリームではハイに戻すことができません。受信トレイ Re: 我最近在调试MMA7660,其他都行,就是中断一开始是高电平,位置变化后变为低电平,无法恢复为高电平 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
こんにちは、張さん。 次の手順で構成される簡単なテストを実行することをお勧めします。 1. MODEレジスタのMODEビットをクリアして、デバイスをスタンバイモードにします。 2. SRレジスタのAMSR[3:0]ビットとFILT[2:0]ビットを使用して、目標の消費電力レベルや希望する応答速度に基づいてサンプルレートを選択します(詳細については、 AN3837の表5を参照してください)。 3. INTSUレジスタのPLINTビットとFBINTビットの両方を設定して、方向割り込みを有効にします。 4. ニーズに応じて MODE レジスタの IPP ビットと IAH ビットの両方を設定し (オープン ドレインまたはプッシュプル、アクティブ ハイまたはアクティブ ロー)、MODE レジスタの MODE ビットを設定してデバイスをアクティブ モードにします。 5. ISR で傾きレジスタを読み取って割り込みピンをデアサートし、オシロスコープまたはロジック アナライザを使用して割り込みピンのアクティビティを監視します。 お役に立てれば幸いです。それでも割り込みが機能しない場合はお知らせください。さらに調査いたします。 よろしくお願いいたします。 トーマス 追伸: 私の回答がご質問の解決に役立った場合は、「正解」または「役に立った」と評価してください。ありがとうございます。