大家好,我正在使用 FXAS21000,在完成了裸机示例项目之后,我得以从设备中获得一些读数。但是,问题在于,经过几次读取 (< 5),设备会停止工作。我注意到中断引脚保持低电平。由于我使用 INT2 作为外部中断来知道何时读取寄存器,所以我的代码就停止工作了。如果忽略中断引脚,只读取 OUT_X_MSB 寄存器,就能得到正确的读数。
我知道只要读取从 OUT_X_MSB 开始的 6 个数据字节就应该 RESET 中断标志(数据表:" 读取 INT_SRC_FLAG 寄存器不会 RESET 任何事件标志源位;它们可以通过读取相应的事件源寄存器 " 来 RESET),但事实似乎并非如此。数据表还指出 " ... 该寄存器 (0x0B) 的内容在从待机模式过渡到运行模式或从就绪模式过渡到运行模式 " 时 RESET,所以我决定在读取之前从 " active " 切换到 " ready " 模式,然后返回 " 处于活动状态" 读取寄存器的内容后,这似乎可以解决问题,但并不理想,因为我需要3次操作才能读取数据。
#define FXAS21000_DR_SHIFT2(x) (x << 2)
#define FXAS21000_REG1_DR_MSK 0x1C
void FXAS21000::init(){
writeRegister(FXAS21000_CTRL_REG1, FXAS21000_REG1_SFT_RST); // Factory default
wait(1_ms);
// Enter in standby mode
uint8_t reg = getRegister(FXAS21000_CTRL_REG1);
writeRegister(FXAS21000_CTRL_REG1, reg & ~FXAS21000_REG1_STANDBY);
// Set the Full scale mode at 800dps
// High pass filter disabled
writeRegister(FXAS21000_CTRL_REG0, 0x01);
// Enable data ready interrupts
writeRegister(FXAS21000_CTRL_REG2, (1 << 2));
// Set a low sampling rate to start with (Mode_25Hz)
reg = getRegister(FXAS21000_CTRL_REG1) & ~FXAS21000_REG1_DR_MSK;
writeRegister(FXAS21000_CTRL_REG1, reg | (FXAS21000_REG1_DR_MSK & FXAS21000_DR_SHIFT2(3)));
// Back to active mode
reg = getRegister(FXAS21000_CTRL_REG1) & ~FXAS21000_REG1_STANDBY;
int r = writeRegister(FXAS21000_CTRL_REG1, reg | FXAS21000_REG1_ACTIVE);
}
int FXAS21000::read(int16_t * t){
uint8_t d[7];
int r = read( FXAS21000_STATUS, d, 7);
if(r <= 0){
return r;
}
t[0] = ((d[1] * 256) + ((unsigned short) d[2]));
t[1] = ((d[3] * 256) + ((unsigned short) d[4]));
t[2] = ((d[5] * 256) + ((unsigned short) d[6]));
}有人遇到过类似问题吗?如果能得到任何帮助,我们将不胜感激!
谢谢、
A.
已经过去一年多了,我完全忘记了这篇文章。我现在回复,是为了让这些信息对其他人有所帮助。
问题原来是竞争条件;在 IRQ 例程中,我设置了一个标志来表示陀螺仪有数据,然后在主循环中我检查了该标志以确定是否应该读取新数据,如果是,则读取数据并将标志重置回 0。正如你现在所想象的那样,问题在于,在读取轴的 i2c 交易完成和我将标志重置回 0 之间,会出现另一个 IRQ,所以我基本上忽略了最后一个中断信号,这解释了中断引脚保持低电平的原因。
有几种解决方法,但我想我最终还是保留了原样,但在主循环中,即使标志为假(没有中断出现),也要重复检查 IRQ 引脚是否为低,这样就避免了在每个循环周期中都调用引脚状态,而只在明显发生错误时(标志表明没有新数据,但中断引脚为低)才调用引脚状态。
希望能对您有所帮助。
干杯
A.
你好,托马斯,谢谢你的答复。
是的,我确实有一台逻辑分析器,但不幸的是,该设备装在组装好的板上,我很难访问总线。我知道 INT2 引脚保持低电平,因为我可以从 MCU 读取该引脚的逻辑电平,并显示为低电平(在读数停止上升后)。
我知道 ISR 的 RESET 位;我在同一块板(以及许多其他板)上还有另一个使用相同的 IRQ 处理例程的传感器工作正常。此外,如果是这样的话,仅仅改变陀螺仪的运行模式不应该让 " 修复 " 这个问题。这说明我在配置 FXAS21000 的寄存器时做了一些愚蠢的事情。
我在最初的帖子中提到,该设备最多可以运行大约 5 个读数(似乎是随机的)然后停止工作,这让我想知道读取一定数量后是否应该清除 FIFO 缓冲区?
谢谢!
A.
你好,亚历山大、
你有逻辑分析仪或示波器来了解总线上发生了什么吗?没有它,可能很难进行调试。
通过读取所有 X、Y、Z 输出数据寄存器(0x01 - 0x06),SRC_DRDY 标志被清除,INTx 引脚也随之失效。还需要在 ISR 中确认 IRQ,通常是向 MCU 的特定位写入逻辑 1。如果不这样做,MCU 上的中断标志将保持激活状态,从而无法接收来自 FXAS21000 的任何其他中断。
希望对你有所帮助。
顺祝商祺!
托马斯