硬件:
I2C1:
GPIO27
--
I2C1_SCK和GPIO 28-- I2C1_SDA
D13 GPIO34
加速度传感器G_SENSOR:SC7A30E
软件:
描述:
通过轮查询方式检测G_sensor的数值大小来判断是否有震动,从而通过LED的闪烁来通知。
I2C初始化:
//2017年1月3日5 G_SENSOR
//I2C初始化设定
staticunsigned int TASK_DELAY = 100;//100ms
staticunsigned int g_sClkCount = 0;//全局变量 计时
#defineSLAVE_ADDRESS 0x3A //从设备地址
#defineI2C_SEND_DATA_NUMBER 8 //一次读写8位
constuint8_t send_data[6]={0x00,0x00,0x80,0x37,0x0d,0x80};//设置的参数
uint8_treceive_data[3]; //接收的数据
staticvoid IO_init()
{
//LED初始化
/*GPIO_init*/
hal_gpio_init(HAL_GPIO_34);
/* Set pin as GPIO mode.*/
hal_pinmux_set_function(HAL_GPIO_34,HAL_GPIO_34_GPIO34);
/* Set GPIO as output.*/
hal_gpio_set_direction(HAL_GPIO_34,HAL_GPIO_DIRECTION_OUTPUT);
//I2C初始化
hal_i2c_config_t i2c_init;
hal_gpio_init(HAL_GPIO_27);
hal_gpio_init(HAL_GPIO_28);
hal_pinmux_set_function(HAL_GPIO_27,HAL_GPIO_27_I2C1_CLK);
hal_pinmux_set_function(HAL_GPIO_28,HAL_GPIO_28_I2C1_DATA);
hal_gpio_pull_up(HAL_GPIO_27);
hal_gpio_pull_up(HAL_GPIO_28);
i2c_init.frequency =HAL_I2C_FREQUENCY_100K;
hal_i2c_master_init(HAL_I2C_MASTER_0,&i2c_init);
//设置G_sensor 轮询模式
hal_i2c_master_send_polling(SLAVE_ADDRESS,0X22,&send_data[0],I2C_SEND_DATA_NUMBER);//关闭中断
hal_i2c_master_send_polling(SLAVE_ADDRESS,0X38,&send_data[1],I2C_SEND_DATA_NUMBER);//关闭中断
hal_i2c_master_send_polling(SLAVE_ADDRESS,0X24,&send_data[2],I2C_SEND_DATA_NUMBER);//BOOT
hal_i2c_master_send_polling(SLAVE_ADDRESS,0X20,&send_data[3],I2C_SEND_DATA_NUMBER);//ODR:25HZ
hal_i2c_master_send_polling(SLAVE_ADDRESS,0X21,&send_data[4],I2C_SEND_DATA_NUMBER);//变化G值 开通高通滤波
hal_i2c_master_send_polling(SLAVE_ADDRESS,0X23,&send_data[5],I2C_SEND_DATA_NUMBER);
LOG_I(common, "I2C writesuccessful!");
}
//读取G_sensor数据
voidG_sensor()
{
if(g_sClkCount %50 != 0)
return;
hal_i2c_master_receive_polling(SLAVE_ADDRESS,0x29,&receive_data[0],I2C_SEND_DATA_NUMBER);//X
hal_i2c_master_receive_polling(SLAVE_ADDRESS,0x2a,&receive_data[1],I2C_SEND_DATA_NUMBER);//Y
hal_i2c_master_receive_polling(SLAVE_ADDRESS,0x2c,&receive_data[2],I2C_SEND_DATA_NUMBER);//Z
return ;
}
staticvoid read_i2cTask()
{
portTickType xLastWakeTime = xTaskGetTickCount(); //获取系统时间
for(;;)
{
g_sClkCount++;
// X= receive_data[0]
if(receive_data[0]>20||receive_data[1]>50 || receive_data[2]>80)//设定的检测值20 50 80
{
LOG_E(common, "######G_sensor Data %d",&receive_data[0]);
LOG_E(common, "######G_sensor Data %d",&receive_data[1]);
LOG_E(common, "######G_sensor Data %d",&receive_data[2]);
hal_gpio_set_output(HAL_GPIO_34,1);
vTaskDelay(500 / portTICK_RATE_MS);
hal_gpio_set_output(HAL_GPIO_34,0);
}
else
{
hal_gpio_set_output(HAL_GPIO_34,0);
}
vTaskDelayUntil( &xLastWakeTime, (TASK_DELAY / portTICK_RATE_MS ) ); //整个任务运行周期100ms
}
}
0