利用i2c实现加速度计的控制

4个员额/0个新员额
最后一篇文章
Sean666
离线
最后一次见到:2年12个月前
加入:2016-08-04 03:56
利用i2c实现加速度计的控制

嗨,对话小组,

我尝试将加速计控制代码添加到“ble_app_睡眠模式”。
我可以初始化并读取加速度计值。

并且,我添加了加速计控制代码来中断“ble_app_sleepmode”的处理,如下所示。
我是用逻辑分析仪测量的。
当我按下按钮时,DA14580没有发送I2C信号。

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
静态无效用户\应用\按钮\按下\ cb(无效)
{
arch_printf(“用户应用程序按钮按下cb\r\n”);
uint8下一个事件=0;

//读取按钮状态
if(GPIO_GetPinStatus(GPIO_按钮_端口,GPIO_按钮_引脚))
{
app_sleep_env.custs1_btn_state=custs1_btn_state_已发布;
下一个事件=WKUPCT引脚极性低;
}
其他的
{
app_sleep_env.custs1_btn_state=custs1_btn_state_按下;
下一个事件=WKUPCT引脚极性高;
}

i2cMma8652ReadData()\\←添加了加速计控制代码

//更新按钮字符
结构custs1\u val\u ntf\u req*req=KE_MSG\u ALLOC\u DYN(custs1\u val\u ntf\u req,
任务1,
任务应用程序,
客户1_val_ntf_需求,
定义用户1按钮状态字符);

req->conhdl=app\U env->conhdl;
req->handle=CUST1\u IDX\u按钮\u状态\u值;
req->length=DEF_CUST1_按钮_状态_字符_长度;
请求->值[0]=应用程序睡眠环境用户1\u btn\u状态;

发送消息(请求);

//配置下一个按钮事件
用户应用设置按钮事件(下一个btn事件);
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

然而,当我按下按钮时,它停止了。
你能告诉我为什么它会停止。。。?

发展环境:
*董事会:DA14580DEVKT-B
*SDK:DA1458x_SDK_5.0.4

加速度计:MMA8652

初始化加速计控制的处理:
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
无效i2c_mma8652_初始(无效){
arch_printf(“i2c_mma8652_init\r\n”);
SetBits16(时钟每寄存器,I2C启用,1);//为I2C启用时钟
SetWord16(I2C_ENABLE_REG,0x0);//禁用I2C控制器
SetWord16(I2C控制寄存器,0
|I2C_从_禁用
|I2C_重启_EN
|I2C_主模式);
设置16(I2C\u控制寄存器、I2C\u速度、I2C\u标准);

SetWord16(I2C_TAR_REG,I2C_MMA8652_DEVICE_ADDRESS);//设置从设备地址

//设置标准模式的比特率100Kbit/sec
//当16MHz sclk 1/16*(72(H)+8+79(L)+1)=10 us
设置字16(I2C\U SS\U SCL\U HCNT\U REG,72);
设置字16(I2C\U SS\U SCL\U LCNT\U注册表,79);

设置字16(I2C_RX_TL_REG,0x10);
设置字16(I2C_TX_TL_REG,0x10);
SetWord16(I2C_INTR_MASK_REG,0x200);//为停止位启用中断
SetWord16(I2C_ENABLE_REG,0x1);//启用I2C控制器
等待_,直到_NO _MASTER _ACTIVITY();//等待I2C MASTER FSM变为空闲状态

I2CMMA8652备用();
i2c_mma8652_write_字节(XYZ_DATA_CFG,0x00);//+/-2g范围,约0.977mg/LSB
i2c_mma8652_write_字节(CTRL_REG2,0x02);//高分辨率模式
i2c_mma8652_write_字节(CTRL_REG3,0x08);//推拉,低电平有效中断
i2c_mma8652_write_字节(CTRL_REG4,0x05);//启用DRDY,MT中断
i2c_mma8652_write_字节(CTRL_REG5,0x05);//DRDY,MT中断路由至INT1-PTA5
i2c_mma8652_写入字节(FF_MT_CFG,
事件(闩锁)启用|运动|检测|检测| XYZ)启用);
i2c mma8652写入字节(FF MT THS,0x70);
i2c_mma8652_写入_字节(FF_MT_计数,0x10);

i2cMma8652WhoAmI();

I2CMMA8652激活();
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

关键词:
设备:
工友对话
离线
最后一次见到:3天6小时前
加入:2016-04-27 07:07
我想你可能需要补充一下

我想您可能需要在“i2cMma8652ReadData()”之前添加“arch_force_active_mode()”\\←添加了加速计控制代码“

此外,通常不建议在当前代码位置添加“i2cMma8652ReadData();”。
我建议添加消息处理函数。
就像“用户\应用\启用\脉宽调制”功能的调用位置一样。

Sean666
离线
最后一次见到:2年12个月前
加入:2016-08-04 03:56
嗨,工友对话,

嗨,工友对话,

我可以操作“i2cMma8652ReadData();”添加“arch_force_active_mode();”的结果。

我将考虑消息处理程序的功能。

非常感谢。

LT_对话框(未验证)
你好,肖恩666,

你好,肖恩666,
在i2cMma8652ReadData()中,i2c控制器是否重新初始化?当580进入睡眠模式时,i2c控制器断电。i2c控制器寄存器中存储的值不会保留。