diff --git a/Inc/main.h b/Inc/main.h index 71c5ea8..f6a2c98 100644 --- a/Inc/main.h +++ b/Inc/main.h @@ -74,14 +74,19 @@ /* Private define ------------------------------------------------------------*/ -#define LED_Pin LL_GPIO_PIN_13 #define LED_GPIO_Port GPIOC -#define NRF_IRQ_Pin LL_GPIO_PIN_2 +#define LED1_Pin LL_GPIO_PIN_13 +#define LEDRX_Pin LL_GPIO_PIN_14 +#define LEDTX_Pin LL_GPIO_PIN_15 + +#define NRF_IRQ_Pin LL_GPIO_PIN_1 #define NRF_IRQ_GPIO_Port GPIOA #define NRF_CE_Pin LL_GPIO_PIN_3 #define NRF_CE_GPIO_Port GPIOA -#define NRF_NSS_Pin LL_GPIO_PIN_4 +#define NRF_NSS_Pin LL_GPIO_PIN_2 #define NRF_NSS_GPIO_Port GPIOA +#define RENUM_Pin LL_GPIO_PIN_0 +#define RENUM_GPIO_Port GPIOA /* ########################## Assert Selection ############################## */ /** diff --git a/Src/gex_gateway.c b/Src/gex_gateway.c index 848019d..d32bd57 100644 --- a/Src/gex_gateway.c +++ b/Src/gex_gateway.c @@ -48,8 +48,6 @@ static uint8_t txmsg_payload[MAX_FRAME_LEN]; // equal buffer size in GEX static uint8_t txmsg_addr = 0; static uint8_t txmsg_cksum = 0; -#define MAGIC_GW_COMMAND 0x47U // 'G' - enum GW_CMD { CMD_GET_ID = 'i', // 105 - get network ID CMD_RESET = 'r', // reset the radio and network @@ -137,6 +135,7 @@ void handle_txframe_chunk(const uint8_t *buffer, uint16_t size) } } + LL_GPIO_ResetOutputPin(LED_GPIO_Port, LEDTX_Pin); cmd_state = CMD_STATE_IDLE; } } @@ -147,57 +146,49 @@ void gw_handle_usb_out(uint8_t *buffer) PayloadParser pp = pp_start(buffer, 64, NULL); // handle binary commands for the gateway - - // magic twice, one inverted - denotes a gateway command - const uint16_t magic1 = pp_u8(&pp); - const uint16_t magic2 = pp_u8(&pp); - if (magic1 == MAGIC_GW_COMMAND && magic2 == (0xFFU & (~MAGIC_GW_COMMAND))) { - // third byte is the command code - switch (pp_u8(&pp)) { - case CMD_GET_ID: - respond_gw_id(); - break; - - case CMD_RESET: - handle_cmd_reset(); + switch (pp_u8(&pp)) { + case CMD_GET_ID: + respond_gw_id(); + break; + + case CMD_RESET: + handle_cmd_reset(); + break; + + case CMD_ADD_NODES: + // payload is: u8-count, u8[] node addresses + handle_cmd_addnodes(&pp); + break; + + case CMD_TXMSG:; + // u8-slave-addr, u16-len, u8-checksum + // the message is sent in the following frames. + uint8_t slave_addr = pp_u8(&pp); + uint16_t frame_len = pp_u16(&pp); + uint8_t cksum = pp_u8(&pp); + + if (frame_len == 0 || frame_len > MAX_FRAME_LEN) { + dbg("Frame too big!"); break; + } - case CMD_ADD_NODES: - // payload is: u8-count, u8[] node addresses - handle_cmd_addnodes(&pp); - break; - - case CMD_TXMSG:; - // u8-slave-addr, u16-len, u8-checksum - // the message is sent in the following frames. - uint8_t slave_addr = pp_u8(&pp); - uint16_t frame_len = pp_u16(&pp); - uint8_t cksum = pp_u8(&pp); - - if (frame_len == 0 || frame_len > MAX_FRAME_LEN) { - dbg("Frame too big!"); - break; - } - - start_slave_cmd(slave_addr, frame_len, cksum); - dbg_nrf("Collecting frame for slave %02x: %d bytes", (int)slave_addr, (int)frame_len); - cmd_state = CMD_STATE_TXMSG; + LL_GPIO_SetOutputPin(LED_GPIO_Port, LEDTX_Pin); + start_slave_cmd(slave_addr, frame_len, cksum); + dbg_nrf("Collecting frame for slave %02x: %d bytes", (int)slave_addr, (int)frame_len); + cmd_state = CMD_STATE_TXMSG; - // handle the rest as payload - uint32_t len; - const uint8_t *tail = pp_tail(&pp, &len); - handle_txframe_chunk(tail, (uint16_t) len); - break; + // handle the rest as payload + uint32_t len; + const uint8_t *tail = pp_tail(&pp, &len); + handle_txframe_chunk(tail, (uint16_t) len); + break; - default: - dbg("Bad cmd"); - } - } else { - // Bad frame?? - dbg("Bad USB frame, starts %x,%x", buffer[0],buffer[1]); + default: + dbg("Bad cmd"); } } else if (cmd_state == CMD_STATE_TXMSG) { + LL_GPIO_SetOutputPin(LED_GPIO_Port, LEDTX_Pin); handle_txframe_chunk(buffer, 64); } } @@ -288,6 +279,7 @@ void gw_setup_radio(void) void EXTI2_IRQHandler(void) { LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_2); + LL_GPIO_SetOutputPin(LED_GPIO_Port, LEDRX_Pin); struct msg_data m; m.msg_type = MSG_TYPE_DATA; diff --git a/Src/gpio.c b/Src/gpio.c index 5ac4fe6..990f17d 100644 --- a/Src/gpio.c +++ b/Src/gpio.c @@ -79,20 +79,23 @@ void MX_GPIO_Init(void) LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA); /**/ - LL_GPIO_ResetOutputPin(LED_GPIO_Port, LED_Pin); + LL_GPIO_ResetOutputPin(LED_GPIO_Port, LED1_Pin); + LL_GPIO_ResetOutputPin(LED_GPIO_Port, LEDRX_Pin); + LL_GPIO_ResetOutputPin(LED_GPIO_Port, LEDTX_Pin); + LL_GPIO_SetOutputPin(RENUM_GPIO_Port, RENUM_Pin); /**/ // LL_GPIO_ResetOutputPin(GPIOA, NRF_CE_Pin|NRF_NSS_Pin); /**/ - GPIO_InitStruct.Pin = LED_Pin; + GPIO_InitStruct.Pin = LED1_Pin|LEDRX_Pin|LEDTX_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; LL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct); /**/ - GPIO_InitStruct.Pin = NRF_CE_Pin|NRF_NSS_Pin; + GPIO_InitStruct.Pin = NRF_CE_Pin|NRF_NSS_Pin|RENUM_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; @@ -100,10 +103,10 @@ void MX_GPIO_Init(void) #if 1 /**/ - LL_GPIO_AF_SetEXTISource(LL_GPIO_AF_EXTI_PORTA, LL_GPIO_AF_EXTI_LINE2); + LL_GPIO_AF_SetEXTISource(LL_GPIO_AF_EXTI_PORTA, LL_GPIO_AF_EXTI_LINE1); // IRQ on PA1 /**/ - EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_2; + EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_1; EXTI_InitStruct.LineCommand = ENABLE; EXTI_InitStruct.Mode = LL_EXTI_MODE_IT; EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_FALLING; diff --git a/Src/main.c b/Src/main.c index cf8f8cc..59f127c 100644 --- a/Src/main.c +++ b/Src/main.c @@ -91,52 +91,61 @@ extern void EXTI2_IRQHandler(void); */ int main(void) { - /* USER CODE BEGIN 1 */ + /* USER CODE BEGIN 1 */ - /* USER CODE END 1 */ + /* USER CODE END 1 */ - /* MCU Configuration----------------------------------------------------------*/ + /* MCU Configuration----------------------------------------------------------*/ - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); - /* USER CODE BEGIN Init */ + /* USER CODE BEGIN Init */ - /* USER CODE END Init */ + /* USER CODE END Init */ - /* Configure the system clock */ - SystemClock_Config(); + /* Configure the system clock */ + SystemClock_Config(); - /* USER CODE BEGIN SysInit */ + /* USER CODE BEGIN SysInit */ - /* USER CODE END SysInit */ + /* USER CODE END SysInit */ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC); LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOD); LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA); - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_DMA_Init(); - MX_USB_DEVICE_Init(); - MX_SPI1_Init(); - MX_USART1_UART_Init(); - /* USER CODE BEGIN 2 */ + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_DMA_Init(); + MX_USB_DEVICE_Init(); + MX_SPI1_Init(); + MX_USART1_UART_Init(); + /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ + /* USER CODE END 2 */ gw_setup_radio(); mq_init(&usb_inq); + // re-enumerate USB + LL_GPIO_SetOutputPin(RENUM_GPIO_Port, RENUM_Pin); + LL_mDelay(100); + LL_GPIO_ResetOutputPin(RENUM_GPIO_Port, RENUM_Pin); + dbg("Main loop starts."); - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ int cnt = 0; uint8_t buff[MQ_SLOT_LEN]; while (1) { - if (cnt++ > 500000) { - LL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); + cnt++; + if (cnt > 1400000) { + LL_GPIO_SetOutputPin(LED_GPIO_Port, LED1_Pin); + } + if (cnt > 1500000) { + LL_GPIO_ResetOutputPin(LED_GPIO_Port, LED1_Pin); cnt = 0; } @@ -144,10 +153,13 @@ int main(void) if (!usb_tx_busy) { mq_read(&usb_inq, buff); CDC_Transmit_FS(buff, MQ_SLOT_LEN); + + // blinking - maybe this will work .. not sure + LL_GPIO_ResetOutputPin(LED_GPIO_Port, LEDRX_Pin); } } } - /* USER CODE END 3 */ + /* USER CODE END 3 */ } @@ -158,51 +170,47 @@ int main(void) void SystemClock_Config(void) { - LL_FLASH_SetLatency(LL_FLASH_LATENCY_2); + LL_FLASH_SetLatency(LL_FLASH_LATENCY_2); + + if (LL_FLASH_GetLatency() != LL_FLASH_LATENCY_2) { + Error_Handler(); + } + LL_RCC_HSE_Enable(); - if(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_2) - { - Error_Handler(); - } - LL_RCC_HSE_Enable(); + /* Wait till HSE is ready */ + while (LL_RCC_HSE_IsReady() != 1) { - /* Wait till HSE is ready */ - while(LL_RCC_HSE_IsReady() != 1) - { - - } - LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE_DIV_1, LL_RCC_PLL_MUL_9); + } + LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE_DIV_1, LL_RCC_PLL_MUL_9); - LL_RCC_PLL_Enable(); + LL_RCC_PLL_Enable(); - /* Wait till PLL is ready */ - while(LL_RCC_PLL_IsReady() != 1) - { - - } - LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); + /* Wait till PLL is ready */ + while (LL_RCC_PLL_IsReady() != 1) { - LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2); + } + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); - LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); + LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2); - LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); + LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); - /* Wait till System clock is ready */ - while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) - { - - } - LL_Init1msTick(72000000); + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); - LL_SYSTICK_SetClkSource(LL_SYSTICK_CLKSOURCE_HCLK); + /* Wait till System clock is ready */ + while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) { - LL_SetSystemCoreClock(72000000); + } + LL_Init1msTick(72000000); - LL_RCC_SetUSBClockSource(LL_RCC_USB_CLKSOURCE_PLL_DIV_1_5); + LL_SYSTICK_SetClkSource(LL_SYSTICK_CLKSOURCE_HCLK); - /* SysTick_IRQn interrupt configuration */ - NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0)); + LL_SetSystemCoreClock(72000000); + + LL_RCC_SetUSBClockSource(LL_RCC_USB_CLKSOURCE_PLL_DIV_1_5); + + /* SysTick_IRQn interrupt configuration */ + NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0)); } /* USER CODE BEGIN 4 */ @@ -217,15 +225,15 @@ void SystemClock_Config(void) */ void _Error_Handler(char *file, int line) { - /* USER CODE BEGIN Error_Handler_Debug */ - /* User can add his own implementation to report the HAL error return state */ - while(1) - { - } - /* USER CODE END Error_Handler_Debug */ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + while (1) { + } + /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT + /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. @@ -233,13 +241,14 @@ void _Error_Handler(char *file, int line) * @param line: assert_param error line source number * @retval None */ -void assert_failed(uint8_t* file, uint32_t line) -{ - /* USER CODE BEGIN 6 */ - /* User can add his own implementation to report the file name and line number, - tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ } + #endif /* USE_FULL_ASSERT */ /**