#include "tos_k.h" #include #include "mcu_init.h" #include "stdlib.h" #include "gd32vf103_gpio.h" #include "nrf24l01_gd32v_hal.h" #include "lcd.h" #define USE_SPI1 k_sem_t sem_nrf; k_sem_t sem_led; k_mutex_t mutex_lcd; #define TASK_SIZE (8*1024) k_task_t task_nrf24_handle; uint8_t task_nrf24_stk[TASK_SIZE]; #define LED_TASK_SIZE 1024 k_task_t led_handle; uint8_t led_stk[LED_TASK_SIZE]; #define LCD_TASK_SIZE 1024 k_task_t lcd_handle; uint8_t lcd_stk[LCD_TASK_SIZE]; #define CE_GPIO_PORT GPIOA #define CE_PIN GPIO_PIN_3 #define CSN_GPIO_PORT GPIOB #define CSN_PIN GPIO_PIN_12 #define IRQ_GPIO_PORT GPIOB #define IRQ_PIN GPIO_PIN_5 void task_nrf24(); char lcd_buf[64]; void task_led(void *arg) { int task_cnt1 = 0; while (1) { tos_sem_pend(&sem_led, ~0); gpio_bit_reset(LEDB_GPIO_PORT, LEDB_PIN); tos_task_delay(50); gpio_bit_set(LEDB_GPIO_PORT, LEDB_PIN); } } void task_lcd(void *arg) { strcpy(lcd_buf, "initializing..."); LCD_SetDisplayMode(LCD_DISPMODE_HORIZONTAL_MIRROR); LCD_Clear(BLACK); const uint16_t x = 0; const uint16_t y = 32; uint8_t oldlen = strlen(lcd_buf); for(int i=0; ; i++) { tos_mutex_pend(&mutex_lcd); uint8_t newlen = strlen(lcd_buf); if(newlen < oldlen) { LCD_Clear(BLACK); } oldlen = newlen; LCD_ShowString(x, y, lcd_buf, CYAN); } } void nrf24l01_init() { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_AF); #ifdef USE_SPI0 #define SPIx SPI0 rcu_periph_clock_enable(RCU_SPI0); /* spi GPIO config:SCK/PA5, MISO/PA6, MOSI/PA7 */ gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7); gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6); #endif #ifdef USE_SPI1 #define SPIx SPI1 rcu_periph_clock_enable(RCU_SPI1); /* spi GPIO config:SCK/PB13, MISO/PB14, MOSI/PB15 */ gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_15); gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_14); #endif { spi_parameter_struct spi_init_struct; /* deinitilize SPI and the parameters */ spi_i2s_deinit(SPIx); spi_struct_para_init(&spi_init_struct); /* spi parameter config */ spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; spi_init_struct.device_mode = SPI_MASTER; spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; spi_init_struct.nss = SPI_NSS_SOFT; spi_init_struct.prescale = SPI_PSC_8; spi_init_struct.endian = SPI_ENDIAN_MSB; spi_init(SPIx, &spi_init_struct); spi_enable(SPIx); spi_ti_mode_disable(SPIx); // use motorola mode spi_crc_off(SPIx); spi_crc_polynomial_set(SPIx, 7); spi_nssp_mode_enable(SPIx); } { nrf_hal_init_t nhi; nhi.spi = SPIx; nhi.ce_port = CE_GPIO_PORT; nhi.ce_pin = CE_PIN; nhi.csn_port= CSN_GPIO_PORT; nhi.csn_pin = CSN_PIN; nrf_init_t ni = { .init = nrf_hal_init, .ce = nrf_hal_ce, .csn = nrf_hal_csn, .spi_recv = nrf_hal_spi_recv, .spi_send = nrf_hal_spi_send, .private = &nhi, }; nrf_init(&ni); } tos_sem_create(&sem_nrf, 1); tos_sem_create(&sem_led, 1); tos_mutex_create(&mutex_lcd); tos_task_create(&task_nrf24_handle, "task_nrf24", task_nrf24, NULL, 5, task_nrf24_stk, TASK_SIZE, 0); tos_task_create(&led_handle, "led", task_led, NULL, 6, led_stk, LED_TASK_SIZE, 0); tos_task_create(&lcd_handle, "lcd", task_lcd, NULL, 7, lcd_stk, LCD_TASK_SIZE, 0); } void EXTI5_9_IRQHandler(void) { if (tos_knl_is_running()) { tos_knl_irq_enter(); if (RESET != exti_interrupt_flag_get(IRQ_PIN)){ exti_interrupt_flag_clear(IRQ_PIN); uint8_t status = 0; nrf_read_reg_byte(REG_STATUS, &status); if(status & _BV(RX_DR)) { tos_sem_post(&sem_nrf); } } tos_knl_irq_leave(); } } #define ADDRLEN 5 void print_rxaddr(uint8_t pipe) { uint8_t addr[ADDRLEN]; uint8_t addrlen = ADDRLEN; nrf_get_rxaddr(pipe, addr, &addrlen); printf("pipe %u addr: ", pipe); for(int i=0; i