s25fl128s.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806
  1. /**
  2. ******************************************************************************
  3. * @file s25fl128s.c
  4. * @author MCD Application Team
  5. * @brief This file provides the S25FL128S QSPI drivers.
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2021 STMicroelectronics.
  10. * All rights reserved.
  11. *
  12. * This software is licensed under terms that can be found in the LICENSE file
  13. * in the root directory of this software component.
  14. * If no LICENSE file comes with this software, it is provided AS-IS.
  15. *
  16. ******************************************************************************
  17. */
  18. /* Includes ------------------------------------------------------------------*/
  19. #include "s25fl128s.h"
  20. /** @addtogroup BSP
  21. * @{
  22. */
  23. /** @addtogroup Components
  24. * @{
  25. */
  26. /** @defgroup S25FL128S S25FL128S
  27. * @{
  28. */
  29. /** @defgroup S25FL128S_Private_Define S25FL128S Private Define
  30. * @{
  31. */
  32. /* To avoid compiling issues for projects using previous version */
  33. #ifndef S25FL128S_DUMMY_CYCLES_READ_DUAL_INOUT
  34. #define S25FL128S_DUMMY_CYCLES_READ_DUAL_INOUT 4U
  35. #endif
  36. #ifndef S25FL128S_DUMMY_CYCLES_READ_QUAD_INOUT
  37. #define S25FL128S_DUMMY_CYCLES_READ_QUAD_INOUT 6U
  38. #endif
  39. /**
  40. * @}
  41. */
  42. /** @defgroup S25FL128S_Exported_Functions S25FL128S Exported Functions
  43. * @{
  44. */
  45. /**
  46. * @brief Get Flash information
  47. * @param pInfo pointer to information structure
  48. * @retval QSPI memory status
  49. */
  50. int32_t S25FL128S_GetFlashInfo(S25FL128S_Info_t *pInfo)
  51. {
  52. /* Configure the structure with the memory configuration */
  53. pInfo->FlashSize = S25FL128S_FLASH_SIZE;
  54. pInfo->EraseSectorSize = S25FL128S_SECTOR_SIZE;
  55. pInfo->EraseSectorsNumber = (S25FL128S_FLASH_SIZE/S25FL128S_SECTOR_SIZE);
  56. pInfo->ProgPageSize = S25FL128S_PAGE_SIZE;
  57. pInfo->ProgPagesNumber = (S25FL128S_FLASH_SIZE/S25FL128S_PAGE_SIZE);
  58. return S25FL128S_OK;
  59. }
  60. /**
  61. * @brief This function send a Write Enable and wait it is effective.
  62. * @param Ctx Component object pointer
  63. * @param Mode Interface mode
  64. * @retval QSPI memory status
  65. */
  66. int32_t S25FL128S_WriteEnable(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode)
  67. {
  68. QSPI_CommandTypeDef s_command;
  69. QSPI_AutoPollingTypeDef s_config;
  70. UNUSED(Mode); /* The command Write Enable is always 1-0-0 */
  71. /* Enable write operations */
  72. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  73. s_command.Instruction = S25FL128S_WRITE_ENABLE_CMD;
  74. s_command.AddressMode = QSPI_ADDRESS_NONE;
  75. s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  76. s_command.DataMode = QSPI_DATA_NONE;
  77. s_command.DummyCycles = 0;
  78. s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  79. s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  80. if (HAL_QSPI_Command(Ctx, &s_command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  81. {
  82. return S25FL128S_ERROR;
  83. }
  84. /* Configure automatic polling mode to wait for write enabling */
  85. s_config.Match = S25FL128S_SR1_WREN;
  86. s_config.Mask = S25FL128S_SR1_WREN;
  87. s_config.MatchMode = QSPI_MATCH_MODE_AND;
  88. s_config.StatusBytesSize = 1;
  89. s_config.Interval = 0x10;
  90. s_config.AutomaticStop = QSPI_AUTOMATIC_STOP_ENABLE;
  91. s_command.Instruction = S25FL128S_READ_STATUS_REG1_CMD;
  92. s_command.DataMode = QSPI_DATA_1_LINE;
  93. if (HAL_QSPI_AutoPolling(Ctx, &s_command, &s_config, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  94. {
  95. return S25FL128S_ERROR;
  96. }
  97. return S25FL128S_OK;
  98. }
  99. /**
  100. * @brief This function reset the (WEL) Write Enable Latch bit.
  101. * @param Ctx QSPI handle
  102. * @param Mode Flash mode
  103. * @retval QSPI memory status
  104. */
  105. int32_t S25FL128S_WriteDisable(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode)
  106. {
  107. QSPI_CommandTypeDef s_command;
  108. UNUSED(Mode); /* The command Write Disable is always 1-0-0 */
  109. /* Initialize the read ID command */
  110. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  111. s_command.Instruction = S25FL128S_WRITE_DISABLE_CMD;
  112. s_command.AddressMode = QSPI_ADDRESS_NONE;
  113. s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  114. s_command.DummyCycles = 0;
  115. s_command.DataMode = QSPI_DATA_NONE;
  116. s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  117. s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  118. /* Configure the command */
  119. if (HAL_QSPI_Command(Ctx, &s_command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  120. {
  121. return S25FL128S_ERROR;
  122. }
  123. return S25FL128S_OK;
  124. }
  125. /**
  126. * @brief Writes an amount of data to the QSPI memory.
  127. * SPI/QPI; 1-1-1/1-1-4
  128. * @param Ctx QSPI handle
  129. * @param Mode Flash mode
  130. * @param pData Pointer to data to be written
  131. * @param WriteAddr Write start address
  132. * @param Size Size of data to write. Range 1 ~ 256
  133. * @retval QSPI memory status
  134. */
  135. int32_t S25FL128S_PageProgram(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode, uint8_t *pData, uint32_t WriteAddr, uint32_t Size)
  136. {
  137. QSPI_CommandTypeDef s_command;
  138. /* Setup program command */
  139. switch(Mode)
  140. {
  141. case S25FL128S_SPI_1I4O_MODE : /* 1-1-4 program commands */
  142. s_command.Instruction = S25FL128S_QUAD_IN_FAST_PROG_4_BYTE_ADDR_CMD;
  143. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  144. s_command.AddressMode = QSPI_ADDRESS_1_LINE;
  145. s_command.DataMode = QSPI_DATA_4_LINES;
  146. break;
  147. case S25FL128S_SPI_MODE : /* 1-1-1 commands, Power on H/W default setting */
  148. default :
  149. s_command.Instruction = S25FL128S_PAGE_PROG_4_BYTE_ADDR_CMD;
  150. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  151. s_command.AddressMode = QSPI_ADDRESS_1_LINE;
  152. s_command.DataMode = QSPI_DATA_1_LINE;
  153. break;
  154. }
  155. s_command.AddressSize = QSPI_ADDRESS_32_BITS;
  156. s_command.Address = WriteAddr;
  157. s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  158. s_command.DummyCycles = 0;
  159. s_command.NbData = Size;
  160. s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  161. s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  162. /* Configure the command */
  163. if (HAL_QSPI_Command(Ctx, &s_command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  164. {
  165. return S25FL128S_ERROR;
  166. }
  167. /* Transmission of the data */
  168. if (HAL_QSPI_Transmit(Ctx, pData, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  169. {
  170. return S25FL128S_ERROR;
  171. }
  172. return S25FL128S_OK;
  173. }
  174. /**
  175. * @brief Polling WIP(Write In Progress) bit become to 0
  176. * @param Ctx Component object pointer
  177. * @param Mode Interface mode
  178. * @retval QSPI memory status
  179. */
  180. int32_t S25FL128S_AutoPollingMemReady(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode)
  181. {
  182. QSPI_CommandTypeDef s_command;
  183. QSPI_AutoPollingTypeDef s_config;
  184. UNUSED(Mode); /* The command Read Status Register-1 is always 1-0-1 */
  185. /* Configure automatic polling mode to wait for memory ready */
  186. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  187. s_command.Instruction = S25FL128S_READ_STATUS_REG1_CMD;
  188. s_command.AddressMode = QSPI_ADDRESS_NONE;
  189. s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  190. s_command.DataMode = QSPI_DATA_1_LINE;
  191. s_command.DummyCycles = 0;
  192. s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  193. s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  194. s_config.Match = 0;
  195. s_config.Mask = S25FL128S_SR1_WIP;
  196. s_config.MatchMode = QSPI_MATCH_MODE_AND;
  197. s_config.StatusBytesSize = 1;
  198. s_config.Interval = 0x10;
  199. s_config.AutomaticStop = QSPI_AUTOMATIC_STOP_ENABLE;
  200. if (HAL_QSPI_AutoPolling(Ctx, &s_command, &s_config, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  201. {
  202. return S25FL128S_ERROR;
  203. }
  204. return S25FL128S_OK;
  205. }
  206. /**
  207. * @brief This function set the QSPI memory in 4-byte address mode
  208. * @param Ctx Component object pointer
  209. * @param Mode Interface mode
  210. * @retval QSPI memory status
  211. */
  212. int32_t S25FL128S_Enter4BytesAddressMode(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode)
  213. {
  214. QSPI_CommandTypeDef s_command;
  215. uint8_t reg1;
  216. /* Initialize the read bank register command */
  217. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  218. s_command.Instruction = S25FL128S_READ_BANK_REG_CMD;
  219. s_command.AddressMode = QSPI_ADDRESS_NONE;
  220. s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  221. s_command.DataMode = QSPI_DATA_1_LINE;
  222. s_command.DummyCycles = 0;
  223. s_command.NbData = 1;
  224. s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  225. s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  226. /* Configure the command */
  227. if (HAL_QSPI_Command(Ctx, &s_command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  228. {
  229. return S25FL128S_ERROR;
  230. }
  231. /* Reception of the data */
  232. if (HAL_QSPI_Receive(Ctx, &reg1, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  233. {
  234. return S25FL128S_ERROR;
  235. }
  236. /* Enable write operations */
  237. if( S25FL128S_WriteEnable(Ctx,Mode)!=S25FL128S_OK)
  238. {
  239. return S25FL128S_ERROR;
  240. }
  241. /* Update Bank address register (with 4byte addressing bit) */
  242. s_command.Instruction = S25FL128S_WRITE_BANK_REG_CMD;
  243. MODIFY_REG(reg1, S25FL128S_BA_EXTADD, S25FL128S_BA_EXTADD);
  244. /* Configure the write volatile configuration register command */
  245. if (HAL_QSPI_Command(Ctx, &s_command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  246. {
  247. return S25FL128S_ERROR;
  248. }
  249. /* Transmission of the data Status Register 1 */
  250. if (HAL_QSPI_Transmit(Ctx, &reg1, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  251. {
  252. return S25FL128S_ERROR;
  253. }
  254. return S25FL128S_OK;
  255. }
  256. /**
  257. * @brief Reads an amount of data from the QSPI memory in STR mode.
  258. * SPI/DPI/QPI; 1-1-1/1-1-2/1-2-2/1-1-4/1-4-4
  259. * @param Ctx QSPI handle
  260. * @param Mode Flash mode
  261. * @param pData Pointer to data to be read
  262. * @param ReadAddr Read start address
  263. * @param Size Size of data to read
  264. * @retval QSPI memory status
  265. */
  266. int32_t S25FL128S_ReadSTR(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode, uint8_t *pData, uint32_t ReadAddr, uint32_t Size)
  267. {
  268. QSPI_CommandTypeDef s_command;
  269. switch(Mode)
  270. {
  271. case S25FL128S_SPI_1I2O_MODE : /* 1-1-2 read commands */
  272. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  273. s_command.Instruction = S25FL128S_DUAL_OUT_FAST_READ_4_BYTE_ADDR_CMD;
  274. s_command.AddressMode = QSPI_ADDRESS_1_LINE;
  275. s_command.DataMode = QSPI_DATA_2_LINES;
  276. s_command.DummyCycles = S25FL128S_DUMMY_CYCLES_READ;
  277. break;
  278. case S25FL128S_SPI_2IO_MODE : /* 1-2-2 read commands */
  279. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  280. s_command.Instruction = S25FL128S_DUAL_INOUT_FAST_READ_4_BYTE_ADDR_CMD;
  281. s_command.AddressMode = QSPI_ADDRESS_2_LINES;
  282. s_command.DataMode = QSPI_DATA_2_LINES;
  283. s_command.DummyCycles = S25FL128S_DUMMY_CYCLES_READ_DUAL_INOUT;
  284. break;
  285. case S25FL128S_SPI_1I4O_MODE : /* 1-1-4 read commands */
  286. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  287. s_command.Instruction = S25FL128S_QUAD_OUT_FAST_READ_4_BYTE_ADDR_CMD;
  288. s_command.AddressMode = QSPI_ADDRESS_1_LINE;
  289. s_command.DataMode = QSPI_DATA_4_LINES;
  290. s_command.DummyCycles = S25FL128S_DUMMY_CYCLES_READ;
  291. break;
  292. case S25FL128S_SPI_4IO_MODE : /* 1-4-4 read commands */
  293. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  294. s_command.Instruction = S25FL128S_QUAD_INOUT_FAST_READ_4_BYTE_ADDR_CMD;
  295. s_command.AddressMode = QSPI_ADDRESS_4_LINES;
  296. s_command.DataMode = QSPI_DATA_4_LINES;
  297. s_command.DummyCycles = S25FL128S_DUMMY_CYCLES_READ_QUAD_INOUT;
  298. break;
  299. case S25FL128S_SPI_MODE : /* 1-1-1 commands, Power on H/W default setting */
  300. default:
  301. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  302. s_command.Instruction = S25FL128S_FAST_READ_4_BYTE_ADDR_CMD;
  303. s_command.AddressMode = QSPI_ADDRESS_1_LINE;
  304. s_command.DataMode = QSPI_DATA_1_LINE;
  305. s_command.DummyCycles = S25FL128S_DUMMY_CYCLES_READ;
  306. break;
  307. }
  308. /* Initialize the read command */
  309. s_command.AddressSize = QSPI_ADDRESS_32_BITS;
  310. s_command.Address = ReadAddr;
  311. s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  312. s_command.NbData = Size;
  313. s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  314. s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  315. /* Configure the command */
  316. if (HAL_QSPI_Command(Ctx, &s_command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  317. {
  318. return S25FL128S_ERROR;
  319. }
  320. /* Reception of the data */
  321. if (HAL_QSPI_Receive(Ctx, pData, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  322. {
  323. return S25FL128S_ERROR;
  324. }
  325. return S25FL128S_OK;
  326. }
  327. /**
  328. * @brief Erases the specified block of the QSPI memory.
  329. * S25FL128S support 4K, 64K size block erase commands.
  330. * SPI; 1-0-0/1-1-0
  331. * @param Ctx QSPI handle
  332. * @param Mode Flash mode
  333. * @param BlockAddress Block address to erase
  334. * @param BlockSize 4K or 64K
  335. * @retval QSPI memory status
  336. */
  337. int32_t S25FL128S_BlockErase(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode, uint32_t BlockAddress, S25FL128S_Erase_t BlockSize)
  338. {
  339. QSPI_CommandTypeDef s_command;
  340. UNUSED(Mode); /* The Erase commands are always 1-1-0 or 1-0-0 */
  341. /* Setup erase command */
  342. switch(BlockSize)
  343. {
  344. case S25FL128S_ERASE_64K :
  345. s_command.Instruction = S25FL128S_SECTOR_ERASE_4_BYTE_ADDR_CMD;
  346. s_command.AddressMode = QSPI_ADDRESS_1_LINE;
  347. s_command.AddressSize = QSPI_ADDRESS_32_BITS;
  348. s_command.Address = BlockAddress;
  349. break;
  350. case S25FL128S_ERASE_CHIP :
  351. s_command.Instruction = S25FL128S_BULK_ERASE_ALTERNATE_CMD;
  352. s_command.AddressMode = QSPI_ADDRESS_NONE;
  353. break;
  354. case S25FL128S_ERASE_4K :
  355. default :
  356. s_command.Instruction = S25FL128S_SUBSECTOR_ERASE_4_BYTE_ADDR_CMD_4K;
  357. s_command.AddressMode = QSPI_ADDRESS_1_LINE;
  358. s_command.AddressSize = QSPI_ADDRESS_32_BITS;
  359. s_command.Address = BlockAddress;
  360. break;
  361. }
  362. /* Initialize the erase command */
  363. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  364. s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  365. s_command.DummyCycles = 0;
  366. s_command.DataMode = QSPI_DATA_NONE;
  367. s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  368. s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  369. /* Send the command */
  370. if(HAL_QSPI_Command(Ctx, &s_command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  371. {
  372. return S25FL128S_ERROR;
  373. }
  374. return S25FL128S_OK;
  375. }
  376. /**
  377. * @brief Whole chip erase.
  378. * SPI; 1-0-0
  379. * @param Ctx QSPI handle
  380. * @param Mode Flash mode
  381. * @retval QSPI memory status
  382. */
  383. int32_t S25FL128S_ChipErase(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode)
  384. {
  385. QSPI_CommandTypeDef s_command;
  386. UNUSED(Mode); /* The command Chip Erase is always 1-0-0 */
  387. /* Initialize the erase command */
  388. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  389. s_command.AddressMode = QSPI_ADDRESS_NONE;
  390. s_command.Instruction = S25FL128S_BULK_ERASE_ALTERNATE_CMD;
  391. s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  392. s_command.DummyCycles = 0;
  393. s_command.DataMode = QSPI_DATA_NONE;
  394. s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  395. s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  396. /* Send the command */
  397. if (HAL_QSPI_Command(Ctx, &s_command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  398. {
  399. return S25FL128S_ERROR;
  400. }
  401. return S25FL128S_OK;
  402. }
  403. /**
  404. * @brief Reads an amount of data from the QSPI memory on STR mode.
  405. * SPI/DPI/QPI; 1-1-1/1-1-2/1-2-2/1-1-4/1-4-4
  406. * @param Ctx QSPI handle
  407. * @param Mode Flash mode
  408. * @retval QSPI memory status
  409. */
  410. int32_t S25FL128S_EnableMemoryMappedModeSTR(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode)
  411. {
  412. QSPI_CommandTypeDef s_command;
  413. QSPI_MemoryMappedTypeDef s_mem_mapped_cfg;
  414. switch(Mode)
  415. {
  416. case S25FL128S_SPI_1I2O_MODE : /* 1-1-2 read commands */
  417. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  418. s_command.Instruction = S25FL128S_DUAL_OUT_FAST_READ_4_BYTE_ADDR_CMD;
  419. s_command.AddressMode = QSPI_ADDRESS_1_LINE;
  420. s_command.DataMode = QSPI_DATA_2_LINES;
  421. s_command.DummyCycles = S25FL128S_DUMMY_CYCLES_READ;
  422. break;
  423. case S25FL128S_SPI_2IO_MODE : /* 1-2-2 read commands */
  424. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  425. s_command.Instruction = S25FL128S_DUAL_INOUT_FAST_READ_4_BYTE_ADDR_CMD;
  426. s_command.AddressMode = QSPI_ADDRESS_2_LINES;
  427. s_command.DataMode = QSPI_DATA_2_LINES;
  428. s_command.DummyCycles = S25FL128S_DUMMY_CYCLES_READ_DUAL_INOUT;
  429. break;
  430. case S25FL128S_SPI_1I4O_MODE : /* 1-1-4 read commands */
  431. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  432. s_command.Instruction = S25FL128S_QUAD_OUT_FAST_READ_4_BYTE_ADDR_CMD;
  433. s_command.AddressMode = QSPI_ADDRESS_1_LINE;
  434. s_command.DataMode = QSPI_DATA_4_LINES;
  435. s_command.DummyCycles = S25FL128S_DUMMY_CYCLES_READ;
  436. break;
  437. case S25FL128S_SPI_4IO_MODE : /* 1-4-4 read commands */
  438. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  439. s_command.Instruction = S25FL128S_QUAD_INOUT_FAST_READ_4_BYTE_ADDR_CMD;
  440. s_command.AddressMode = QSPI_ADDRESS_4_LINES;
  441. s_command.DataMode = QSPI_DATA_4_LINES;
  442. s_command.DummyCycles = S25FL128S_DUMMY_CYCLES_READ_QUAD_INOUT;
  443. break;
  444. case S25FL128S_SPI_MODE : /* 1-1-1 commands, Power on H/W default setting */
  445. default:
  446. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  447. s_command.Instruction = S25FL128S_FAST_READ_4_BYTE_ADDR_CMD;
  448. s_command.AddressMode = QSPI_ADDRESS_1_LINE;
  449. s_command.DataMode = QSPI_DATA_1_LINE;
  450. s_command.DummyCycles = S25FL128S_DUMMY_CYCLES_READ;
  451. break;
  452. }
  453. s_command.DummyCycles = S25FL128S_DUMMY_CYCLES_READ;
  454. s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  455. s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  456. /* Configure the command for the read instruction */
  457. s_command.AddressSize = QSPI_ADDRESS_32_BITS;
  458. s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  459. /* Configure the memory mapped mode */
  460. s_mem_mapped_cfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
  461. s_mem_mapped_cfg.TimeOutPeriod = 0x00;
  462. if (HAL_QSPI_MemoryMapped(Ctx, &s_command, &s_mem_mapped_cfg) != HAL_OK)
  463. {
  464. return S25FL128S_ERROR;
  465. }
  466. return S25FL128S_OK;
  467. }
  468. /**
  469. * @brief Read Flash Status register value
  470. * SPI; 1-0-1
  471. * @param Ctx QSPI handle
  472. * @param Mode Flash mode
  473. * @param Value to read from status register
  474. */
  475. int32_t S25FL128S_ReadStatusRegister(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode, uint8_t *Value)
  476. {
  477. QSPI_CommandTypeDef s_command;
  478. UNUSED(Mode); /* The command Read Status Register-1 is always 1-0-1 */
  479. /* Initialize the reading of status register */
  480. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  481. s_command.Instruction = S25FL128S_READ_STATUS_REG1_CMD;
  482. s_command.AddressMode = QSPI_ADDRESS_NONE;
  483. s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  484. s_command.DummyCycles = 0;
  485. s_command.DataMode = QSPI_DATA_1_LINE;
  486. s_command.NbData = 1;
  487. s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  488. s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  489. /* Configure the command */
  490. if (HAL_QSPI_Command(Ctx, &s_command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  491. {
  492. return S25FL128S_ERROR;
  493. }
  494. /* Reception of the data */
  495. if (HAL_QSPI_Receive(Ctx, Value, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  496. {
  497. return S25FL128S_ERROR;
  498. }
  499. return S25FL128S_OK;
  500. }
  501. /**
  502. * @brief Flash reset enable command
  503. * SPI; 1-0-0
  504. * @param Ctx QSPI handle
  505. * @param Mode Flash mode
  506. * @retval QSPI memory status
  507. */
  508. int32_t S25FL128S_ResetEnable(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode)
  509. {
  510. QSPI_CommandTypeDef s_command;
  511. UNUSED(Mode); /* The command Software Reset is always 1-0-0 */
  512. /* Initialize the reset enable command */
  513. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  514. s_command.Instruction = S25FL128S_SOFTWARE_RESET_CMD;
  515. s_command.AddressMode = QSPI_ADDRESS_NONE;
  516. s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  517. s_command.DummyCycles = 0;
  518. s_command.DataMode = QSPI_DATA_NONE;
  519. s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  520. s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  521. /* Send the command */
  522. if (HAL_QSPI_Command(Ctx, &s_command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  523. {
  524. return S25FL128S_ERROR;
  525. }
  526. return S25FL128S_OK;
  527. }
  528. /**
  529. * @brief Flash reset memory command
  530. * SPI; 1-0-0
  531. * @param Ctx QSPI handle
  532. * @param Mode Flash mode
  533. * @retval QSPI memory status
  534. */
  535. int32_t S25FL128S_ResetMemory(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode)
  536. {
  537. QSPI_CommandTypeDef s_command;
  538. UNUSED(Mode); /* The command Software Reset is always 1-0-0 */
  539. /* Initialize the reset enable command */
  540. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  541. s_command.Instruction = S25FL128S_SOFTWARE_RESET_CMD;
  542. s_command.AddressMode = QSPI_ADDRESS_NONE;
  543. s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  544. s_command.DummyCycles = 0;
  545. s_command.DataMode = QSPI_DATA_NONE;
  546. s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  547. s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  548. /* Send the command */
  549. if (HAL_QSPI_Command(Ctx, &s_command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  550. {
  551. return S25FL128S_ERROR;
  552. }
  553. return S25FL128S_OK;
  554. }
  555. /**
  556. * @brief Read Flash 3 Byte IDs.
  557. * Manufacturer ID, Memory type, Memory density
  558. * SPI; 1-0-1
  559. * @param Ctx QSPI handle
  560. * @param Mode Flash mode
  561. * @param ID Flash ID
  562. * @retval QSPI memory status
  563. */
  564. int32_t S25FL128S_ReadID(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode, uint8_t *ID)
  565. {
  566. QSPI_CommandTypeDef s_command;
  567. UNUSED(Mode); /* The command Read Identification is always 1-0-1 */
  568. /* Initialize the read ID command */
  569. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  570. s_command.Instruction = S25FL128S_READ_ID_CMD2;
  571. s_command.AddressMode = QSPI_ADDRESS_NONE;
  572. s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  573. s_command.DataMode = QSPI_DATA_1_LINE;
  574. s_command.NbData = 3;
  575. s_command.DummyCycles = 0;
  576. s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  577. s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  578. /* Configure the command */
  579. if (HAL_QSPI_Command(Ctx, &s_command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  580. {
  581. return S25FL128S_ERROR;
  582. }
  583. /* Reception of the data */
  584. if (HAL_QSPI_Receive(Ctx, ID, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  585. {
  586. return S25FL128S_ERROR;
  587. }
  588. return S25FL128S_OK;
  589. }
  590. /**
  591. * @brief Program/Erases suspend. Interruption Program/Erase operations.
  592. * After the device has entered Erase-Suspended mode,
  593. * system can read any address except the block/sector being Program/Erased.
  594. * SPI; 1-0-0
  595. * @param Ctx QSPI handle
  596. * @param Mode Flash moder
  597. * @retval QSPI memory status
  598. */
  599. int32_t S25FL128S_ProgEraseSuspend(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode)
  600. {
  601. QSPI_CommandTypeDef s_command;
  602. UNUSED(Mode); /* The command Program Erase Suspend is always 1-0-0 */
  603. /* Initialize the S25FL128S_PROG_ERASE_SUSPEND_CMD command */
  604. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  605. s_command.Instruction = S25FL128S_PROG_ERASE_SUSPEND_CMD;
  606. s_command.AddressMode = QSPI_ADDRESS_NONE;
  607. s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  608. s_command.DummyCycles = 0;
  609. s_command.DataMode = QSPI_DATA_NONE;
  610. s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  611. s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  612. /* Configure the command */
  613. if (HAL_QSPI_Command(Ctx, &s_command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  614. {
  615. return S25FL128S_ERROR;
  616. }
  617. return S25FL128S_OK;
  618. }
  619. /**
  620. * @brief Program/Erases resume.
  621. * SPI; 1-0-0
  622. * @param Ctx QSPI handle
  623. * @param Mode Flash mode
  624. * @retval QSPI memory status
  625. */
  626. int32_t S25FL128S_ProgEraseResume(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode)
  627. {
  628. QSPI_CommandTypeDef s_command;
  629. UNUSED(Mode); /* The command Program Erase Resume is always 1-0-0 */
  630. /* Initialize the S25FL128S_PROG_ERASE_RESUME_CMD command */
  631. s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  632. s_command.Instruction = S25FL128S_PROG_ERASE_RESUME_CMD;
  633. s_command.AddressMode = QSPI_ADDRESS_NONE;
  634. s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
  635. s_command.DummyCycles = 0;
  636. s_command.DataMode = QSPI_DATA_NONE;
  637. s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
  638. s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
  639. /* Configure the command */
  640. if (HAL_QSPI_Command(Ctx, &s_command, HAL_QSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  641. {
  642. return S25FL128S_ERROR;
  643. }
  644. return S25FL128S_OK;
  645. }
  646. /**
  647. * @brief Enter deep sleep
  648. * @param Ctx QSPI handle
  649. * @param Mode Flash mode
  650. * @retval QSPI memory status
  651. */
  652. int32_t S25FL128S_EnterDeepPowerDown(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode)
  653. {
  654. UNUSED(Ctx);
  655. UNUSED(Mode);
  656. /* No Deep Power Down command for this memory */
  657. return S25FL128S_ERROR;
  658. }
  659. /**
  660. * @brief Reads an amount of SFDP data from the QSPI memory.
  661. * SFDP : Serial Flash Discoverable Parameter
  662. * @param Ctx QSPI handle
  663. * @param Mode Flash mode
  664. * @param pData Pointer to data to be read
  665. * ReadAddr Read start address
  666. * Size Size of data to read in Byte
  667. * @retval QSPI memory status
  668. */
  669. int32_t S25FL128S_ReadSFDP(QSPI_HandleTypeDef *Ctx, S25FL128S_Interface_t Mode, uint8_t *pData, uint32_t ReadAddr, uint32_t Size)
  670. {
  671. UNUSED(Ctx);
  672. UNUSED(Mode);
  673. UNUSED(pData);
  674. UNUSED(ReadAddr);
  675. UNUSED(Size);
  676. /* No Serial Flash Discoverable Parameter command for this memory */
  677. return S25FL128S_ERROR;
  678. }
  679. /**
  680. * @}
  681. */
  682. /**
  683. * @}
  684. */
  685. /**
  686. * @}
  687. */
  688. /**
  689. * @}
  690. */