diff --git a/Core/Src/MP45DT02.c b/Core/Src/MP45DT02.c index da4f630..3aacaab 100644 --- a/Core/Src/MP45DT02.c +++ b/Core/Src/MP45DT02.c @@ -4,7 +4,10 @@ #define SAMPLE_AMOUNT 256 -//extern I2S_HandleTypeDef hi2s2; +struct TestResult { + unsigned int lo_present:1; + unsigned int hi_present:1; +}; int MP45DT02_run_test(void) { @@ -14,66 +17,67 @@ int MP45DT02_run_test(void) uint16_t sample_buffer[SAMPLE_AMOUNT]; for (size_t t = 0; t < 5; t++) { - //HAL_I2S_Receive(&hi2s2, sample_buffer, SAMPLE_AMOUNT, 1000); + // gather samples + register unsigned int reset_value = (GPIO_PIN_10 << 16); for (size_t i = 0; i < SAMPLE_AMOUNT; i++) { sample_buffer[i] = 0; for (size_t j = 0; j < 16; j++) { - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); - asm("nop"); - asm("nop"); + for (int k = 0; k < 16; k++) { + GPIOB->BSRR = reset_value; + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + GPIOB->BSRR = GPIO_PIN_10; + } sample_buffer[i] <<= 1; - sample_buffer[i] |= HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_3); - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); - asm("nop"); - asm("nop"); - asm("nop"); - asm("nop"); - asm("nop"); - asm("nop"); - asm("nop"); - asm("nop"); - asm("nop"); - asm("nop"); - asm("nop"); - asm("nop"); + sample_buffer[i] |= (GPIOC->IDR & (1 << 3)) >> 3; } } + struct TestResult res = {}; + + // look for zeros for (size_t i = 0; i < SAMPLE_AMOUNT / 2; i++) - if (((uint32_t *) sample_buffer)[i]) { - DISPLAY_CLEAR; - display_write_data_seq("MP45DT02 Mic"); - - if (!t) { - DISPLAY_SET_CURSOR(1, 4); - display_write_data_seq("OK"); - } else { - DISPLAY_SET_CURSOR(1, 4); - display_write_data_byte('0' + t); - display_write_data_seq(" 0 samples"); - } - - return 0; + if (~((uint32_t *) sample_buffer)[i]) { + res.lo_present = 1; + break; + } + + // look for ones + for (size_t i = 0; i < SAMPLE_AMOUNT / 2; i++) + if (((uint32_t *) sample_buffer)[i]) { + res.hi_present = 1; + break; } - // if ended up here, then no samples equaled to 1; that is not a good sign DISPLAY_CLEAR; display_write_data_seq("MP45DT02 Mic"); + if (t) { + DISPLAY_SET_CURSOR(1, 14); + display_write_data_byte('T'); + display_write_data_byte('0' + t + 1); + } + DISPLAY_SET_CURSOR(1, 4); - display_write_data_byte('1' + t); - display_write_data_seq("/5: all zeros"); - - HAL_Delay(1000); + if (res.lo_present & res.hi_present) { + display_write_data_seq("OK"); + return 0; + } else if (res.lo_present) { + display_write_data_seq("ALWAYS LO"); + } else if (res.hi_present) { + display_write_data_seq("ALWAYS HI"); + } } - // t = 5, not a single 1 was recorded; microphone might be broken - DISPLAY_CLEAR; - display_write_data_seq("MP45DT02 Mic"); - - DISPLAY_SET_CURSOR(1, 4); - display_write_data_seq("NO ONES"); - return 1; } diff --git a/Core/Src/main.c b/Core/Src/main.c index 95ac39c..6612dcd 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -598,11 +598,11 @@ static void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); - /*Configure GPIO pins : PB10 PB7 */ - GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_7; + /*Configure GPIO pin : PB10 */ + GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pin : PD11 */ @@ -621,6 +621,13 @@ static void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + /*Configure GPIO pin : PB7 */ + GPIO_InitStruct.Pin = GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + /* USER CODE BEGIN MX_GPIO_Init_2 */ /* USER CODE END MX_GPIO_Init_2 */ } diff --git a/test1.ioc b/test1.ioc index 5b9e6f9..0e5f37f 100644 --- a/test1.ioc +++ b/test1.ioc @@ -99,6 +99,8 @@ PA7.Mode=RMII PA7.Signal=ETH_CRS_DV PB1.Locked=true PB1.Signal=ADCx_IN9 +PB10.GPIOParameters=GPIO_Speed +PB10.GPIO_Speed=GPIO_SPEED_FREQ_HIGH PB10.Locked=true PB10.Signal=GPIO_Output PB11.Mode=RMII