/** * @brief * @param None * @retval None */ void LIS302DL_Reset(void) { uint8_t ctrl = 0; LIS302DL_InitTypeDef LIS302DL_InitStruct; LIS302DL_InterruptConfigTypeDef LIS302DL_InterruptStruct; /* Set configuration of LIS302DL*/ LIS302DL_InitStruct.Power_Mode = LIS302DL_LOWPOWERMODE_ACTIVE; LIS302DL_InitStruct.Output_DataRate = LIS302DL_DATARATE_100; LIS302DL_InitStruct.Axes_Enable = LIS302DL_X_ENABLE | LIS302DL_Y_ENABLE | LIS302DL_Z_ENABLE; LIS302DL_InitStruct.Full_Scale = LIS302DL_FULLSCALE_2_3; LIS302DL_InitStruct.Self_Test = LIS302DL_SELFTEST_NORMAL; LIS302DL_Init(&LIS302DL_InitStruct); /* Set configuration of Internal High Pass Filter of LIS302DL*/ LIS302DL_InterruptStruct.Latch_Request = LIS302DL_INTERRUPTREQUEST_LATCHED; LIS302DL_InterruptStruct.SingleClick_Axes = LIS302DL_CLICKINTERRUPT_Z_ENABLE; LIS302DL_InterruptStruct.DoubleClick_Axes = LIS302DL_DOUBLECLICKINTERRUPT_Z_ENABLE; LIS302DL_InterruptConfig(&LIS302DL_InterruptStruct); /* Required delay for the MEMS Accelerometre: Turn-on time = 3/Output data Rate = 3/100 = 30ms */ Delay(30); /* Configure Click Window */ ctrl = 0xC0; LIS302DL_Write(&ctrl, LIS302DL_CLICK_CTRL_REG3_ADDR, 1); }
/** * @brief configure the mems accelometer * @param None * @retval None */ static void Mems_Config(void) { uint8_t ctrl = 0; LIS302DL_InitTypeDef LIS302DL_InitStruct; LIS302DL_InterruptConfigTypeDef LIS302DL_InterruptStruct; /* Set configuration of LIS302DL*/ LIS302DL_InitStruct.Power_Mode = LIS302DL_LOWPOWERMODE_ACTIVE; LIS302DL_InitStruct.Output_DataRate = LIS302DL_DATARATE_100; LIS302DL_InitStruct.Axes_Enable = LIS302DL_X_ENABLE | LIS302DL_Y_ENABLE | LIS302DL_Z_ENABLE; LIS302DL_InitStruct.Full_Scale = LIS302DL_FULLSCALE_2_3; LIS302DL_InitStruct.Self_Test = LIS302DL_SELFTEST_NORMAL; LIS302DL_Init(&LIS302DL_InitStruct); /* Set configuration of Internal High Pass Filter of LIS302DL*/ LIS302DL_InterruptStruct.Latch_Request = LIS302DL_INTERRUPTREQUEST_LATCHED; LIS302DL_InterruptStruct.SingleClick_Axes = LIS302DL_CLICKINTERRUPT_Z_ENABLE; LIS302DL_InterruptStruct.DoubleClick_Axes = LIS302DL_DOUBLECLICKINTERRUPT_Z_ENABLE; LIS302DL_InterruptConfig(&LIS302DL_InterruptStruct); /* Configure Interrupt control register: enable Click interrupt on INT1 and INT2 on Z axis high event */ ctrl = 0x3F; LIS302DL_Write(&ctrl, LIS302DL_CTRL_REG3_ADDR, 1); /* Enable Interrupt generation on click on Z axis */ ctrl = 0x50; LIS302DL_Write(&ctrl, LIS302DL_CLICK_CFG_REG_ADDR, 1); /* Configure Click Threshold on X/Y axis (10 x 0.5g) */ ctrl = 0xAA; LIS302DL_Write(&ctrl, LIS302DL_CLICK_THSY_X_REG_ADDR, 1); /* Configure Click Threshold on Z axis (10 x 0.5g) */ ctrl = 0x0A; LIS302DL_Write(&ctrl, LIS302DL_CLICK_THSZ_REG_ADDR, 1); /* Enable interrupt on Y axis high event */ ctrl = 0x4C; LIS302DL_Write(&ctrl, LIS302DL_FF_WU_CFG1_REG_ADDR, 1); /* Configure Time Limit */ ctrl = 0x03; LIS302DL_Write(&ctrl, LIS302DL_CLICK_TIMELIMIT_REG_ADDR, 1); /* Configure Latency */ ctrl = 0x7F; LIS302DL_Write(&ctrl, LIS302DL_CLICK_LATENCY_REG_ADDR, 1); /* Configure Click Window */ ctrl = 0x7F; LIS302DL_Write(&ctrl, LIS302DL_CLICK_WINDOW_REG_ADDR, 1); }
void prvMEMS_Config(void) { uint8_t ctrl = 0; uint32_t i=0; //simple index for software delay LIS302DL_InitTypeDef LIS302DL_InitStruct; LIS302DL_InterruptConfigTypeDef LIS302DL_InterruptStruct; /* Set configuration of LIS302DL*/ LIS302DL_InitStruct.Power_Mode = LIS302DL_LOWPOWERMODE_ACTIVE; LIS302DL_InitStruct.Output_DataRate = LIS302DL_DATARATE_400; LIS302DL_InitStruct.Axes_Enable = LIS302DL_X_ENABLE | LIS302DL_Y_ENABLE | LIS302DL_Z_ENABLE; LIS302DL_InitStruct.Full_Scale = LIS302DL_FULLSCALE_2_3; LIS302DL_InitStruct.Self_Test = LIS302DL_SELFTEST_NORMAL; LIS302DL_Init(&LIS302DL_InitStruct); /* Set configuration of Internal High Pass Filter of LIS302DL*/ LIS302DL_InterruptStruct.Latch_Request = LIS302DL_INTERRUPTREQUEST_LATCHED; LIS302DL_InterruptStruct.SingleClick_Axes = LIS302DL_CLICKINTERRUPT_Z_ENABLE; LIS302DL_InterruptStruct.DoubleClick_Axes = LIS302DL_DOUBLECLICKINTERRUPT_Z_ENABLE; LIS302DL_InterruptConfig(&LIS302DL_InterruptStruct); /* Required delay for the MEMS Accelerometer: Turn-on time = 3/Output data Rate = 3/100 = 30ms */ for(i=0;i<0x1FFFF;i++); /* Configure Interrupt control register: enable Click interrupt1 */ ctrl = 0x07; LIS302DL_Write(&ctrl, LIS302DL_CTRL_REG3_ADDR, 1); /* Enable Interrupt generation on click/double click on Z axis */ ctrl = 0x70; LIS302DL_Write(&ctrl, LIS302DL_CLICK_CFG_REG_ADDR, 1); /* Configure Click Threshold on X/Y axis (10 x 0.5g) */ ctrl = 0xAA; LIS302DL_Write(&ctrl, LIS302DL_CLICK_THSY_X_REG_ADDR, 1); /* Configure Click Threshold on Z axis (10 x 0.5g) */ ctrl = 0x0A; LIS302DL_Write(&ctrl, LIS302DL_CLICK_THSZ_REG_ADDR, 1); /* Configure Time Limit */ ctrl = 0x03; LIS302DL_Write(&ctrl, LIS302DL_CLICK_TIMELIMIT_REG_ADDR, 1); /* Configure Latency */ ctrl = 0x7F; LIS302DL_Write(&ctrl, LIS302DL_CLICK_LATENCY_REG_ADDR, 1); /* Configure Click Window */ ctrl = 0x7F; LIS302DL_Write(&ctrl, LIS302DL_CLICK_WINDOW_REG_ADDR, 1); }
/** * @brief Set LIS302DL Interrupt configuration * @param None * @retval None */ void LIS302DL_Click_IntConfig(void) { uint8_t ctrl = 0x00; LIS302DL_InterruptConfigTypeDef LIS302DL_InterruptStruct; ACCELERO_IO_ITConfig(); /* Set configuration of Internal High Pass Filter of LIS302DL */ LIS302DL_InterruptStruct.Latch_Request = LIS302DL_INTERRUPTREQUEST_LATCHED; LIS302DL_InterruptStruct.SingleClick_Axes = LIS302DL_CLICKINTERRUPT_Z_ENABLE; LIS302DL_InterruptStruct.DoubleClick_Axes = LIS302DL_DOUBLECLICKINTERRUPT_Z_ENABLE; LIS302DL_InterruptConfig(&LIS302DL_InterruptStruct); /* Configure Interrupt control register: enable Click interrupt on INT1 and INT2 on Z axis high event */ ctrl = 0x3F; ACCELERO_IO_Write(&ctrl, LIS302DL_CTRL_REG3_ADDR, 1); /* Enable Interrupt generation on click on Z axis */ ctrl = 0x50; ACCELERO_IO_Write(&ctrl, LIS302DL_CLICK_CFG_REG_ADDR, 1); /* Configure Click Threshold on X/Y axis (10 x 0.5g) */ ctrl = 0xAA; ACCELERO_IO_Write(&ctrl, LIS302DL_CLICK_THSY_X_REG_ADDR, 1); /* Configure Click Threshold on Z axis (10 x 0.5g) */ ctrl = 0x0A; ACCELERO_IO_Write(&ctrl, LIS302DL_CLICK_THSZ_REG_ADDR, 1); /* Enable interrupt on Y axis high event */ ctrl = 0x4C; ACCELERO_IO_Write(&ctrl, LIS302DL_FF_WU_CFG1_REG_ADDR, 1); /* Configure Time Limit */ ctrl = 0x03; ACCELERO_IO_Write(&ctrl, LIS302DL_CLICK_TIMELIMIT_REG_ADDR, 1); /* Configure Latency */ ctrl = 0x7F; ACCELERO_IO_Write(&ctrl, LIS302DL_CLICK_LATENCY_REG_ADDR, 1); /* Configure Click Window */ ctrl = 0x7F; ACCELERO_IO_Write(&ctrl, LIS302DL_CLICK_WINDOW_REG_ADDR, 1); }
/* Function to initialize the LIS302DL. */ void acc_init(void) { LIS302DL_InitTypeDef LIS302DL_conf; LIS302DL_InterruptConfigTypeDef LIS302DL_InterruptStruct; LIS302DL_conf.Power_Mode = LIS302DL_LOWPOWERMODE_ACTIVE; LIS302DL_conf.Output_DataRate = LIS302DL_DATARATE_100; LIS302DL_conf.Axes_Enable = LIS302DL_XYZ_ENABLE; LIS302DL_conf.Full_Scale = LIS302DL_FULLSCALE_2_3; LIS302DL_conf.Self_Test = LIS302DL_SELFTEST_NORMAL; LIS302DL_Init(&LIS302DL_conf); LIS302DL_InterruptStruct.Latch_Request = LIS302DL_INTERRUPTREQUEST_LATCHED; LIS302DL_InterruptStruct.SingleClick_Axes=LIS302DL_CLICKINTERRUPT_Z_ENABLE; LIS302DL_InterruptStruct.DoubleClick_Axes=LIS302DL_DOUBLECLICKINTERRUPT_XYZ_DISABLE; LIS302DL_InterruptConfig(&LIS302DL_InterruptStruct); interruptEnable(); }
void initMems () { LIS302DL_InitTypeDef init; init.Power_Mode = LIS302DL_LOWPOWERMODE_ACTIVE; /*Mode */ init.Output_DataRate = LIS302DL_DATARATE_100 ; /* OUT data rate 100 Hz*/ init.Axes_Enable = LIS302DL_XYZ_ENABLE; /* Axes enable */ init.Full_Scale = LIS302DL_FULLSCALE_2_3; /* Full scale */ init.Self_Test = LIS302DL_SELFTEST_NORMAL; /* self test */ LIS302DL_Init(&init); LIS302DL_InterruptConfigTypeDef singleClick; singleClick.Latch_Request = LIS302DL_INTERRUPTREQUEST_LATCHED; // Latch interrupt request into CLICK_SRC register singleClick.SingleClick_Axes = LIS302DL_CLICKINTERRUPT_Z_ENABLE; // Single Click Axes Interrupts singleClick.DoubleClick_Axes = LIS302DL_DOUBLECLICKINTERRUPT_XYZ_DISABLE; // Double Click Axes Interrupts LIS302DL_InterruptConfig(&singleClick); }
/** * @brief Configures and initializes the accelerometer. * * @note This method configures and initializes the accelerometer. Power * mode is set to active, data rate to 100, all axes are enabled, * full scale is set to 2_3, and self test is set to normal. */ void ACCEL_Config(void){ LIS302DL_InitTypeDef LIS302DL_InitStructure; LIS302DL_InterruptConfigTypeDef LIS302DL_InterruptStruct; //These four parts are what make up the structure. //Defined in the driver. //Power_Mode can either be LIS302DL_LOWPOWERMODE_ACTIVE or //LIS302DL_LOWPOWERMODE_POWERDOWN. Active seems to be the obvious choice LIS302DL_InitStructure.Power_Mode = LIS302DL_LOWPOWERMODE_ACTIVE; //Data rate is either 100Hz or 400Hz. As we're only polling at //25Hz, the slower rate is fine. LIS302DL_InitStructure.Output_DataRate = LIS302DL_DATARATE_100; //Enable all the axes. Obvious choice LIS302DL_InitStructure.Axes_Enable = LIS302DL_XYZ_ENABLE; //Either 2_3 or 9_2. 2_3 (0x00) seems to be a scale capable of +-2g. This //is appropriate because we are going to be measuring a stable tilt LIS302DL_InitStructure.Full_Scale = LIS302DL_FULLSCALE_2_3; //SELFTEST_NORMAL = 0x00. This means that the self test mode is off. //Self test applies a known force (electromagnetic) to the sensor //so that the user can ensure it's working properly. This should be off. LIS302DL_InitStructure.Self_Test = LIS302DL_SELFTEST_NORMAL; LIS302DL_Init(&LIS302DL_InitStructure); //Enable single taps on the Z axis LIS302DL_InterruptStruct.SingleClick_Axes = LIS302DL_CLICKINTERRUPT_Z_ENABLE; //Disable double taps LIS302DL_InterruptStruct.DoubleClick_Axes = LIS302DL_DOUBLECLICKINTERRUPT_XYZ_DISABLE; //Interrupt will latch to high until LIS302DL_CLICK_SRC_REG_ADDR is read. LIS302DL_InterruptStruct.Latch_Request = LIS302DL_INTERRUPTREQUEST_LATCHED; LIS302DL_InterruptConfig(&LIS302DL_InterruptStruct); Accel_Interrupt_Config(); Filter_Configuration(&Filter_Structure_X); Filter_Configuration(&Filter_Structure_Y); Filter_Configuration(&Filter_Structure_Z); }
/** * @brief Main program * @param None * @retval None */ int main(void) { USART3_Config(); uint8_t ctrl = 0; LIS302DL_InitTypeDef LIS302DL_InitStruct; LIS302DL_InterruptConfigTypeDef LIS302DL_InterruptStruct; /* SysTick end of count event each 10ms */ SysTick_Config(SystemCoreClock/ 100); /* Set configuration of LIS302DL*/ LIS302DL_InitStruct.Power_Mode = LIS302DL_LOWPOWERMODE_ACTIVE; LIS302DL_InitStruct.Output_DataRate = LIS302DL_DATARATE_100; LIS302DL_InitStruct.Axes_Enable = LIS302DL_X_ENABLE | LIS302DL_Y_ENABLE | LIS302DL_Z_ENABLE; LIS302DL_InitStruct.Full_Scale = LIS302DL_FULLSCALE_2_3; LIS302DL_InitStruct.Self_Test = LIS302DL_SELFTEST_NORMAL; LIS302DL_Init(&LIS302DL_InitStruct); /* Set configuration of Internal High Pass Filter of LIS302DL*/ LIS302DL_InterruptStruct.Latch_Request = LIS302DL_INTERRUPTREQUEST_LATCHED; LIS302DL_InterruptStruct.SingleClick_Axes = LIS302DL_CLICKINTERRUPT_Z_ENABLE; LIS302DL_InterruptStruct.DoubleClick_Axes = LIS302DL_DOUBLECLICKINTERRUPT_Z_ENABLE; LIS302DL_InterruptConfig(&LIS302DL_InterruptStruct); /* Required delay for the MEMS Accelerometre: Turn-on time = 3/Output data Rate = 3/100 = 30ms */ Delay(30); /* Configure Interrupt control register: enable Click interrupt1 */ ctrl = 0x07; LIS302DL_Write(&ctrl, LIS302DL_CTRL_REG3_ADDR, 1); /* Enable Interrupt generation on click/double click on Z axis */ ctrl = 0x70; LIS302DL_Write(&ctrl, LIS302DL_CLICK_CFG_REG_ADDR, 1); /* Configure Click Threshold on X/Y axis (10 x 0.5g) */ ctrl = 0xAA; LIS302DL_Write(&ctrl, LIS302DL_CLICK_THSY_X_REG_ADDR, 1); /* Configure Click Threshold on Z axis (10 x 0.5g) */ ctrl = 0x0A; LIS302DL_Write(&ctrl, LIS302DL_CLICK_THSZ_REG_ADDR, 1); /* Configure Time Limit */ ctrl = 0x03; LIS302DL_Write(&ctrl, LIS302DL_CLICK_TIMELIMIT_REG_ADDR, 1); /* Configure Latency */ ctrl = 0x7F; LIS302DL_Write(&ctrl, LIS302DL_CLICK_LATENCY_REG_ADDR, 1); /* Configure Click Window */ ctrl = 0x7F; LIS302DL_Write(&ctrl, LIS302DL_CLICK_WINDOW_REG_ADDR, 1); /* TIM configuration -------------------------------------------------------*/ TIM_Config(); LIS302DL_Read(Buffer, LIS302DL_OUT_X_ADDR, 6); XOffset = (int8_t)Buffer[0]; YOffset = (int8_t)Buffer[2]; ZOffset = (int8_t)Buffer[4]; while(1) { a=(int8_t)(Buffer[0]); if(a<0){ a=-a; printf("\r\n X = -%d \r\n", a); } else{ printf("\r\n X = %d \r\n", a); } //printf("\r\n Y =%d \r\n", (int8_t)Buffer[2]); //printf("\r\n Z =%d \r\n", (int8_t)Buffer[4]); /* temp=XOffset/sqrt((YOffset*YOffset+ZOffset*ZOffset)); angle_x=atan(temp); angle_x=((angle_x*180)/3.14); temp1=(int16_t)angle_x; temp2=(angle_x-temp1)*1000; printf("\r\n Angle_X=%d.%d \r\n", temp1,temp2);//use sqrt & atan //原子教你玩的方法*/ /* angle_ax=(XOffset-1100)/64; angle_ax=(angle_ax*1.2*180/3.14); temp1=(int16_t)angle_ax; temp2=(angle_ax-temp1)*1000; if(temp1<0){ a=-temp1; b=-temp2; printf("\r\n Angle_ax=%d.%d \r\n",a,b); } //網路上的方法*/ b=(float)((int8_t)Buffer[0]-XOffset)*(int32_t)LIS302DL_SENSITIVITY_2_3G/1000*180/3.14; if(b<0){ x_acc=-b; temp1=(int8_t)x_acc; temp2=(x_acc-temp1)*10000; if(temp2<0){temp2=-temp2;} printf("\r\n X_Acc= -%d.%d \r\n", temp1,temp2); } else{ x_acc=b; temp1=(int8_t)x_acc; temp2=(x_acc-temp1)*10000; if(temp2<0){temp2=-temp2;} printf("\r\n X_Acc= %d.%d \r\n", temp1,temp2); } //openbox Delay(100); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { USART3_Config(); //USART3 init uint8_t ctrl = 0; LIS302DL_InitTypeDef LIS302DL_InitStruct; LIS302DL_InterruptConfigTypeDef LIS302DL_InterruptStruct; /* SysTick end of count event each 10ms */ SysTick_Config(SystemCoreClock/ 100); /* Set configuration of LIS302DL*/ LIS302DL_InitStruct.Power_Mode = LIS302DL_LOWPOWERMODE_ACTIVE; LIS302DL_InitStruct.Output_DataRate = LIS302DL_DATARATE_100; LIS302DL_InitStruct.Axes_Enable = LIS302DL_X_ENABLE | LIS302DL_Y_ENABLE | LIS302DL_Z_ENABLE; LIS302DL_InitStruct.Full_Scale = LIS302DL_FULLSCALE_2_3; LIS302DL_InitStruct.Self_Test = LIS302DL_SELFTEST_NORMAL; LIS302DL_Init(&LIS302DL_InitStruct); /* Set configuration of Internal High Pass Filter of LIS302DL*/ LIS302DL_InterruptStruct.Latch_Request = LIS302DL_INTERRUPTREQUEST_LATCHED; LIS302DL_InterruptStruct.SingleClick_Axes = LIS302DL_CLICKINTERRUPT_Z_ENABLE; LIS302DL_InterruptStruct.DoubleClick_Axes = LIS302DL_DOUBLECLICKINTERRUPT_Z_ENABLE; LIS302DL_InterruptConfig(&LIS302DL_InterruptStruct); /* Required delay for the MEMS Accelerometre: Turn-on time = 3/Output data Rate = 3/100 = 30ms */ Delay(30); /* Configure Interrupt control register: enable Click interrupt1 */ ctrl = 0x07; LIS302DL_Write(&ctrl, LIS302DL_CTRL_REG3_ADDR, 1); /* Enable Interrupt generation on click/double click on Z axis */ ctrl = 0x70; LIS302DL_Write(&ctrl, LIS302DL_CLICK_CFG_REG_ADDR, 1); /* Configure Click Threshold on X/Y axis (10 x 0.5g) */ ctrl = 0xAA; LIS302DL_Write(&ctrl, LIS302DL_CLICK_THSY_X_REG_ADDR, 1); /* Configure Click Threshold on Z axis (10 x 0.5g) */ ctrl = 0x0A; LIS302DL_Write(&ctrl, LIS302DL_CLICK_THSZ_REG_ADDR, 1); /* Configure Time Limit */ ctrl = 0x03; LIS302DL_Write(&ctrl, LIS302DL_CLICK_TIMELIMIT_REG_ADDR, 1); /* Configure Latency */ ctrl = 0x7F; LIS302DL_Write(&ctrl, LIS302DL_CLICK_LATENCY_REG_ADDR, 1); /* Configure Click Window */ ctrl = 0x7F; LIS302DL_Write(&ctrl, LIS302DL_CLICK_WINDOW_REG_ADDR, 1); /* TIM configuration -------------------------------------------------------*/ TIM_Config(); LIS302DL_Read(Buffer, LIS302DL_OUT_X_ADDR, 6); XOffset = (int8_t)Buffer[0]; YOffset = (int8_t)Buffer[2]; ZOffset = (int8_t)Buffer[4]; while(1) { b=(float)((int8_t)Buffer[0]-XOffset)*(int32_t)LIS302DL_SENSITIVITY_2_3G/1000*180/3.14; //把X軸裡面的值轉換成角度 if(b<0){ x_acc=-b; temp1=(int8_t)x_acc; temp2=(x_acc-temp1)*10000; //把小數點部分乘上10000,以便程式印出(usart3的printf功能無法印出float) if(temp2<0){temp2=-temp2;} printf("\r\n X_Acc= -%d.%d \r\n", temp1,temp2); } else{ x_acc=b; temp1=(int8_t)x_acc; temp2=(x_acc-temp1)*10000; if(temp2<0){temp2=-temp2;} printf("\r\n X_Acc= %d.%d \r\n", temp1,temp2); } Delay(100); } }
int main(void) { SystemInit(); SystemCoreClockUpdate(); // inicjalizacja dystrybucji czasu procesora /* Enable the SPI periph */ RCC_APB2PeriphClockCmd(LIS302DL_SPI_CLK, ENABLE); /* Enable SCK, MOSI and MISO GPIO clocks */ RCC_AHB1PeriphClockCmd(LIS302DL_SPI_SCK_GPIO_CLK | LIS302DL_SPI_MISO_GPIO_CLK | LIS302DL_SPI_MOSI_GPIO_CLK, ENABLE); /* Enable CS GPIO clock */ RCC_AHB1PeriphClockCmd(LIS302DL_SPI_CS_GPIO_CLK, ENABLE); /* Enable INT1 GPIO clock */ RCC_AHB1PeriphClockCmd(LIS302DL_SPI_INT1_GPIO_CLK, ENABLE); /* Enable INT2 GPIO clock */ RCC_AHB1PeriphClockCmd(LIS302DL_SPI_INT2_GPIO_CLK, ENABLE); GPIO_PinAFConfig(LIS302DL_SPI_SCK_GPIO_PORT, LIS302DL_SPI_SCK_SOURCE, LIS302DL_SPI_SCK_AF); GPIO_PinAFConfig(LIS302DL_SPI_MISO_GPIO_PORT, LIS302DL_SPI_MISO_SOURCE, LIS302DL_SPI_MISO_AF); GPIO_PinAFConfig(LIS302DL_SPI_MOSI_GPIO_PORT, LIS302DL_SPI_MOSI_SOURCE, LIS302DL_SPI_MOSI_AF); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* SPI SCK pin configuration */ GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_SCK_PIN; GPIO_Init(LIS302DL_SPI_SCK_GPIO_PORT, &GPIO_InitStructure); /* SPI MOSI pin configuration */ GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_MOSI_PIN; GPIO_Init(LIS302DL_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure); /* SPI MISO pin configuration */ GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_MISO_PIN; GPIO_Init(LIS302DL_SPI_MISO_GPIO_PORT, &GPIO_InitStructure); /* SPI configuration -------------------------------------------------------*/ SPI_InitTypeDef SPI_InitStructure; SPI_I2S_DeInit(LIS302DL_SPI); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_Init(LIS302DL_SPI, &SPI_InitStructure); /* Enable SPI1 */ SPI_Cmd(LIS302DL_SPI, ENABLE); /* Configure GPIO PIN for Lis Chip select */ GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_CS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LIS302DL_SPI_CS_GPIO_PORT, &GPIO_InitStructure); /* Deselect : Chip Select high */ GPIO_SetBits(LIS302DL_SPI_CS_GPIO_PORT, LIS302DL_SPI_CS_PIN); /* Configure GPIO PINs to detect Interrupts */ GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_INT1_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(LIS302DL_SPI_INT1_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LIS302DL_SPI_INT2_PIN; GPIO_Init(LIS302DL_SPI_INT2_GPIO_PORT, &GPIO_InitStructure); LIS302DL_InitTypeDef LIS302DL_InitStruct; uint8_t ctrl = 0x00; /* Set configuration of LIS302DL*/ LIS302DL_InitStruct.Power_Mode = LIS302DL_LOWPOWERMODE_ACTIVE; LIS302DL_InitStruct.Output_DataRate = LIS302DL_DATARATE_100; LIS302DL_InitStruct.Axes_Enable = LIS302DL_X_ENABLE | LIS302DL_Y_ENABLE | LIS302DL_Z_ENABLE; LIS302DL_InitStruct.Full_Scale = LIS302DL_FULLSCALE_2_3; LIS302DL_InitStruct.Self_Test = LIS302DL_SELFTEST_NORMAL; LIS302DL_Init(&LIS302DL_InitStruct); LIS302DL_InterruptConfigTypeDef LIS302DL_InterruptStruct; /* Set configuration of Internal High Pass Filter of LIS302DL*/ LIS302DL_InterruptStruct.Latch_Request = LIS302DL_INTERRUPTREQUEST_LATCHED; LIS302DL_InterruptStruct.SingleClick_Axes = LIS302DL_CLICKINTERRUPT_Z_ENABLE; LIS302DL_InterruptStruct.DoubleClick_Axes = LIS302DL_DOUBLECLICKINTERRUPT_Z_ENABLE; LIS302DL_InterruptConfig(&LIS302DL_InterruptStruct); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOA, ENABLE); /* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure); STM32F4_Discovery_LEDInit(LED3); STM32F4_Discovery_LEDInit(LED4); STM32F4_Discovery_LEDInit(LED5); STM32F4_Discovery_LEDInit(LED6); STM32F4_Discovery_PBInit(BUTTON_USER, BUTTON_MODE_GPIO); STM32F4_Discovery_LEDOn(LED3); Delay(0xFFFF); STM32F4_Discovery_LEDOff(LED3); USBD_Init(&USB_OTG_dev, #ifdef USE_USB_OTG_HS USB_OTG_HS_CORE_ID, #else USB_OTG_FS_CORE_ID, #endif &USR_desc, &USBD_HID_cb, &USR_cb); //char button=0; while (1) { Delay(0xFF); if (OutBuffer[0]&1) STM32F4_Discovery_LEDOn(LED3); else STM32F4_Discovery_LEDOff(LED3); if (OutBuffer[0]&2) STM32F4_Discovery_LEDOn(LED4); else STM32F4_Discovery_LEDOff(LED4); if (OutBuffer[0]&4) STM32F4_Discovery_LEDOn(LED5); else STM32F4_Discovery_LEDOff(LED5); if (OutBuffer[0]&8) STM32F4_Discovery_LEDOn(LED6); else STM32F4_Discovery_LEDOff(LED6); //if ((STM32F4_Discovery_PBGetState(BUTTON_USER) == Bit_SET)&&(button==0)) // { // int i=0; Delay(0xFF); InBuffer[0] = przyspieszenie_x; InBuffer[1] = przyspieszenie_y; USBD_HID_SendReport (&USB_OTG_dev, InBuffer, 64); // } // button = STM32F4_Discovery_PBGetState(BUTTON_USER); LIS302DL_Read(&przyspieszenie_x, LIS302DL_OUT_X_ADDR, 1); if(przyspieszenie_x>127) { przyspieszenie_x=przyspieszenie_x-1; przyspieszenie_x=(~przyspieszenie_x)&0xFF; przyspieszenie_x=-przyspieszenie_x; } LIS302DL_Read(&przyspieszenie_y, LIS302DL_OUT_Y_ADDR, 1); if(przyspieszenie_y>127) { przyspieszenie_y=przyspieszenie_y-1; przyspieszenie_y=(~przyspieszenie_y)&0xFF; przyspieszenie_y=-przyspieszenie_y; } /*LIS302DL_Read(&przyspieszenie_z, LIS302DL_OUT_Z_ADDR, 1); if(przyspieszenie_z>127) { przyspieszenie_z=przyspieszenie_z-1; przyspieszenie_z=(~przyspieszenie_z)&0xFF; przyspieszenie_z=-przyspieszenie_z; }*/ } }