跳到主要内容

使用I2C的加速度计控制

4年前

使用I2C的加速度计控制

张贴了Sean666.0分 3回复
0旋转

嗨对话小组,

我试图将加速度计控制代码添加到“ble_app_sleepmode”。
我可以初始化并读取加速度计值。

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

\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\\\\\\\\\\\\\\\\\\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
静态void user_app_button_press_cb(void)
{
ARCH_PRINTF(“user_app_button_press_cb \ r \ n”);
uint8_t next_btn_event = 0;

//读取按钮状态
if(gpio_getpinstatus(gpio_button_port,gpio_button_pin))
{
app_sleep_env.custs1_btn_state = custs1_btn_state_released;
next_btn_event = wkupct_pin_polarity_low;
}
别的
{
app_sleep_env.custs1_btn_state = custs1_btn_state_pressured;
next_btn_event = wkupct_pin_polarity_high;
}

i2cmma8652readdata();\\←增加了加速度计控制代码

//更新按钮characterstic
struct musts1_val_ntf_req * req = ke_msg_alloc_dyn(custs1_val_ntf_req,
task_custs1,
task_app,
custs1_val_ntf_req,
def_cust1_button_state_char_len);

req-> conhdl = app_env-> conhdl;
req-> handle = cust1_idx_button_state_val;
req-> length = def_cust1_button_state_char_len;
req-> value [0] = app_sleep_env.custs1_btn_state;

KE_MSG_SEND(REQ);

//配置下一个按钮事件
user_app_set_button_event(next_btn_event);
}
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\\\\\\\\\\\\\\\\\\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

但是,当我按下按钮时,它会停止。
你能告诉我为什么它会停止......?

开发环境:
*董事会:DA14580DEVKT-B
* SDK:da1458x_sdk_5.0.4

加速度计:MMA8652

初始化加速度计控制的处理:
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\\\\\\\\\\\\\\\\\\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
void i2c_mma8652_init(void){
ARCH_PRINTF(“i2c_mma8652_init \ r \ n”);
setbits16(clk_per_reg,i2c_enable,1);//为i2c启用时钟
setword16(i2c_enable_reg,0x0);//禁用I2C控制器
setword16(i2c_con_reg,0
|i2c_slave_disable.
|i2c_restart_en.
|i2c_master_mode);
setBits16(i2c_con_reg,i2c_speed,i2c_standard);

setword16(i2c_tar_reg,i2c_mma8652_device_address);//设置从设备地址

//设置标准模式的比特率100kbit / sec
//当16MHz SCLK 1/16 *(72(H)+ 8 + 79(L)+1)= 10 US
setword16(i2c_ss_scl_hcnt_reg,72);
setword16(i2c_ss_scl_lcnt_reg,79);

setword16(i2c_rx_tl_reg,0x10);
setword16(i2c_tx_tl_reg,0x10);
setword16(i2c_intr_mask_reg,0x200);//启用中断停止位
setword16(i2c_enable_reg,0x1);//启用I2C控制器
wait_until_no_master_actity();//等待i2c主fsm变得空闲

i2cmma8652();
I2C_MMA8652_WRITE_BYTE(XYZ_DATA_CFG,0x00);// +/- 2g系列,〜0.977mg / LSB
I2C_MMA8652_WRITE_BYTE(CTRL_REG2,0x02);//高分辨率模式
i2c_mma8652_write_byte(ctrl_reg3,0x08);//推挽,有效低中断
I2C_MMA8652_WRITE_BYTE(CTRL_REG4,0x05);//启用DRDY,MT中断
I2C_MMA8652_WRITE_BYTE(CTRL_REG5,0x05);// DRDY,MT中断路由到INT1 - PTA5
i2c_mma8652_write_byte(ff_mt_cfg,
event_latch_enable |motion_detect |redistic_xyz_enable);
i2c_mma8652_write_byte(ff_mt_ths,0x70);
i2c_mma8652_write_byte(ff_mt_count,0x10);

i2cmma8652whoami();

i2cmma8652active();
}
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\\\\\\\\\\\\\\\\\\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

4年前

Gongyu_dialog. -15点

我想你可能需要添加“Arch_Force_Active_Mode();”之前“i2cmma8652readdata(); \\←增加了加速度计控制代码”

此外,通常不建议在当前代码位置添加“i2cmma8652readdata();”
我可能会建议在消息处理程序函数中添加。
就像函数“user_app_enable_pwm”的呼叫位置一样。

4年前

Sean666. 0分

嗨,gongyu_dialog,

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

我要考虑消息处理程序函数。

谢谢你。

4年前

woshobruuefrip ... 0分

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