void prvCheckFlagsTask(void *args) { volatile uint8_t pktcnt, flags; while (1) { pktcnt = enc28j60_rcr(EPKTCNT); flags = enc28j60_rcr(EIR); debug("encPacketCNT: %d, flags: %x\n", pktcnt, flags); vTaskDelay(2500); // __HAL_GPIO_EXTI_GENERATE_SWIT(GPIO_PIN_0); } }
void prvInit( void *pvParameters ) { vTaskSuspendAll(); GPIO_InitTypeDef GPIO_InitStruct; // Initialize button int GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = 0; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); IRQn_Type irqn_line = EXTI0_IRQn; HAL_NVIC_SetPriority(irqn_line, 7, 7); HAL_NVIC_EnableIRQ(irqn_line); debug("enc28j60: init\n"); enc28j60_init(ucMACAddress); uint8_t revision_id = 0; revision_id = enc28j60_rcr(EREVID); debug("enc28j60: revision %#x\n", revision_id); debug("enc28j60: checked MAC address %x:%x:%x:%x:%x:%x filter: %x\n", enc28j60_rcr(MAADR5), enc28j60_rcr(MAADR4), enc28j60_rcr(MAADR3), enc28j60_rcr(MAADR2), enc28j60_rcr(MAADR1), enc28j60_rcr(MAADR0), enc28j60_rcr(ERXFCON)); xTaskResumeAll(); //xTaskCreate(prvCheckFlagsTask, "Check", 1000, NULL, 2, NULL); vTaskDelete(NULL); }
extern "C" void TIM2_IRQHandler() { open_node(); if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); uint8_t pcd = RC522_PCD_1; do { // Chose rfid device. rc522_pcd_select(pcd); uint8_t status = mfrc522_read(Status1Reg); __disable_irq(); // If timer is not running and interrupt timer flag is not active reinit device. if (!(status & TRunning)) { uint8_t need_reinit = 0; switch (pcd) { case RC522_PCD_1: if (EXTI_GetITStatus(EXTI_Line10) == RESET) need_reinit = 1; break; case RC522_PCD_2: if (EXTI_GetITStatus(EXTI_Line11) == RESET) need_reinit = 1; break; } if (need_reinit) { spi_hardware_failure_signal(); mfrc522_init(); __enable_irq(); rc522_irq_prepare(); } } __enable_irq(); } while (pcd++ < RC522_PCD_2); // Check enc28j60 chip and restart if needed. if (!enc28j60_revid || (enc28j60_revid != enc28j60_rcr(EREVID)) || (GPIO_ReadInputDataBit(ETH_GPIO, ETH_IRQ_PIN) == RESET && (EXTI_GetITStatus(EXTI_Line2) == RESET))) { enc28j60_init(mac_addr); } uint16_t phstat1 = enc28j60_read_phy(PHSTAT1); // Если ethernet провод вытаскивали, обновить DHCP. // Пока отключено, т.к. по непонятным причинам LLSTAT падает иногда // хотя коннект сохраняется, что вызывает провалы в доступности интерфейса на 3-10 секунд, // пока интерфейс не поднимится по DHCP заного, однако если согласно LLSTAT линк выключен // но мы не гасим интерфейс он продолжает нормально работать. if(!(phstat1 & PHSTAT1_LLSTAT)) { static uint16_t link_dhcp_time; // Avoid frequently link checks. if (ticks - link_dhcp_time > 5000) { link_dhcp_time = ticks; // Обновим адрес через 5 секунд // (после того, как линк появится) dhcp_status = DHCP_INIT; dhcp_retry_time = RTC_GetCounter() + 2; // Линка нет - опускаем интерфейс ip_addr = 0; ip_mask = 0; ip_gateway = 0; enc28j60_init(mac_addr); } } } }