#FL-303 fix for some spi bugs, test app for sd-nfc interconnection (#247)
* sd-nfc test app * do not hold spi in disable mode * disable pullups in nfc chip
This commit is contained in:
		
							parent
							
								
									9bbc8fafe5
								
							
						
					
					
						commit
						27ae2a8fa9
					
				| @ -38,6 +38,7 @@ void app_gpio_test(void* p); | |||||||
| void app_ibutton(void* p); | void app_ibutton(void* p); | ||||||
| void cli_task(void* p); | void cli_task(void* p); | ||||||
| void music_player(void* p); | void music_player(void* p); | ||||||
|  | void sdnfc(void* p); | ||||||
| void floopper_bloopper(void* p); | void floopper_bloopper(void* p); | ||||||
| 
 | 
 | ||||||
| const FlipperStartupApp FLIPPER_STARTUP[] = { | const FlipperStartupApp FLIPPER_STARTUP[] = { | ||||||
| @ -185,7 +186,14 @@ const FlipperStartupApp FLIPPER_STARTUP[] = { | |||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #ifdef APP_FLOOPPER_BLOOPPER | #ifdef APP_FLOOPPER_BLOOPPER | ||||||
|     {.app = floopper_bloopper, .name = "Floopper Bloopper", .libs = {1, FURI_LIB{"gui_task"}}}, |     {.app = floopper_bloopper, | ||||||
|  |      .name = "Floopper Bloopper", | ||||||
|  |      .libs = {1, FURI_LIB{"gui_task"}}, | ||||||
|  |      .icon = A_Games_14}, | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef APP_SDNFC | ||||||
|  |     {.app = sdnfc, .name = "sdnfc", .libs = {1, FURI_LIB{"gui_task"}}, .icon = A_Plugins_14}, | ||||||
| #endif | #endif | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -265,7 +273,13 @@ const FlipperStartupApp FLIPPER_PLUGINS[] = { | |||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #ifdef BUILD_FLOOPPER_BLOOPPER | #ifdef BUILD_FLOOPPER_BLOOPPER | ||||||
|     {.app = floopper_bloopper, .name = "Floopper Bloopper", .libs = {1, FURI_LIB{"gui_task"}}}, |     {.app = floopper_bloopper, | ||||||
|  |      .name = "Floopper Bloopper", | ||||||
|  |      .libs = {1, FURI_LIB{"gui_task"}}, | ||||||
|  |      .icon = A_Games_14}, | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifdef BUILD_SDNFC | ||||||
|  |     {.app = sdnfc, .name = "sdnfc", .libs = {1, FURI_LIB{"gui_task"}}, .icon = A_Plugins_14}, | ||||||
|  | #endif | ||||||
| }; | }; | ||||||
| @ -279,9 +279,19 @@ endif | |||||||
| BUILD_IBUTTON ?= 0 | BUILD_IBUTTON ?= 0 | ||||||
| ifeq ($(BUILD_IBUTTON), 1) | ifeq ($(BUILD_IBUTTON), 1) | ||||||
| CFLAGS		+= -DBUILD_IBUTTON | CFLAGS		+= -DBUILD_IBUTTON | ||||||
| CPP_SOURCES	+= $(wildcard $(APP_DIR)/ibutton/ibutton.cpp) | CPP_SOURCES	+= $(APP_DIR)/ibutton/ibutton.cpp | ||||||
| endif | endif | ||||||
| 
 | 
 | ||||||
|  | APP_SDNFC ?= 0 | ||||||
|  | ifeq ($(APP_SDNFC), 1) | ||||||
|  | CFLAGS		+= -DAPP_SDNFC | ||||||
|  | BUILD_SDNFC = 1 | ||||||
|  | endif | ||||||
|  | BUILD_SDNFC ?= 0 | ||||||
|  | ifeq ($(BUILD_SDNFC), 1) | ||||||
|  | CFLAGS		+= -DBUILD_SDNFC | ||||||
|  | CPP_SOURCES	+= $(APP_DIR)/sdnfc/sdnfc.cpp | ||||||
|  | endif | ||||||
| # device drivers
 | # device drivers
 | ||||||
| 
 | 
 | ||||||
| APP_GUI	?= 0 | APP_GUI	?= 0 | ||||||
|  | |||||||
							
								
								
									
										164
									
								
								applications/sd-nfc/sdnfc.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								applications/sd-nfc/sdnfc.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,164 @@ | |||||||
|  | #include "app-template.h" | ||||||
|  | 
 | ||||||
|  | extern "C" { | ||||||
|  | #include <rfal_analogConfig.h> | ||||||
|  | #include <rfal_rf.h> | ||||||
|  | #include <rfal_nfc.h> | ||||||
|  | #include <rfal_nfca.h> | ||||||
|  | #include <st25r3916.h> | ||||||
|  | #include <st25r3916_irq.h> | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #include "fatfs/ff.h" | ||||||
|  | #include "stm32_adafruit_sd.h" | ||||||
|  | 
 | ||||||
|  | // event enumeration type
 | ||||||
|  | typedef uint8_t event_t; | ||||||
|  | 
 | ||||||
|  | // app state class
 | ||||||
|  | class AppSdNFCState { | ||||||
|  | public: | ||||||
|  |     // state data
 | ||||||
|  |     const char* name; | ||||||
|  | 
 | ||||||
|  |     // state initializer
 | ||||||
|  |     AppSdNFCState() { | ||||||
|  |         name = "sd nfc test"; | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | // app events class
 | ||||||
|  | class AppSdNFCEvent { | ||||||
|  | public: | ||||||
|  |     // events enum
 | ||||||
|  |     static const event_t EventTypeTick = 0; | ||||||
|  |     static const event_t EventTypeKey = 1; | ||||||
|  | 
 | ||||||
|  |     // payload
 | ||||||
|  |     union { | ||||||
|  |         InputEvent input; | ||||||
|  |     } value; | ||||||
|  | 
 | ||||||
|  |     // event type
 | ||||||
|  |     event_t type; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | // our app derived from base AppTemplate class
 | ||||||
|  | // with template variables <state, events>
 | ||||||
|  | class AppSdNFC : public AppTemplate<AppSdNFCState, AppSdNFCEvent> { | ||||||
|  | public: | ||||||
|  |     GpioPin* red_led_record; | ||||||
|  |     GpioPin* green_led_record; | ||||||
|  | 
 | ||||||
|  |     void run(); | ||||||
|  |     void render(CanvasApi* canvas); | ||||||
|  |     void set_error(const char* text); | ||||||
|  |     void set_text(const char* text); | ||||||
|  |     void light_red(); | ||||||
|  |     void light_green(); | ||||||
|  |     void blink_red(); | ||||||
|  |     void blink_green(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | FATFS sd_fat_fs; | ||||||
|  | char sd_path[6] = ""; | ||||||
|  | 
 | ||||||
|  | // start app
 | ||||||
|  | void AppSdNFC::run() { | ||||||
|  |     // create pin
 | ||||||
|  |     GpioPin red_led = led_gpio[0]; | ||||||
|  |     GpioPin green_led = led_gpio[1]; | ||||||
|  | 
 | ||||||
|  |     // TODO open record
 | ||||||
|  |     red_led_record = &red_led; | ||||||
|  |     green_led_record = &green_led; | ||||||
|  | 
 | ||||||
|  |     // configure pin
 | ||||||
|  |     gpio_init(red_led_record, GpioModeOutputOpenDrain); | ||||||
|  |     gpio_init(green_led_record, GpioModeOutputOpenDrain); | ||||||
|  | 
 | ||||||
|  |     uint8_t rfal_result = rfalNfcInitialize(); | ||||||
|  |     if(rfal_result) { | ||||||
|  |         set_text("rfal init fail"); | ||||||
|  |         blink_red(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     uint8_t bsp_result = BSP_SD_Init(); | ||||||
|  |     if(bsp_result) { | ||||||
|  |         set_error("sd init fail"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     FRESULT result; | ||||||
|  | 
 | ||||||
|  |     result = f_mount(&sd_fat_fs, sd_path, 1); | ||||||
|  |     if(result) { | ||||||
|  |         set_error("sd mount fail"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     light_green(); | ||||||
|  |     set_text("all good"); | ||||||
|  | 
 | ||||||
|  |     AppSdNFCEvent event; | ||||||
|  |     while(1) { | ||||||
|  |         if(get_event(&event, 1000)) { | ||||||
|  |             if(event.type == AppSdNFCEvent::EventTypeKey) { | ||||||
|  |                 // press events
 | ||||||
|  |                 if(event.value.input.state && event.value.input.input == InputBack) { | ||||||
|  |                     exit(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // signal to force gui update
 | ||||||
|  |         update_gui(); | ||||||
|  |     }; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // render app
 | ||||||
|  | void AppSdNFC::render(CanvasApi* canvas) { | ||||||
|  |     canvas->set_color(canvas, ColorBlack); | ||||||
|  |     canvas->set_font(canvas, FontPrimary); | ||||||
|  |     canvas->draw_str(canvas, 2, 12, state.name); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void AppSdNFC::set_error(const char* text) { | ||||||
|  |     light_red(); | ||||||
|  |     set_text(text); | ||||||
|  |     update_gui(); | ||||||
|  |     while(1) | ||||||
|  |         ; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void AppSdNFC::set_text(const char* text) { | ||||||
|  |     acquire_state(); | ||||||
|  |     state.name = text; | ||||||
|  |     release_state(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void AppSdNFC::light_red() { | ||||||
|  |     gpio_write(red_led_record, false); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void AppSdNFC::light_green() { | ||||||
|  |     gpio_write(green_led_record, false); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void AppSdNFC::blink_red() { | ||||||
|  |     gpio_write(red_led_record, false); | ||||||
|  |     delay(500); | ||||||
|  |     gpio_write(red_led_record, true); | ||||||
|  |     delay(500); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void AppSdNFC::blink_green() { | ||||||
|  |     gpio_write(green_led_record, false); | ||||||
|  |     delay(500); | ||||||
|  |     gpio_write(green_led_record, true); | ||||||
|  |     delay(500); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // app enter function
 | ||||||
|  | extern "C" void sdnfc(void* p) { | ||||||
|  |     AppSdNFC* app = new AppSdNFC(); | ||||||
|  |     app->run(); | ||||||
|  | } | ||||||
| @ -19,9 +19,10 @@ | |||||||
| 
 | 
 | ||||||
| /* Includes ------------------------------------------------------------------*/ | /* Includes ------------------------------------------------------------------*/ | ||||||
| #include "spi.h" | #include "spi.h" | ||||||
|  | #include "cmsis_os.h" | ||||||
| 
 | 
 | ||||||
| /* USER CODE BEGIN 0 */ | /* USER CODE BEGIN 0 */ | ||||||
| 
 | void Enable_SPI(SPI_HandleTypeDef* spi); | ||||||
| /* USER CODE END 0 */ | /* USER CODE END 0 */ | ||||||
| 
 | 
 | ||||||
| SPI_HandleTypeDef hspi1; | SPI_HandleTypeDef hspi1; | ||||||
| @ -190,9 +191,7 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) | |||||||
| /* USER CODE BEGIN 1 */ | /* USER CODE BEGIN 1 */ | ||||||
| 
 | 
 | ||||||
| void NFC_SPI_Reconfigure() { | void NFC_SPI_Reconfigure() { | ||||||
|   if (HAL_SPI_DeInit(&SPI_R) != HAL_OK) { |   osKernelLock(); | ||||||
|       Error_Handler(); |  | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   SPI_R.Init.Mode = SPI_MODE_MASTER; |   SPI_R.Init.Mode = SPI_MODE_MASTER; | ||||||
|   SPI_R.Init.Direction = SPI_DIRECTION_2LINES; |   SPI_R.Init.Direction = SPI_DIRECTION_2LINES; | ||||||
| @ -211,12 +210,14 @@ void NFC_SPI_Reconfigure() { | |||||||
|   if (HAL_SPI_Init(&SPI_R) != HAL_OK) { |   if (HAL_SPI_Init(&SPI_R) != HAL_OK) { | ||||||
|       Error_Handler(); |       Error_Handler(); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   Enable_SPI(&SPI_R); | ||||||
|  | 
 | ||||||
|  |   osKernelUnlock(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void SD_SPI_Reconfigure_Slow(void) { | void SD_SPI_Reconfigure_Slow(void) { | ||||||
|   if (HAL_SPI_DeInit(&SPI_SD_HANDLE) != HAL_OK) { |   osKernelLock(); | ||||||
|       Error_Handler(); |  | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   SPI_SD_HANDLE.Init.Mode = SPI_MODE_MASTER; |   SPI_SD_HANDLE.Init.Mode = SPI_MODE_MASTER; | ||||||
|   SPI_SD_HANDLE.Init.Direction = SPI_DIRECTION_2LINES; |   SPI_SD_HANDLE.Init.Direction = SPI_DIRECTION_2LINES; | ||||||
| @ -235,12 +236,14 @@ void SD_SPI_Reconfigure_Slow(void) { | |||||||
|   if(HAL_SPI_Init(&SPI_SD_HANDLE) != HAL_OK) { |   if(HAL_SPI_Init(&SPI_SD_HANDLE) != HAL_OK) { | ||||||
|       Error_Handler(); |       Error_Handler(); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   Enable_SPI(&SPI_SD_HANDLE); | ||||||
|  | 
 | ||||||
|  |   osKernelUnlock(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void SD_SPI_Reconfigure_Fast(void) { | void SD_SPI_Reconfigure_Fast(void) { | ||||||
|   if(HAL_SPI_DeInit(&SPI_SD_HANDLE) != HAL_OK) { |   osKernelLock(); | ||||||
|         Error_Handler(); |  | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   SPI_SD_HANDLE.Init.Mode = SPI_MODE_MASTER; |   SPI_SD_HANDLE.Init.Mode = SPI_MODE_MASTER; | ||||||
|   SPI_SD_HANDLE.Init.Direction = SPI_DIRECTION_2LINES; |   SPI_SD_HANDLE.Init.Direction = SPI_DIRECTION_2LINES; | ||||||
| @ -259,12 +262,14 @@ void SD_SPI_Reconfigure_Fast(void) { | |||||||
|   if(HAL_SPI_Init(&SPI_SD_HANDLE) != HAL_OK) { |   if(HAL_SPI_Init(&SPI_SD_HANDLE) != HAL_OK) { | ||||||
|       Error_Handler(); |       Error_Handler(); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   Enable_SPI(&SPI_SD_HANDLE); | ||||||
|  | 
 | ||||||
|  |   osKernelUnlock(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void CC1101_SPI_Reconfigure(void) { | void CC1101_SPI_Reconfigure(void) { | ||||||
|   if(HAL_SPI_DeInit(&SPI_R) != HAL_OK) { |   osKernelLock(); | ||||||
|       Error_Handler(); |  | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   SPI_R.Init.Mode = SPI_MODE_MASTER; |   SPI_R.Init.Mode = SPI_MODE_MASTER; | ||||||
|   SPI_R.Init.Direction = SPI_DIRECTION_2LINES; |   SPI_R.Init.Direction = SPI_DIRECTION_2LINES; | ||||||
| @ -283,8 +288,17 @@ void CC1101_SPI_Reconfigure(void) { | |||||||
|   if(HAL_SPI_Init(&SPI_R) != HAL_OK) { |   if(HAL_SPI_Init(&SPI_R) != HAL_OK) { | ||||||
|       Error_Handler(); |       Error_Handler(); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   Enable_SPI(&SPI_R); | ||||||
|  | 
 | ||||||
|  |   osKernelUnlock(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Enable_SPI(SPI_HandleTypeDef* spi_instance){ | ||||||
|  |   if((spi_instance->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) { | ||||||
|  |     __HAL_SPI_ENABLE(spi_instance); | ||||||
|  |   } | ||||||
|  | } | ||||||
| /* USER CODE END 1 */ | /* USER CODE END 1 */ | ||||||
| 
 | 
 | ||||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||||
|  | |||||||
| @ -467,6 +467,13 @@ ReturnCode rfalInitialize( void ) | |||||||
|     /* Apply RF Chip generic initialization */ |     /* Apply RF Chip generic initialization */ | ||||||
|     rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_INIT) ); |     rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_TECH_CHIP | RFAL_ANALOG_CONFIG_CHIP_INIT) ); | ||||||
|      |      | ||||||
|  |     // TODO:
 | ||||||
|  |     // I don't want to mess with config table ("Default Analog Configuration for Chip-Specific Reset", rfal_analogConfigTbl.h)
 | ||||||
|  |     // so with every rfalSetAnalogConfig((RFAL_ANALOG_CONFIG_CHIP_INIT)) currently we need to clear pulldown bits
 | ||||||
|  |     // luckily for us this is done only here
 | ||||||
|  | 
 | ||||||
|  |     // disable pulldowns
 | ||||||
|  |     st25r3916ClrRegisterBits(ST25R3916_REG_IO_CONF2, ( ST25R3916_REG_IO_CONF2_miso_pd1 | ST25R3916_REG_IO_CONF2_miso_pd2 ) ); | ||||||
| 
 | 
 | ||||||
|     /*******************************************************************************/ |     /*******************************************************************************/ | ||||||
|     /* Enable External Field Detector as: Automatics */ |     /* Enable External Field Detector as: Automatics */ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 DrZlo13
						DrZlo13