Пример #1
0
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);
    }
}
Пример #2
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);
}
Пример #3
0
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);
		}
	}
    }
}