已经调通ADXL345的I2C驱动,我的程序设置部分如下
void Init_ADXL345(void) { Single_Write_ADXL345(0x2D,0x00); //开始设置前选择待机模式参考pdf24页 Single_Write_ADXL345(0x2E,0x00); //中断INT_ENABLE,设置前先关中断 Single_Write_ADXL345(0x31,0x2B); //0x0B测量范围,正负16g,右对齐,13位模式,INT_INVERT0x20中断低电平有效 Single_Write_ADXL345(0x2C,0x0F); //速率设定为3200HZ 参考pdf13页
Single_Write_ADXL345(0x1E,0x00); //X 偏移量 根据测试传感器的状态写入pdf29页 Single_Write_ADXL345(0x1F,0x00); //Y 偏移量 根据测试传感器的状态写入pdf29页 Single_Write_ADXL345(0x20,0x05); //Z 偏移量 根据测试传感器的状态写入pdf29页
Single_Write_ADXL345(0x24,0x02); //THRESH_ACT保存检测活动阀值; (62.5mg/LSB)*0xxx Single_Write_ADXL345(0x25,0x02); //THRESH_INACT保存检测静止阀值; (62.5mg/LSB)*0xxx Single_Write_ADXL345(0x26,0x01); //TIME_INACT检测静止时间阀值; (1s/LSB)*0xxx Single_Write_ADXL345(0x27,0xEE); //ACT_INACT_CTL检轴使能控制活动和静止检测:高位0直流和门限比较,1与前值的差值和门限值比较
Single_Write_ADXL345(0x2F,0x10); //中断映射INT_MAP,1发送到INT2 Single_Write_ADXL345(0x2E,0x18); //中断INT_ENABLE,使能Activity
Single_Write_ADXL345(0x2D,0x08); //选择电源模式 测量模式 参考pdf24页
Single_Read_ADXL345(0x2B); //中断清零前,应读取ACT_TAP_STATUS寄存器 Single_Read_ADXL345(0x30); //清中断标志 }
然后我把中断1连接到单片机的IO口,在单片机的IO口中断中清中断,中断函数代码如下
HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR ) { HAL_ENTER_ISR();
if (HAL_KEY_SW_X_PXIFG & HAL_KEY_SW_6_BIT)//中断1接到IO口P06 { halProcessKeyInterrupt(); Single_Read_ADXL345(0x2B); //清中断前需读取只读寄存器器0x2B ACT_TAP_STATUS来判断事件触发的第一轴 Single_Read_ADXL345(0x30); //清中断标志 }
if (HAL_KEY_SW_X_PXIFG & HAL_KEY_SW_7_BIT)//中断2接到IO口P07 { halProcessKeyInterrupt(); Single_Read_ADXL345(0x2B); //清中断前需读取只读寄存器器0x2B ACT_TAP_STATUS来判断事件触发的第一轴 Single_Read_ADXL345(0x30); //清中断标志 }
HAL_KEY_SW_X_PXIFG = 0; HAL_KEY_CPU_PORT_0_IF = 0;
CLEAR_SLEEP_MODE(); HAL_EXIT_ISR(); }
中断INT输出引脚都是用4.7K电阻上拉的,然后才连接到单片机的IO口,我的单片机是CC2530
|