|
|
/**
|
|
|
******************************************************************************
|
|
|
* @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****/
|
|
|
|