加速度计矢量幅度 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
你好,我在尝试使用 FXOS8700 的 A_VECM 功能时遇到了一个奇怪的反应。 我有以下一段代码: MMA865x_Standby(); IIC_RegWrite(CTRL_REG4,0x02); //禁用数据就绪中断,启用 A_VECM 中断 iic_regWrite (a_vecm_ths_msb,0x80); //更新 MSB THS,条件失败时RESET print_string("A_VECM_THS_MSB=",16); print_hex(IIC_RegRead(A_VECM_THS_MSB)); WaitPrintBuffer(); IIC_RegWrite(A_VECM_THS_LSB,Acc_THS); //更新 LSB THS print_string("A_VECM_THS_LSB=",16); print_hex(IIC_RegRead(A_VECM_THS_LSB)); WaitPrintBuffer(); IIC_RegWrite(A_VECM_CNT,Acc_COUNT); //更新计数器 print_string("A_VECM_CNT=",13); print_hex(IIC_RegRead(A_VECM_CNT)); printENTER; WaitPrintBuffer(); iic_regWrite (a_vecm_CFG,0x78); //0111 1000 锁定启用,A_VECM_INIT,事件发生时不要更新引用 IIC_RegWrite(M_CTRL_REG1,((IIC_RegRead(M_CTRL_REG1))&(~0x03))); //Enable Accelerometer_Only Data_Mode= Accelerometer_Only; // 通知 EX0 中断以读取加速计数据 IIC_RegWrite(M_CTRL_REG2,((IIC_RegRead(M_CTRL_REG2))&(~0x20)); /禁用自动递增模式 // IntSource=IIC_RegRead(TRANSIENT_SRC); //读取 0x1E TRANSIENT_SRC 寄存器以清除中断 MMA865x_Active(); // 激活传感器 使用这段代码,程序运行良好,每次我移动设备时都会钳位 A_VECM。 在这个阶段,我决定删除 print_string() 行。 在我这样做之后,A_VECM 被钳位过一次,不再钳位了。 我试着用简单的延迟来替换 print_string() 行: for(i=0; i<60000; i++); 使用这条线,再次钳位 A_VECM 没有问题。 我可以读取 CNTR_REG4,它被设置为 0x02。但是没有钳位 A_VECM。 你知道这是什么原因吗? 谢谢! 加速度传感器 磁力传感器 Re: accelerometer vector magnitude <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
你好,托马斯 感谢提供正确的链接。 问题依然存在。 更多项目详情(代码)请见下文 传感器初始化 MMA865x_Standby(); IIC_RegWrite(CTRL_REG4,0x02); IIC_RegWrite(A_VECM_THS_MSB,0x80); IIC_RegWrite(A_VECM_THS_LSB,Acc_THS); IIC_RegWrite(A_VECM_CNT,Acc_COUNT); IIC_RegWrite(A_VECM_INITX_MSB, 0x00); IIC_RegWrite(A_VECM_INITX_LSB, 0x00); IIC_RegWrite(A_VECM_INITY_MSB, 0x00); IIC_RegWrite(A_VECM_INITY_LSB, 0x00); IIC_RegWrite(A_VECM_INITZ_MSB, 0x00); IIC_RegWrite(A_VECM_INITZ_LSB, 0x00); IIC_RegWrite(A_VECM_CFG,0x78); IIC_RegWrite(M_CTRL_REG1,((IIC_RegRead(M_CTRL_REG1))&(~0x03))); IIC_RegWrite(M_CTRL_REG2,((IIC_RegRead(M_CTRL_REG2))&(~0x20))); MMA865x_Active(); IntSource=IIC_RegRead(INT_SOURCE); 现在我正在轮询 A_VECM 事件 General_IntSource= IIC_RegRead(INT_SOURCE); if (General_IntSource&0x02) readdata(); 最后是函数readdata() 无效 readdata(void) // { IntSource=IIC_RegRead(INT_SOURCE); MMA865x_Standby(); IIC_RegWrite(M_CTRL_REG1,((IIC_RegRead(M_CTRL_REG1))|0x03)); //混合模式 IIC_RegWrite(M_CTRL_REG2,((IIC_RegRead(M_CTRL_REG2))|0x20)); //启用磁性自动增量功能 IIC_RegWrite(CTRL_REG4,0x01); // 启用数据就绪中断并禁用 A_VECM 中断 MMA865x_Active(); // 激活传感器 在这里,我使用数据就绪中断多次读取加速度计和磁场数据,以检索新数据 在最终完成读取数据后,我设置了重新接受A_VECM 中断的参数 MMA865x_Standby(); IIC_RegWrite(CTRL_REG4,0x02); /禁用数据就绪中断,启用 A_VECM 中断 f@@ or (i=0; i < 60000; i++); -如果删除此行,除非我重新启动系统,否则不会再钳位 A_VECM 中断 IIC_RegWrite(M_CTRL_REG1,((IIC_RegRead(M_CTRL_REG1))&(~0x03)); //Enable Accelerometer_Only IIC_RegWrite(M_CTRL_REG2,((IIC_RegRead(M_CTRL_REG2))&(~0x20))); //禁用自动递增模式 MMA865x_Active(); // 激活传感器 IntSource=IIC_RegRead(INT_SOURCE); //读取 0x0C INT_SOURCE 寄存器以清除中断 } 始终钳位第一个中断,系统按预期运行。我获得了所有数据读数。 当放置延迟线时,系统也能正常工作。问题是为什么需要它。 我之所以认为需要延迟,是因为我在调试时打印了几行。当我删除这些行之后,在第一个 A_VECM 之后就不再出现中断了。 经过调查,我意识到在设置 CTRL_ REG4 后需要延迟才能获得连续的中断。 我肯定知道中断没有钳位,因为在调试模式下我能看见 General_intSource 变量的值为 0x00。 如果您能调查这个案件并提出您的见解,我将不胜感激。 谢谢! 梅厄 MMA865x_Standby(); IIC_RegWrite(CTRL_REG4,0x02); IIC_RegWrite(A_VECM_THS_MSB,0x80); IIC_RegWrite(A_VECM_THS_LSB,Acc_THS); IIC_RegWrite(A_VECM_CNT,Acc_COUNT); IIC_RegWrite(A_VECM_INITX_MSB,0x00); IIC_RegWrite(A_VECM_INITX_LSB,0x00); IIC_RegWrite(A_VECM_INITY_MSB,0x00); IIC_RegWrite(A_VECM_INITY_LSB,0x00); IIC_RegWrite(A_VECM_INITZ_MSB, 0x00); IIC_RegWrite(A_VECM_INITZ_LSB, 0x00); IIC_RegWrite(A_VECM_CFG,0x78); IIC_RegWrite(M_CTRL_REG1,((IIC_RegRead(M_CTRL_REG1))&(~0x03))); IIC_RegWrite(M_CTRL_REG2,((IIC_RegRead(M_CTRL_REG2))&(~0x20))); MMA865x_Active(); IntSource=IIC_RegRead(INT_SOURCE); Re: accelerometer vector magnitude <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
嗨,梅厄 对不起,正确的链接是: https://community.freescale.com/docs/DOC-106050 请尝试重现我的设置,如果问题仍然存在,请告诉我。 此致, 托马斯 Re: accelerometer vector magnitude <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
你好,托马斯 感谢您的及时回复。 很遗憾,我无法打开您发送的示例代码链接。 事实上,我是从一个处理瞬时中断的程序中复制粘贴了一段以前的代码,所以我读取的是瞬时源,而不是 INT_Source。 我在问题中附上的代码是处理 A_VECM 中断的最后一部分。 中断钳位后,我立即读取了 INT_SOURCE 寄存器。 最后,我按照你的建议修改了这一行 // IntSource=IIC_RegRead(TRANSIENT_SRC); //读取 0x1E TRANSIENT_SRC 寄存器以清除中断 改为 IntSource=IIC_RegRead(INT_SOURCE); //读取 0x0C INT_SOURCE 寄存器以清除中断 问题依然存在。 我的情况则不同。 看起来,如果我在该行后面有一个延迟: IIC_RegWrite(CTRL_REG4,0x02); //禁用数据就绪中断,启用 A_VECM 中断 我确实被打断了。 延迟是通过设置和打印几个寄存器来实现的(见我在问题中发送的代码)、 或甚至通过简单的 for(i=0; i<60000; i++); 来实现延迟。 在这些情况下,我确实会在第一个中断之后 A_VECM 中断,这种中断总是按预期进行钳位。 如果未实现延迟,则在钳位的第 1 次之后我不会被中断。 谢谢! 梅厄-苏德利 Re: accelerometer vector magnitude <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
嗨,梅厄 请看我的示例代码。您需要读取 INT_SOURCE 寄存器 (0x0C) 以清除 SRC_A_VECM 状态位并取消 INTx 引脚的置信。 希望对你有所帮助。 此致, 托马斯 PS:如果我的回答有助于解决您的问题,请标记为"正确" 。谢谢。
查看全文