selftest.c
808 lines
| 25.6 KiB
| text/x-c
|
CLexer
jeandet@PC-DE-JEANDET.lpp.polytechnique.fr
|
r14 | /** | ||
****************************************************************************** | ||||
* @file selftest.c | ||||
* @author MCD Application Team | ||||
* @version V1.0.0 | ||||
* @date 19-September-2011 | ||||
* @brief This file provides the hardware tests | ||||
****************************************************************************** | ||||
* @attention | ||||
* | ||||
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS | ||||
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE | ||||
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY | ||||
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING | ||||
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE | ||||
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. | ||||
* | ||||
* <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2> | ||||
*/ | ||||
/* Includes ------------------------------------------------------------------*/ | ||||
#include "selftest.h" | ||||
//Library config for this project!!!!!!!!!!! | ||||
#include "stm32f4xx_conf.h" | ||||
/* Private typedef -----------------------------------------------------------*/ | ||||
/* Private define ------------------------------------------------------------*/ | ||||
#define MEMS_PASSCONDITION 15 | ||||
/* Private macro -------------------------------------------------------------*/ | ||||
/* Private variables ---------------------------------------------------------*/ | ||||
/* Init Structure definition */ | ||||
RCC_ClocksTypeDef RCC_Clocks; | ||||
ADC_InitTypeDef ADC_InitStructure; | ||||
ADC_CommonInitTypeDef ADC_CommonInitStructure; | ||||
__IO uint16_t ConvData1, ConvData2; | ||||
__IO uint16_t counter0 = 0, counter1 = 0, Idx = 0; | ||||
uint8_t ADC_Channel[2] = {ADC_Channel_2, ADC_Channel_3}; | ||||
uint8_t DACTest = 0; | ||||
uint8_t GPIO_Pin [2] = {GPIO_Pin_2, GPIO_Pin_3}; | ||||
uint16_t count = 0, count1 = 24, Left_Right = 0; | ||||
const int16_t sinebuf[48] = {0, 4276, 8480, 12539, 16383, 19947, 23169, 25995, | ||||
28377, 30272, 31650, 32486, 32767, 32486, 31650, 30272, | ||||
28377, 25995, 23169, 19947, 16383, 12539, 8480, 4276, | ||||
0, -4276, -8480, -12539, -16383, -19947, -23169, -25995, | ||||
-28377, -30272, -31650, -32486, -32767, -32486, -31650, -30272, | ||||
-28377, -25995, -23169, -19947, -16383, -12539, -8480, -4276 | ||||
}; | ||||
extern __IO uint32_t TimingDelay; | ||||
extern LIS302DL_InitTypeDef LIS302DL_InitStruct; | ||||
extern LIS302DL_FilterConfigTypeDef LIS302DL_FilterStruct; | ||||
extern __IO int8_t X_Offset, Y_Offset, Z_Offset; | ||||
extern uint8_t Buffer[6]; | ||||
/* Private function prototypes -----------------------------------------------*/ | ||||
/* Private functions ---------------------------------------------------------*/ | ||||
/** | ||||
* @brief Test MEMS Hardware. | ||||
* The main objectif of this test is to check the hardware connection of the | ||||
* MEMS peripheral. | ||||
* @param None | ||||
* @retval None | ||||
*/ | ||||
void Accelerometer_MEMS_Test(void) | ||||
{ | ||||
uint8_t temp, memsteststatus = 0x00; | ||||
uint8_t xdata, ydata = 0; | ||||
/* MEMS configuration ------------------------------------------------------*/ | ||||
/* 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_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_FilterStruct.HighPassFilter_Data_Selection = LIS302DL_FILTEREDDATASELECTION_OUTPUTREGISTER; | ||||
LIS302DL_FilterStruct.HighPassFilter_CutOff_Frequency = LIS302DL_HIGHPASSFILTER_LEVEL_1; | ||||
LIS302DL_FilterStruct.HighPassFilter_Interrupt = LIS302DL_HIGHPASSFILTERINTERRUPT_1_2; | ||||
LIS302DL_FilterConfig(&LIS302DL_FilterStruct);*/ | ||||
/* Required delay for the MEMS Accelerometre: Turn-on time = 3/Output data Rate | ||||
= 3/100 = 30ms */ | ||||
Delay(30); | ||||
/* Read WHO_AM_I register */ | ||||
//LIS302DL_Read(&temp, LIS302DL_WHO_AM_I_ADDR, 1); | ||||
/* Check device identification register, this register should contains | ||||
the device identifier that for LIS302DL is set to 0x3B */ | ||||
if (temp != 0x3B) | ||||
{ | ||||
Fail_Handler(); | ||||
} | ||||
TimingDelay = 500; | ||||
/* Wait until detecting all MEMS direction or timeout */ | ||||
while((memsteststatus == 0x00)&&(TimingDelay != 0x00)) | ||||
{ | ||||
//LIS302DL_Read(Buffer, LIS302DL_OUT_X_ADDR, 4); | ||||
xdata = ABS((int8_t)(Buffer[0])); | ||||
ydata = ABS((int8_t)(Buffer[2])); | ||||
/* Check test PASS condition */ | ||||
if ((xdata > MEMS_PASSCONDITION) || (ydata > MEMS_PASSCONDITION)) | ||||
{ | ||||
/* MEMS Test PASS */ | ||||
memsteststatus = 0x01; | ||||
} | ||||
} | ||||
/* MEMS test status: PASS */ | ||||
if(memsteststatus != 0x00) | ||||
{ | ||||
/* Turn Green LED ON: signaling MEMS Test PASS */ | ||||
STM_EVAL_LEDOn(LED4); | ||||
/* Waiting User Button is pressed */ | ||||
while (STM_EVAL_PBGetState(BUTTON_USER) == Bit_RESET) | ||||
{} | ||||
/* Waiting User Button is Released */ | ||||
while (STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET) | ||||
{} | ||||
/* Turn Green LED OFF: signaling the end of MEMS Test and switching to | ||||
the next Sub Test */ | ||||
STM_EVAL_LEDOff(LED4); | ||||
} | ||||
/* MEMS test status: Timeout occurs */ | ||||
else | ||||
{ | ||||
Fail_Handler(); | ||||
} | ||||
} | ||||
/** | ||||
* @brief Test USB Hardware. | ||||
* The main objectif of this test is to check the hardware connection of the | ||||
* Audio and USB peripheral. | ||||
* @param None | ||||
* @retval None | ||||
*/ | ||||
void USB_Test(void) | ||||
{ | ||||
GPIO_InitTypeDef GPIO_InitStructure; | ||||
/******************************** USB Test **********************************/ | ||||
/*----------------- Part1: without cables connected ------------------------*/ | ||||
/* GPIOA, GPIOC and GPIOD clock enable */ | ||||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | \ | ||||
RCC_AHB1Periph_GPIOD, ENABLE); | ||||
/* GPIOD Configuration: Pins 5 in output push-pull */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOD, &GPIO_InitStructure); | ||||
/* Turn LED8 ON using PD5 */ | ||||
GPIO_ResetBits(GPIOD, GPIO_Pin_5); | ||||
/* GPIOC Configuration: Pin 0 in output push-pull */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOC, &GPIO_InitStructure); | ||||
/* GPIOA Configuration: Pin 9 in input pull-up */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
/* Turn LED7 ON using PC0 (5v) */ | ||||
GPIO_ResetBits(GPIOC, GPIO_Pin_0); | ||||
/* Waiting delay 10ms */ | ||||
Delay(1); | ||||
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9) == Bit_RESET) | ||||
{ | ||||
Fail_Handler(); | ||||
} | ||||
/* GPIOA Configuration: Pins 10 in output push-pull */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
/* Waiting delay 10ms */ | ||||
Delay(1); | ||||
/* Check the ID level without cable connected */ | ||||
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10) == Bit_RESET) | ||||
{ | ||||
Fail_Handler(); | ||||
} | ||||
/* Turn LED7 OFF using PC0 */ | ||||
GPIO_SetBits(GPIOC, GPIO_Pin_0); | ||||
/* GPIOA Configuration: Pins 11, 12 in input pull-up */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
/* GPIOA Configuration: Pin 9 in output push-pull */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
GPIO_ResetBits(GPIOA, GPIO_Pin_9); | ||||
/* Waiting delay 10ms */ | ||||
Delay(1); | ||||
/* Check PA11 and PA12 level without cable connected */ | ||||
if ((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) == Bit_RESET) || \ | ||||
(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12) == Bit_RESET)) | ||||
{ | ||||
Fail_Handler(); | ||||
} | ||||
/* GPIOA Configuration: Pins 12 in input pull-up */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
/* GPIOA Configuration: Pin 11 in output push-pull */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
GPIO_ResetBits(GPIOA, GPIO_Pin_11); | ||||
/* Waiting delay 10ms */ | ||||
Delay(1); | ||||
/* Check PA12 level without cable connected */ | ||||
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12) == Bit_RESET) | ||||
{ | ||||
Fail_Handler(); | ||||
} | ||||
/* GPIOA Configuration: Pins 11 in input pull-up */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
/* GPIOA Configuration: Pin 12 in output push-pull */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
GPIO_ResetBits(GPIOA, GPIO_Pin_12); | ||||
/* Waiting delay 10ms */ | ||||
Delay(1); | ||||
/* Check PA12 level without cable connected */ | ||||
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) == Bit_RESET) | ||||
{ | ||||
Fail_Handler(); | ||||
} | ||||
/* GPIOA Configuration: Pins 9 in output push-pull */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
/* Turn LED7 ON using PA9 */ | ||||
GPIO_SetBits(GPIOA, GPIO_Pin_9); | ||||
/* Turn Green LED ON: signaling Audio USB Test part1 PASS */ | ||||
STM_EVAL_LEDOn(LED4); | ||||
/* Waiting User Button is pressed */ | ||||
while (STM_EVAL_PBGetState(BUTTON_USER) == Bit_RESET) | ||||
{} | ||||
/* Waiting User Button is Released */ | ||||
while (STM_EVAL_PBGetState(BUTTON_USER) != Bit_RESET) | ||||
{} | ||||
/* Turn Green LED OFF: signaling the end of Audio USB Test part1 and switching to | ||||
the part2 */ | ||||
STM_EVAL_LEDOff(LED4); | ||||
/* Turn LED7 OFF using PA9 */ | ||||
GPIO_ResetBits(GPIOA, GPIO_Pin_9); | ||||
/* Turn LED8 OFF using PD5 */ | ||||
GPIO_SetBits(GPIOD, GPIO_Pin_5); | ||||
/*--------------- Part2: with Audio USB cables connected ------------------*/ | ||||
/*********************************** USB Test *******************************/ | ||||
/* Check the ID level with cable connected */ | ||||
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10) != Bit_RESET) | ||||
{ | ||||
Fail_Handler(); | ||||
} | ||||
/* GPIOA Configuration: Pins 11, 12 in input pull-down */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
/* GPIOA Configuration: Pin 9 in output push-pull */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
GPIO_SetBits(GPIOA, GPIO_Pin_9); | ||||
/* Waiting delay 10ms */ | ||||
Delay(1); | ||||
/* Check PA11 and PA12 level with cable connected */ | ||||
if ((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) == Bit_RESET) || \ | ||||
(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12) == Bit_RESET)) | ||||
{ | ||||
Fail_Handler(); | ||||
} | ||||
/* GPIOA Configuration: Pins 9, 12 in input pull-down */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_12; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
/* GPIOA Configuration: Pin 11 in output push-pull */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
GPIO_SetBits(GPIOA, GPIO_Pin_11); | ||||
/* Waiting delay 10ms */ | ||||
Delay(1); | ||||
/* Check PA9 and PA12 level with cable connected */ | ||||
if ((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9) == Bit_RESET)|| \ | ||||
(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12) == Bit_RESET)) | ||||
{ | ||||
Fail_Handler(); | ||||
} | ||||
/* GPIOA Configuration: Pins 9, 11 in input pull-down */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_11; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
/* GPIOA Configuration: Pin 12 in output push-pull */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
GPIO_SetBits(GPIOA, GPIO_Pin_12); | ||||
/* Waiting delay 10ms */ | ||||
Delay(1); | ||||
/* Check PA9 and PA12 level with cable connected */ | ||||
if ((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_9) == Bit_RESET)|| \ | ||||
(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) == Bit_RESET)) | ||||
{ | ||||
Fail_Handler(); | ||||
} | ||||
/* GPIOA Configuration: Pins 11, 12 in input pull-down */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
/* GPIOA Configuration: Pin 9 in output push-pull */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
/* Turn LED7 OFF using PA9 */ | ||||
GPIO_ResetBits(GPIOA, GPIO_Pin_9); | ||||
} | ||||
/** | ||||
* @brief Test Audio Hardware. | ||||
* The main objectif of this test is to check the hardware connection of the | ||||
* Audio peripheral. | ||||
* @param None | ||||
* @retval None | ||||
*/ | ||||
void Audio_Test(void) | ||||
{ | ||||
GPIO_InitTypeDef GPIO_InitStructure; | ||||
uint8_t audioteststatus = 0x00; | ||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); | ||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE); | ||||
/* Set the current audio interface: I2S or DAC */ | ||||
// EVAL_AUDIO_SetAudioInterface(AUDIO_INTERFACE_I2S); | ||||
/* Initialize the Audio codec and all related peripherals (I2S, I2C, IOs...) */ | ||||
/*if (EVAL_AUDIO_Init(OUTPUT_DEVICE_HEADPHONE, 87, I2S_AudioFreq_48k) !=0) | ||||
{ | ||||
Fail_Handler(); | ||||
}*/ | ||||
/* I2S code to be exectued under the I2S interrupt */ | ||||
DACTest = 0; | ||||
/* ADC Common Init */ | ||||
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; | ||||
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8; | ||||
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; | ||||
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles; | ||||
ADC_CommonInit(&ADC_CommonInitStructure); | ||||
/* ADC peripherals Init */ | ||||
ADC_StructInit(&ADC_InitStructure); | ||||
ADC_InitStructure.ADC_Resolution = ADC_Resolution_8b; | ||||
ADC_InitStructure.ADC_ScanConvMode = DISABLE; | ||||
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; | ||||
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; | ||||
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; | ||||
ADC_InitStructure.ADC_NbrOfConversion = 1; | ||||
ADC_Init(ADC1, &ADC_InitStructure); | ||||
ADC_Init(ADC2, &ADC_InitStructure); | ||||
/* Configure ADC Channels pin as analog input */ | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ; | ||||
GPIO_Init(GPIOA, &GPIO_InitStructure); | ||||
counter1 = 0; | ||||
counter0 = 0; | ||||
audioteststatus = 0; | ||||
/* ADCperipheral[PerIdx] Regular Channel Config */ | ||||
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_56Cycles); | ||||
/* ADCperipheral[PerIdx] Regular Channel Config */ | ||||
ADC_RegularChannelConfig(ADC2, ADC_Channel_3, 1, ADC_SampleTime_56Cycles); | ||||
/* Enable ADC1 */ | ||||
ADC_Cmd(ADC1, ENABLE); | ||||
ADC_Cmd(ADC2, ENABLE); | ||||
TimingDelay = 500; | ||||
/* Wait until detecting 500 data*/ | ||||
while((audioteststatus == 0)&&(TimingDelay != 0)) | ||||
{ | ||||
ADC_SoftwareStartConv(ADC1); | ||||
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); | ||||
ConvData1 = ADC_GetConversionValue(ADC1); | ||||
ADC_SoftwareStartConv(ADC2); | ||||
while(ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC) == RESET); | ||||
ConvData2 = ADC_GetConversionValue(ADC2); | ||||
/* 1.75V equals to 150 */ | ||||
if ((ConvData1 > 150) && (ConvData2 < 10) && (counter1 != 500)) | ||||
{ | ||||
counter1 ++; | ||||
} | ||||
if ((ConvData1 < 10) && (ConvData2 > 150) && (counter0 != 500)) | ||||
{ | ||||
counter0 ++; | ||||
} | ||||
if((counter1 == 500) && (counter0 == 500)) | ||||
{ | ||||
audioteststatus = 1; | ||||
} | ||||
} | ||||
/* Disable ADC Peripherals */ | ||||
ADC_Cmd(ADC1, DISABLE); | ||||
ADC_Cmd(ADC2, DISABLE); | ||||
/* Audio test status: FAIL */ | ||||
if(audioteststatus == 0) | ||||
{ | ||||
Fail_Handler(); | ||||
} | ||||
/*EVAL_AUDIO_DeInit(); | ||||
EVAL_AUDIO_SetAudioInterface(AUDIO_INTERFACE_DAC);*/ | ||||
/* Initialize the Audio codec and all related peripherals (I2S, I2C, IOs...) */ | ||||
/* if (EVAL_AUDIO_Init(OUTPUT_DEVICE_HEADPHONE, 100, I2S_AudioFreq_48k) !=0) | ||||
{ | ||||
Fail_Handler(); | ||||
}*/ | ||||
/* DAC code to be exectued under the I2S interrupt */ | ||||
DACTest = 1; | ||||
counter1 = 0; | ||||
counter0 = 0; | ||||
audioteststatus = 0; | ||||
/* Enable ADC1 */ | ||||
ADC_Cmd(ADC1, ENABLE); | ||||
ADC_Cmd(ADC2, ENABLE); | ||||
TimingDelay = 500; | ||||
/* Wait until detecting 50 data*/ | ||||
while((audioteststatus == 0)&&(TimingDelay != 0)) | ||||
{ | ||||
ADC_SoftwareStartConv(ADC1); | ||||
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); | ||||
ConvData1 = ADC_GetConversionValue(ADC1); | ||||
ADC_SoftwareStartConv(ADC2); | ||||
while(ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC) == RESET); | ||||
ConvData2 = ADC_GetConversionValue(ADC2); | ||||
/* 2.0V equals to 170 */ | ||||
if ((ConvData1 > 170) && (ConvData2 > 170) &&(counter1 != 500)) | ||||
{ | ||||
counter1 ++; | ||||
} | ||||
if ((ConvData1 < 10) && (ConvData2 < 10) && (counter0 != 500)) | ||||
{ | ||||
counter0 ++; | ||||
} | ||||
if((counter1 == 500) && (counter0 == 500)) | ||||
{ | ||||
audioteststatus = 1; | ||||
} | ||||
} | ||||
/* Audio test status: FAIL */ | ||||
if(audioteststatus == 0x00) | ||||
{ | ||||
Fail_Handler(); | ||||
} | ||||
/* Turn Green LED ON: signaling Audio USB Test part2 PASS */ | ||||
STM_EVAL_LEDOn(LED4); | ||||
/* Waiting User_Button pressed */ | ||||
while (STM_EVAL_PBGetState(BUTTON_USER) == Bit_RESET) | ||||
{} | ||||
/* Turn Green LED OFF: signaling the end of Audio USB Test part2 */ | ||||
STM_EVAL_LEDOff(LED4); | ||||
} | ||||
/** | ||||
* @brief Test Micophone MEMS Hardware. | ||||
* The main objectif of this test is to check the hardware connection of the | ||||
* Microphone MEMS peripheral. | ||||
* @param None | ||||
* @retval None | ||||
*/ | ||||
void Microphone_MEMS_Test(void) | ||||
{ | ||||
uint16_t data = 0x00; | ||||
uint8_t index = 0x00; | ||||
I2S_InitTypeDef I2S_InitStructure; | ||||
GPIO_InitTypeDef GPIO_InitStructure; | ||||
/* Enable the SPI clock */ | ||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); | ||||
/* Enable GPIO clocks */ | ||||
RCC_AHB1PeriphClockCmd(SPI_SCK_GPIO_CLK | SPI_MOSI_GPIO_CLK, ENABLE); | ||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; | ||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; | ||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; | ||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; | ||||
/* SPI SCK pin configuration */ | ||||
GPIO_InitStructure.GPIO_Pin = SPI_SCK_PIN; | ||||
GPIO_Init(SPI_SCK_GPIO_PORT, &GPIO_InitStructure); | ||||
/* Connect SPI pins to AF5 */ | ||||
GPIO_PinAFConfig(SPI_SCK_GPIO_PORT, SPI_SCK_SOURCE, SPI_SCK_AF); | ||||
/* SPI MOSI pin configuration */ | ||||
GPIO_InitStructure.GPIO_Pin = SPI_MOSI_PIN; | ||||
GPIO_Init(SPI_MOSI_GPIO_PORT, &GPIO_InitStructure); | ||||
GPIO_PinAFConfig(SPI_MOSI_GPIO_PORT, SPI_MOSI_SOURCE, SPI_MOSI_AF); | ||||
/* I2S configuration -------------------------------------------------------*/ | ||||
SPI_I2S_DeInit(SPI2); | ||||
I2S_InitStructure.I2S_AudioFreq = 64000; | ||||
I2S_InitStructure.I2S_Standard = I2S_Standard_MSB; | ||||
I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16b; | ||||
I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low; | ||||
I2S_InitStructure.I2S_Mode = I2S_Mode_MasterRx; | ||||
I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable; | ||||
/* Initialize the I2S peripheral with the structure above */ | ||||
I2S_Init(SPI2, &I2S_InitStructure); | ||||
/* Enable the I2S peripheral */ | ||||
I2S_Cmd(SPI2, ENABLE); | ||||
/* Waiting until MEMS microphone ready : Wake-up Time */ | ||||
Delay(10); | ||||
TimingDelay = 500; | ||||
/* Wait until detect the click on the MEMS microphone or TimeOut delay*/ | ||||
while((index < 30) && (TimingDelay != 0x00)) | ||||
{ | ||||
/* Waiting RXNE Flag or TimeOut delay */ | ||||
while((SPI_I2S_GetFlagStatus(SPI2, SPI_FLAG_RXNE) == RESET)&& (TimingDelay != 0x00)) | ||||
{} | ||||
data = SPI_I2S_ReceiveData(SPI2); | ||||
if (data == 0xFFFF) | ||||
{ | ||||
index++; | ||||
} | ||||
} | ||||
/* MEMS microphone test status: Timeout occurs */ | ||||
if(index != 30) | ||||
{ | ||||
Fail_Handler(); | ||||
} | ||||
} | ||||
/*-------------------------------- | ||||
Callbacks implementation: | ||||
the callbacks prototypes are defined in the stm324xg_eval_audio_codec.h file | ||||
and their implementation should be done in the user code if they are needed. | ||||
Below some examples of callback implementations. | ||||
--------------------------------------------------------*/ | ||||
/** | ||||
* @brief Calculates the remaining file size and new position of the pointer. | ||||
* @param None | ||||
* @retval None | ||||
*/ | ||||
void EVAL_AUDIO_TransferComplete_CallBack(uint32_t pBuffer, uint32_t Size) | ||||
{ | ||||
/* Calculate the remaining audio data in the file and the new size | ||||
for the DMA transfer. If the Audio files size is less than the DMA max | ||||
data transfer size, so there is no calculation to be done, just restart | ||||
from the beginning of the file ... */ | ||||
/* Check if the end of file has been reached */ | ||||
} | ||||
/** | ||||
* @brief Manages the DMA Half Transfer complete interrupt. | ||||
* @param None | ||||
* @retval None | ||||
*/ | ||||
void EVAL_AUDIO_HalfTransfer_CallBack(uint32_t pBuffer, uint32_t Size) | ||||
{ | ||||
#ifdef AUDIO_MAL_MODE_CIRCULAR | ||||
/* Display message on the LCD screen */ | ||||
LCD_DisplayStringLine(Line8, " 1/2 Buffer Reached "); | ||||
#endif /* AUDIO_MAL_MODE_CIRCULAR */ | ||||
/* Generally this interrupt routine is used to load the buffer when | ||||
a streaming scheme is used: When first Half buffer is already transferred load | ||||
the new data to the first half of buffer while DMA is transferring data from | ||||
the second half. And when Transfer complete occurs, load the second half of | ||||
the buffer while the DMA is transferring from the first half ... */ | ||||
/* | ||||
........... | ||||
*/ | ||||
} | ||||
/** | ||||
* @brief Get next data sample callback | ||||
* @param None | ||||
* @retval Next data sample to be sent | ||||
*/ | ||||
uint16_t EVAL_AUDIO_GetSampleCallBack(void) | ||||
{ | ||||
uint16_t data = 0; | ||||
if (DACTest == 0) | ||||
{ | ||||
if (Left_Right==0) | ||||
{ | ||||
/* Get the next sample to be sent */ | ||||
data = sinebuf[count++]; | ||||
if (count == 48) | ||||
{ | ||||
count = 0x00; | ||||
} | ||||
Left_Right = 1; | ||||
} | ||||
else | ||||
{ | ||||
/* Get the next sample to be sent */ | ||||
data = sinebuf[count1++]; | ||||
if (count1 == 48) | ||||
{ | ||||
count1 = 0x00; | ||||
} | ||||
Left_Right = 0; | ||||
} | ||||
} | ||||
else | ||||
{ | ||||
/* Get the next sample to be sent */ | ||||
data = 32768 + sinebuf[count++]; | ||||
if (count == 48) | ||||
{ | ||||
count = 0x00; | ||||
} | ||||
} | ||||
return data; | ||||
} | ||||
/** | ||||
* @brief Manages the DMA FIFO error interrupt. | ||||
* @param None | ||||
* @retval None | ||||
*/ | ||||
void EVAL_AUDIO_Error_CallBack(void* pData) | ||||
{ | ||||
/* Stop the program with an infinite loop */ | ||||
while (1) | ||||
{} | ||||
/* could also generate a system reset to recover from the error */ | ||||
/* .... */ | ||||
} | ||||
#ifndef USE_DEFAULT_TIMEOUT_CALLBACK | ||||
/** | ||||
* @brief Basic management of the timeout situation. | ||||
* @param None. | ||||
* @retval None. | ||||
*/ | ||||
uint32_t Codec_TIMEOUT_UserCallback(void) | ||||
{ | ||||
/* Block communication and all processes */ | ||||
while (1) | ||||
{ | ||||
} | ||||
} | ||||
#endif /* USE_DEFAULT_TIMEOUT_CALLBACK */ | ||||
/*----------------------------------------------------------------------------*/ | ||||
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ | ||||