mx25lm51245g.c 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459
  1. /**
  2. ******************************************************************************
  3. * @file mx25lm51245g.c
  4. * @modify MCD Application Team
  5. * @brief This file provides the MX25LM51245G OSPI drivers.
  6. ******************************************************************************
  7. * MX25LM51245G action :
  8. * STR Octal IO protocol (SOPI) and DTR Octal IO protocol (DOPI) bits of
  9. * Configuration Register 2 :
  10. * DOPI = 1 and SOPI = 0: Operates in DTR Octal IO protocol (accepts 8-8-8 commands)
  11. * DOPI = 0 and SOPI = 1: Operates in STR Octal IO protocol (accepts 8-8-8 commands)
  12. * DOPI = 0 and SOPI = 0: Operates in Single IO protocol (accepts 1-1-1 commands)
  13. * Enter SOPI mode by configuring DOPI = 0 and SOPI = 1 in CR2-Addr0
  14. * Exit SOPI mode by configuring DOPI = 0 and SOPI = 0 in CR2-Addr0
  15. * Enter DOPI mode by configuring DOPI = 1 and SOPI = 0 in CR2-Addr0
  16. * Exit DOPI mode by configuring DOPI = 0 and SOPI = 0 in CR2-Addr0
  17. *
  18. * Memory commands support STR(Single Transfer Rate) &
  19. * DTR(Double Transfer Rate) modes in OPI
  20. *
  21. * Memory commands support STR(Single Transfer Rate) &
  22. * DTR(Double Transfer Rate) modes in SPI
  23. *
  24. ******************************************************************************
  25. * @attention
  26. *
  27. * <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
  28. * All rights reserved.</center></h2>
  29. *
  30. * This software component is licensed by ST under BSD 3-Clause license,
  31. * the "License"; You may not use this file except in compliance with the
  32. * License. You may obtain a copy of the License at:
  33. * opensource.org/licenses/BSD-3-Clause
  34. *
  35. ******************************************************************************
  36. */
  37. /* Includes ------------------------------------------------------------------*/
  38. #include "mx25lm51245g.h"
  39. /** @addtogroup BSP
  40. * @{
  41. */
  42. /** @addtogroup Components
  43. * @{
  44. */
  45. /** @defgroup MX25LM51245G MX25LM51245G
  46. * @{
  47. */
  48. /** @defgroup MX25LM51245G_Exported_Functions MX25LM51245G Exported Functions
  49. * @{
  50. */
  51. /**
  52. * @brief Get Flash information
  53. * @param pInfo pointer to information structure
  54. * @retval error status
  55. */
  56. int32_t MX25LM51245G_GetFlashInfo(MX25LM51245G_Info_t *pInfo)
  57. {
  58. /* Configure the structure with the memory configuration */
  59. pInfo->FlashSize = MX25LM51245G_FLASH_SIZE;
  60. pInfo->EraseSectorSize = MX25LM51245G_SECTOR_64K;
  61. pInfo->EraseSectorsNumber = (MX25LM51245G_FLASH_SIZE/MX25LM51245G_SECTOR_64K);
  62. pInfo->EraseSubSectorSize = MX25LM51245G_SUBSECTOR_4K;
  63. pInfo->EraseSubSectorNumber = (MX25LM51245G_FLASH_SIZE/MX25LM51245G_SUBSECTOR_4K);
  64. pInfo->EraseSubSector1Size = MX25LM51245G_SUBSECTOR_4K;
  65. pInfo->EraseSubSector1Number = (MX25LM51245G_FLASH_SIZE/MX25LM51245G_SUBSECTOR_4K);
  66. pInfo->ProgPageSize = MX25LM51245G_PAGE_SIZE;
  67. pInfo->ProgPagesNumber = (MX25LM51245G_FLASH_SIZE/MX25LM51245G_PAGE_SIZE);
  68. return MX25LM51245G_OK;
  69. };
  70. /**
  71. * @brief Polling WIP(Write In Progress) bit become to 0
  72. * SPI/OPI;
  73. * @param Ctx Component object pointer
  74. * @param Mode Interface mode
  75. * @param Rate Transfer rate
  76. * @retval error status
  77. */
  78. int32_t MX25LM51245G_AutoPollingMemReady(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate)
  79. {
  80. OSPI_RegularCmdTypeDef s_command = {0};
  81. OSPI_AutoPollingTypeDef s_config = {0};
  82. /* SPI mode and DTR transfer not supported by memory */
  83. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  84. {
  85. return MX25LM51245G_ERROR;
  86. }
  87. /* Configure automatic polling mode to wait for memory ready */
  88. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  89. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  90. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  91. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  92. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  93. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_READ_STATUS_REG_CMD : MX25LM51245G_OCTA_READ_STATUS_REG_CMD;
  94. s_command.AddressMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_ADDRESS_NONE : HAL_OSPI_ADDRESS_8_LINES;
  95. s_command.AddressDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_ADDRESS_DTR_ENABLE : HAL_OSPI_ADDRESS_DTR_DISABLE;
  96. s_command.AddressSize = HAL_OSPI_ADDRESS_32_BITS;
  97. s_command.Address = 0U;
  98. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  99. s_command.DataMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_DATA_1_LINE : HAL_OSPI_DATA_8_LINES;
  100. s_command.DataDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DATA_DTR_ENABLE : HAL_OSPI_DATA_DTR_DISABLE;
  101. s_command.DummyCycles = (Mode == MX25LM51245G_SPI_MODE) ? 0U : ((Rate == MX25LM51245G_DTR_TRANSFER) ? DUMMY_CYCLES_REG_OCTAL_DTR : DUMMY_CYCLES_REG_OCTAL);
  102. s_command.NbData = (Rate == MX25LM51245G_DTR_TRANSFER) ? 2U : 1U;
  103. s_command.DQSMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DQS_ENABLE : HAL_OSPI_DQS_DISABLE;
  104. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  105. s_config.Match = 0U;
  106. s_config.Mask = MX25LM51245G_SR_WIP;
  107. s_config.MatchMode = HAL_OSPI_MATCH_MODE_AND;
  108. s_config.Interval = MX25LM51245G_AUTOPOLLING_INTERVAL_TIME;
  109. s_config.AutomaticStop = HAL_OSPI_AUTOMATIC_STOP_ENABLE;
  110. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  111. {
  112. return MX25LM51245G_ERROR;
  113. }
  114. if (HAL_OSPI_AutoPolling(Ctx, &s_config, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  115. {
  116. return MX25LM51245G_ERROR;
  117. }
  118. return MX25LM51245G_OK;
  119. }
  120. /* Read/Write Array Commands (3/4 Byte Address Command Set) *********************/
  121. /**
  122. * @brief Reads an amount of data from the OSPI memory on STR mode.
  123. * SPI/OPI; 1-1-1/8-8-8
  124. * @param Ctx Component object pointer
  125. * @param Mode Interface mode
  126. * @param AddressSize Address size
  127. * @param pData Pointer to data to be read
  128. * @param ReadAddr Read start address
  129. * @param Size Size of data to read
  130. * @retval OSPI memory status
  131. */
  132. int32_t MX25LM51245G_ReadSTR(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_AddressSize_t AddressSize, uint8_t *pData, uint32_t ReadAddr, uint32_t Size)
  133. {
  134. OSPI_RegularCmdTypeDef s_command = {0};
  135. /* OPI mode and 3-bytes address size not supported by memory */
  136. if ((Mode == MX25LM51245G_OPI_MODE) && (AddressSize == MX25LM51245G_3BYTES_SIZE))
  137. {
  138. return MX25LM51245G_ERROR;
  139. }
  140. /* Initialize the read command */
  141. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  142. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  143. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  144. s_command.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  145. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  146. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? ((AddressSize == MX25LM51245G_3BYTES_SIZE) ? MX25LM51245G_FAST_READ_CMD : MX25LM51245G_4_BYTE_ADDR_FAST_READ_CMD) : MX25LM51245G_OCTA_READ_CMD;
  147. s_command.AddressMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_ADDRESS_1_LINE : HAL_OSPI_ADDRESS_8_LINES;
  148. s_command.AddressDtrMode = HAL_OSPI_ADDRESS_DTR_DISABLE;
  149. s_command.AddressSize = (AddressSize == MX25LM51245G_3BYTES_SIZE) ? HAL_OSPI_ADDRESS_24_BITS : HAL_OSPI_ADDRESS_32_BITS;
  150. s_command.Address = ReadAddr;
  151. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  152. s_command.DataMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_DATA_1_LINE : HAL_OSPI_DATA_8_LINES;
  153. s_command.DataDtrMode = HAL_OSPI_DATA_DTR_DISABLE;
  154. s_command.DummyCycles = (Mode == MX25LM51245G_SPI_MODE) ? DUMMY_CYCLES_READ : DUMMY_CYCLES_READ_OCTAL;
  155. s_command.NbData = Size;
  156. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  157. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  158. /* Send the command */
  159. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  160. {
  161. return MX25LM51245G_ERROR;
  162. }
  163. /* Reception of the data */
  164. if (HAL_OSPI_Receive(Ctx, pData, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  165. {
  166. return MX25LM51245G_ERROR;
  167. }
  168. return MX25LM51245G_OK;
  169. }
  170. /**
  171. * @brief Reads an amount of data from the OSPI memory on DTR mode.
  172. * OPI
  173. * @param Ctx Component object pointer
  174. * @param AddressSize Address size
  175. * @param pData Pointer to data to be read
  176. * @param ReadAddr Read start addressS
  177. * @param Size Size of data to read
  178. * @note Only OPI mode support DTR transfer rate
  179. * @retval OSPI memory status
  180. */
  181. int32_t MX25LM51245G_ReadDTR(OSPI_HandleTypeDef *Ctx, uint8_t *pData, uint32_t ReadAddr, uint32_t Size)
  182. {
  183. OSPI_RegularCmdTypeDef s_command = {0};
  184. /* Initialize the read command */
  185. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  186. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  187. s_command.InstructionMode = HAL_OSPI_INSTRUCTION_8_LINES;
  188. s_command.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
  189. s_command.InstructionSize = HAL_OSPI_INSTRUCTION_16_BITS;
  190. s_command.Instruction = MX25LM51245G_OCTA_READ_DTR_CMD;
  191. s_command.AddressMode = HAL_OSPI_ADDRESS_8_LINES;
  192. s_command.AddressDtrMode = HAL_OSPI_ADDRESS_DTR_ENABLE;
  193. s_command.AddressSize = HAL_OSPI_ADDRESS_32_BITS;
  194. s_command.Address = ReadAddr;
  195. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  196. s_command.DataMode = HAL_OSPI_DATA_8_LINES;
  197. s_command.DataDtrMode = HAL_OSPI_DATA_DTR_ENABLE;
  198. s_command.DummyCycles = DUMMY_CYCLES_READ_OCTAL_DTR;
  199. s_command.NbData = Size;
  200. s_command.DQSMode = HAL_OSPI_DQS_ENABLE;
  201. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  202. /* Send the command */
  203. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  204. {
  205. return MX25LM51245G_ERROR;
  206. }
  207. /* Reception of the data */
  208. if (HAL_OSPI_Receive(Ctx, pData, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  209. {
  210. return MX25LM51245G_ERROR;
  211. }
  212. return MX25LM51245G_OK;
  213. }
  214. /**
  215. * @brief Writes an amount of data to the OSPI memory.
  216. * SPI/OPI
  217. * @param Ctx Component object pointer
  218. * @param Mode Interface mode
  219. * @param AddressSize Address size
  220. * @param pData Pointer to data to be written
  221. * @param WriteAddr Write start address
  222. * @param Size Size of data to write. Range 1 ~ MX25LM51245G_PAGE_SIZE
  223. * @note Address size is forced to 3 Bytes when the 4 Bytes address size
  224. * command is not available for the specified interface mode
  225. * @retval OSPI memory status
  226. */
  227. int32_t MX25LM51245G_PageProgram(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_AddressSize_t AddressSize, uint8_t *pData, uint32_t WriteAddr, uint32_t Size)
  228. {
  229. OSPI_RegularCmdTypeDef s_command = {0};
  230. /* OPI mode and 3-bytes address size not supported by memory */
  231. if ((Mode == MX25LM51245G_OPI_MODE) && (AddressSize == MX25LM51245G_3BYTES_SIZE))
  232. {
  233. return MX25LM51245G_ERROR;
  234. }
  235. /* Initialize the program command */
  236. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  237. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  238. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  239. s_command.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  240. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  241. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? ((AddressSize == MX25LM51245G_3BYTES_SIZE) ? MX25LM51245G_PAGE_PROG_CMD : MX25LM51245G_4_BYTE_PAGE_PROG_CMD) : MX25LM51245G_OCTA_PAGE_PROG_CMD;
  242. s_command.AddressMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_ADDRESS_1_LINE : HAL_OSPI_ADDRESS_8_LINES;
  243. s_command.AddressDtrMode = HAL_OSPI_ADDRESS_DTR_DISABLE;
  244. s_command.AddressSize = (AddressSize == MX25LM51245G_3BYTES_SIZE) ? HAL_OSPI_ADDRESS_24_BITS : HAL_OSPI_ADDRESS_32_BITS;
  245. s_command.Address = WriteAddr;
  246. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  247. s_command.DataMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_DATA_1_LINE : HAL_OSPI_DATA_8_LINES;
  248. s_command.DataDtrMode = HAL_OSPI_DATA_DTR_DISABLE;
  249. s_command.DummyCycles = 0U;
  250. s_command.NbData = Size;
  251. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  252. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  253. /* Configure the command */
  254. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  255. {
  256. return MX25LM51245G_ERROR;
  257. }
  258. /* Transmission of the data */
  259. if (HAL_OSPI_Transmit(Ctx, pData, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  260. {
  261. return MX25LM51245G_ERROR;
  262. }
  263. return MX25LM51245G_OK;
  264. }
  265. /**
  266. * @brief Writes an amount of data to the OSPI memory on DTR mode.
  267. * SPI/OPI
  268. * @param Ctx Component object pointer
  269. * @param pData Pointer to data to be written
  270. * @param WriteAddr Write start address
  271. * @param Size Size of data to write. Range 1 ~ MX25LM51245G_PAGE_SIZE
  272. * @note Only OPI mode support DTR transfer rate
  273. * @retval OSPI memory status
  274. */
  275. int32_t MX25LM51245G_PageProgramDTR(OSPI_HandleTypeDef *Ctx, uint8_t *pData, uint32_t WriteAddr, uint32_t Size)
  276. {
  277. OSPI_RegularCmdTypeDef s_command = {0};
  278. /* Initialize the program command */
  279. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  280. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  281. s_command.InstructionMode = HAL_OSPI_INSTRUCTION_8_LINES;
  282. s_command.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
  283. s_command.InstructionSize = HAL_OSPI_INSTRUCTION_16_BITS;
  284. s_command.Instruction = MX25LM51245G_OCTA_PAGE_PROG_CMD;
  285. s_command.AddressMode = HAL_OSPI_ADDRESS_8_LINES;
  286. s_command.AddressDtrMode = HAL_OSPI_ADDRESS_DTR_ENABLE;
  287. s_command.AddressSize = HAL_OSPI_ADDRESS_32_BITS;
  288. s_command.Address = WriteAddr;
  289. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  290. s_command.DataMode = HAL_OSPI_DATA_8_LINES;
  291. s_command.DataDtrMode = HAL_OSPI_DATA_DTR_ENABLE;
  292. s_command.DummyCycles = 0U;
  293. s_command.NbData = Size;
  294. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  295. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  296. /* Configure the command */
  297. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  298. {
  299. return MX25LM51245G_ERROR;
  300. }
  301. /* Transmission of the data */
  302. if (HAL_OSPI_Transmit(Ctx, pData, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  303. {
  304. return MX25LM51245G_ERROR;
  305. }
  306. return MX25LM51245G_OK;
  307. }
  308. /**
  309. * @brief Erases the specified block of the OSPI memory.
  310. * MX25LM51245G support 4K, 64K size block erase commands.
  311. * SPI/OPI; 1-1-1/8-8-8
  312. * @param Ctx Component object pointer
  313. * @param Mode Interface mode
  314. * @param AddressSize Address size
  315. * @param BlockAddress Block address to erase
  316. * @param BlockSize Block size to erase
  317. * @retval OSPI memory status
  318. */
  319. int32_t MX25LM51245G_BlockErase(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate, MX25LM51245G_AddressSize_t AddressSize, uint32_t BlockAddress, MX25LM51245G_Erase_t BlockSize)
  320. {
  321. OSPI_RegularCmdTypeDef s_command = {0};
  322. /* SPI mode and DTR transfer not supported by memory */
  323. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  324. {
  325. return MX25LM51245G_ERROR;
  326. }
  327. /* OPI mode and 3-bytes address size not supported by memory */
  328. if ((Mode == MX25LM51245G_OPI_MODE) && (AddressSize == MX25LM51245G_3BYTES_SIZE))
  329. {
  330. return MX25LM51245G_ERROR;
  331. }
  332. /* Initialize the erase command */
  333. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  334. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  335. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  336. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  337. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  338. s_command.AddressMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_ADDRESS_1_LINE : HAL_OSPI_ADDRESS_8_LINES;
  339. s_command.AddressDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_ADDRESS_DTR_ENABLE : HAL_OSPI_ADDRESS_DTR_DISABLE;
  340. s_command.AddressSize = (AddressSize == MX25LM51245G_3BYTES_SIZE) ? HAL_OSPI_ADDRESS_24_BITS : HAL_OSPI_ADDRESS_32_BITS;
  341. s_command.Address = BlockAddress;
  342. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  343. s_command.DataMode = HAL_OSPI_DATA_NONE;
  344. s_command.DummyCycles = 0U;
  345. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  346. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  347. switch(Mode)
  348. {
  349. case MX25LM51245G_OPI_MODE :
  350. if(BlockSize == MX25LM51245G_ERASE_64K)
  351. {
  352. s_command.Instruction = MX25LM51245G_OCTA_SECTOR_ERASE_64K_CMD;
  353. }
  354. else
  355. {
  356. s_command.Instruction = MX25LM51245G_OCTA_SUBSECTOR_ERASE_4K_CMD;
  357. }
  358. break;
  359. case MX25LM51245G_SPI_MODE :
  360. default:
  361. if(BlockSize == MX25LM51245G_ERASE_64K)
  362. {
  363. s_command.Instruction = (AddressSize == MX25LM51245G_3BYTES_SIZE) ? MX25LM51245G_SECTOR_ERASE_64K_CMD : MX25LM51245G_4_BYTE_SECTOR_ERASE_64K_CMD;
  364. }
  365. else
  366. {
  367. s_command.Instruction = (AddressSize == MX25LM51245G_3BYTES_SIZE) ? MX25LM51245G_SUBSECTOR_ERASE_4K_CMD : MX25LM51245G_4_BYTE_SUBSECTOR_ERASE_4K_CMD;
  368. }
  369. break;
  370. }
  371. /* Send the command */
  372. if(HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  373. {
  374. return MX25LM51245G_ERROR;
  375. }
  376. return MX25LM51245G_OK;
  377. }
  378. /**
  379. * @brief Whole chip erase.
  380. * SPI/OPI; 1-0-0/8-0-0
  381. * @param Ctx Component object pointer
  382. * @param Mode Interface mode
  383. * @retval error status
  384. */
  385. int32_t MX25LM51245G_ChipErase(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate)
  386. {
  387. OSPI_RegularCmdTypeDef s_command = {0};
  388. /* SPI mode and DTR transfer not supported by memory */
  389. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  390. {
  391. return MX25LM51245G_ERROR;
  392. }
  393. /* Initialize the erase command */
  394. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  395. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  396. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  397. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  398. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  399. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_BULK_ERASE_CMD : MX25LM51245G_OCTA_BULK_ERASE_CMD;
  400. s_command.AddressMode = HAL_OSPI_ADDRESS_NONE;
  401. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  402. s_command.DataMode = HAL_OSPI_DATA_NONE;
  403. s_command.DummyCycles = 0U;
  404. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  405. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  406. /* Send the command */
  407. if(HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  408. {
  409. return MX25LM51245G_ERROR;
  410. }
  411. return MX25LM51245G_OK;
  412. }
  413. /**
  414. * @brief Enable memory mapped mode for the OSPI memory on STR mode.
  415. * SPI/OPI; 1-1-1/8-8-8
  416. * @param Ctx Component object pointer
  417. * @param Mode Interface mode
  418. * @param AddressSize Address size
  419. * @retval OSPI memory status
  420. */
  421. int32_t MX25LM51245G_EnableSTRMemoryMappedMode(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_AddressSize_t AddressSize)
  422. {
  423. OSPI_RegularCmdTypeDef s_command = {0};
  424. OSPI_MemoryMappedTypeDef s_mem_mapped_cfg = {0};
  425. /* OPI mode and 3-bytes address size not supported by memory */
  426. if ((Mode == MX25LM51245G_OPI_MODE) && (AddressSize == MX25LM51245G_3BYTES_SIZE))
  427. {
  428. return MX25LM51245G_ERROR;
  429. }
  430. /* Initialize the read command */
  431. s_command.OperationType = HAL_OSPI_OPTYPE_READ_CFG;
  432. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  433. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  434. s_command.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  435. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  436. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? ((AddressSize == MX25LM51245G_3BYTES_SIZE) ? MX25LM51245G_FAST_READ_CMD : MX25LM51245G_4_BYTE_ADDR_FAST_READ_CMD) : MX25LM51245G_OCTA_READ_CMD;
  437. s_command.AddressMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_ADDRESS_1_LINE : HAL_OSPI_ADDRESS_8_LINES;
  438. s_command.AddressDtrMode = HAL_OSPI_ADDRESS_DTR_DISABLE;
  439. s_command.AddressSize = (AddressSize == MX25LM51245G_3BYTES_SIZE) ? HAL_OSPI_ADDRESS_24_BITS : HAL_OSPI_ADDRESS_32_BITS;
  440. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  441. s_command.DataMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_DATA_1_LINE : HAL_OSPI_DATA_8_LINES;
  442. s_command.DataDtrMode = HAL_OSPI_DATA_DTR_DISABLE;
  443. s_command.DummyCycles = (Mode == MX25LM51245G_SPI_MODE) ? DUMMY_CYCLES_READ : DUMMY_CYCLES_READ_OCTAL;
  444. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  445. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  446. /* Send the read command */
  447. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  448. {
  449. return MX25LM51245G_ERROR;
  450. }
  451. /* Initialize the program command */
  452. s_command.OperationType = HAL_OSPI_OPTYPE_WRITE_CFG;
  453. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? ((AddressSize == MX25LM51245G_3BYTES_SIZE) ? MX25LM51245G_PAGE_PROG_CMD : MX25LM51245G_4_BYTE_PAGE_PROG_CMD) : MX25LM51245G_OCTA_PAGE_PROG_CMD;
  454. s_command.DummyCycles = 0U;
  455. /* Send the write command */
  456. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  457. {
  458. return MX25LM51245G_ERROR;
  459. }
  460. /* Configure the memory mapped mode */
  461. s_mem_mapped_cfg.TimeOutActivation = HAL_OSPI_TIMEOUT_COUNTER_DISABLE;
  462. if (HAL_OSPI_MemoryMapped(Ctx, &s_mem_mapped_cfg) != HAL_OK)
  463. {
  464. return MX25LM51245G_ERROR;
  465. }
  466. return MX25LM51245G_OK;
  467. }
  468. /**
  469. * @brief Enable memory mapped mode for the OSPI memory on DTR mode.
  470. * @param Ctx Component object pointer
  471. * @param Mode Interface mode
  472. * @param AddressSize Address size
  473. * @note Only OPI mode support DTR transfer rate
  474. * @retval OSPI memory status
  475. */
  476. int32_t MX25LM51245G_EnableDTRMemoryMappedMode(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode)
  477. {
  478. /* Prevent unused argument(s) compilation warning */
  479. UNUSED(Mode);
  480. OSPI_RegularCmdTypeDef s_command = {0};
  481. OSPI_MemoryMappedTypeDef s_mem_mapped_cfg = {0};
  482. /* Initialize the read command */
  483. s_command.OperationType = HAL_OSPI_OPTYPE_READ_CFG;
  484. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  485. s_command.InstructionMode = HAL_OSPI_INSTRUCTION_8_LINES;
  486. s_command.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_ENABLE;
  487. s_command.InstructionSize = HAL_OSPI_INSTRUCTION_16_BITS;
  488. s_command.Instruction = MX25LM51245G_OCTA_READ_DTR_CMD;
  489. s_command.AddressMode = HAL_OSPI_ADDRESS_8_LINES;
  490. s_command.AddressDtrMode = HAL_OSPI_ADDRESS_DTR_ENABLE;
  491. s_command.AddressSize = HAL_OSPI_ADDRESS_32_BITS;
  492. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  493. s_command.DataMode = HAL_OSPI_DATA_8_LINES;
  494. s_command.DataDtrMode = HAL_OSPI_DATA_DTR_ENABLE;
  495. s_command.DummyCycles = DUMMY_CYCLES_READ_OCTAL_DTR;
  496. s_command.DQSMode = HAL_OSPI_DQS_ENABLE;
  497. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  498. /* Send the command */
  499. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  500. {
  501. return MX25LM51245G_ERROR;
  502. }
  503. /* Initialize the program command */
  504. s_command.OperationType = HAL_OSPI_OPTYPE_WRITE_CFG;
  505. s_command.Instruction = MX25LM51245G_OCTA_PAGE_PROG_CMD;
  506. s_command.DummyCycles = 0U;
  507. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  508. /* Send the command */
  509. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  510. {
  511. return MX25LM51245G_ERROR;
  512. }
  513. /* Configure the memory mapped mode */
  514. s_mem_mapped_cfg.TimeOutActivation = HAL_OSPI_TIMEOUT_COUNTER_DISABLE;
  515. if (HAL_OSPI_MemoryMapped(Ctx, &s_mem_mapped_cfg) != HAL_OK)
  516. {
  517. return MX25LM51245G_ERROR;
  518. }
  519. return MX25LM51245G_OK;
  520. }
  521. /**
  522. * @brief Flash suspend program or erase command
  523. * SPI/OPI
  524. * @param Ctx Component object pointer
  525. * @param Mode Interface select
  526. * @param Rate Transfer rate STR or DTR
  527. * @retval error status
  528. */
  529. int32_t MX25LM51245G_Suspend(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate)
  530. {
  531. OSPI_RegularCmdTypeDef s_command = {0};
  532. /* SPI mode and DTR transfer not supported by memory */
  533. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  534. {
  535. return MX25LM51245G_ERROR;
  536. }
  537. /* Initialize the suspend command */
  538. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  539. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  540. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  541. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  542. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  543. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_PROG_ERASE_SUSPEND_CMD : MX25LM51245G_OCTA_PROG_ERASE_SUSPEND_CMD;
  544. s_command.AddressMode = HAL_OSPI_ADDRESS_NONE;
  545. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  546. s_command.DataMode = HAL_OSPI_DATA_NONE;
  547. s_command.DummyCycles = 0U;
  548. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  549. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  550. /* Send the command */
  551. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  552. {
  553. return MX25LM51245G_ERROR;
  554. }
  555. return MX25LM51245G_OK;
  556. }
  557. /**
  558. * @brief Flash resume program or erase command
  559. * SPI/OPI
  560. * @param Ctx Component object pointer
  561. * @param Mode Interface select
  562. * @param Rate Transfer rate STR or DTR
  563. * @retval error status
  564. */
  565. int32_t MX25LM51245G_Resume(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate)
  566. {
  567. OSPI_RegularCmdTypeDef s_command = {0};
  568. /* SPI mode and DTR transfer not supported by memory */
  569. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  570. {
  571. return MX25LM51245G_ERROR;
  572. }
  573. /* Initialize the resume command */
  574. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  575. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  576. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  577. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  578. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  579. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_PROG_ERASE_RESUME_CMD : MX25LM51245G_OCTA_PROG_ERASE_RESUME_CMD;
  580. s_command.AddressMode = HAL_OSPI_ADDRESS_NONE;
  581. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  582. s_command.DataMode = HAL_OSPI_DATA_NONE;
  583. s_command.DummyCycles = 0U;
  584. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  585. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  586. /* Send the command */
  587. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  588. {
  589. return MX25LM51245G_ERROR;
  590. }
  591. return MX25LM51245G_OK;
  592. }
  593. /* Register/Setting Commands **************************************************/
  594. /**
  595. * @brief This function send a Write Enable and wait it is effective.
  596. * SPI/OPI
  597. * @param Ctx Component object pointer
  598. * @param Mode Interface mode
  599. * @param Rate Transfer rate STR or DTR
  600. * @retval error status
  601. */
  602. int32_t MX25LM51245G_WriteEnable(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate)
  603. {
  604. OSPI_RegularCmdTypeDef s_command = {0};
  605. OSPI_AutoPollingTypeDef s_config = {0};
  606. /* SPI mode and DTR transfer not supported by memory */
  607. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  608. {
  609. return MX25LM51245G_ERROR;
  610. }
  611. /* Initialize the write enable command */
  612. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  613. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  614. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  615. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  616. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  617. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_WRITE_ENABLE_CMD : MX25LM51245G_OCTA_WRITE_ENABLE_CMD;
  618. s_command.AddressMode = HAL_OSPI_ADDRESS_NONE;
  619. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  620. s_command.DataMode = HAL_OSPI_DATA_NONE;
  621. s_command.DummyCycles = 0U;
  622. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  623. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  624. /* Send the command */
  625. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  626. {
  627. return MX25LM51245G_ERROR;
  628. }
  629. /* Configure automatic polling mode to wait for write enabling */
  630. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_READ_STATUS_REG_CMD : MX25LM51245G_OCTA_READ_STATUS_REG_CMD;
  631. s_command.AddressMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_ADDRESS_NONE : HAL_OSPI_ADDRESS_8_LINES;
  632. s_command.AddressDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_ADDRESS_DTR_ENABLE : HAL_OSPI_ADDRESS_DTR_DISABLE;
  633. s_command.AddressSize = HAL_OSPI_ADDRESS_32_BITS;
  634. s_command.Address = 0U;
  635. s_command.DataMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_DATA_1_LINE : HAL_OSPI_DATA_8_LINES;
  636. s_command.DataDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DATA_DTR_ENABLE : HAL_OSPI_DATA_DTR_DISABLE;
  637. s_command.DummyCycles = (Mode == MX25LM51245G_SPI_MODE) ? 0U : ((Rate == MX25LM51245G_DTR_TRANSFER) ? DUMMY_CYCLES_REG_OCTAL_DTR : DUMMY_CYCLES_REG_OCTAL);
  638. s_command.NbData = (Rate == MX25LM51245G_DTR_TRANSFER) ? 2U : 1U;
  639. s_command.DQSMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DQS_ENABLE : HAL_OSPI_DQS_DISABLE;
  640. /* Send the command */
  641. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  642. {
  643. return MX25LM51245G_ERROR;
  644. }
  645. s_config.Match = 2U;
  646. s_config.Mask = 2U;
  647. s_config.MatchMode = HAL_OSPI_MATCH_MODE_AND;
  648. s_config.Interval = MX25LM51245G_AUTOPOLLING_INTERVAL_TIME;
  649. s_config.AutomaticStop = HAL_OSPI_AUTOMATIC_STOP_ENABLE;
  650. if (HAL_OSPI_AutoPolling(Ctx, &s_config, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  651. {
  652. return MX25LM51245G_ERROR;
  653. }
  654. return MX25LM51245G_OK;
  655. }
  656. /**
  657. * @brief This function reset the (WEN) Write Enable Latch bit.
  658. * SPI/OPI
  659. * @param Ctx Component object pointer
  660. * @param Mode Interface mode
  661. * @param Rate Transfer rate STR or DTR
  662. * @retval error status
  663. */
  664. int32_t MX25LM51245G_WriteDisable(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate)
  665. {
  666. OSPI_RegularCmdTypeDef s_command = {0};
  667. /* SPI mode and DTR transfer not supported by memory */
  668. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  669. {
  670. return MX25LM51245G_ERROR;
  671. }
  672. /* Initialize the write disable command */
  673. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  674. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  675. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  676. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  677. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  678. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_WRITE_DISABLE_CMD : MX25LM51245G_OCTA_WRITE_DISABLE_CMD;
  679. s_command.AddressMode = HAL_OSPI_ADDRESS_NONE;
  680. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  681. s_command.DataMode = HAL_OSPI_DATA_NONE;
  682. s_command.DummyCycles = 0U;
  683. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  684. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  685. /* Send the command */
  686. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  687. {
  688. return MX25LM51245G_ERROR;
  689. }
  690. return MX25LM51245G_OK;
  691. }
  692. /**
  693. * @brief Read Flash Status register value
  694. * SPI/OPI
  695. * @param Ctx Component object pointer
  696. * @param Mode Interface mode
  697. * @param Rate Transfer rate STR or DTR
  698. * @param Value Status register value pointer
  699. * @retval error status
  700. */
  701. int32_t MX25LM51245G_ReadStatusRegister(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate, uint8_t *Value)
  702. {
  703. OSPI_RegularCmdTypeDef s_command = {0};
  704. /* SPI mode and DTR transfer not supported by memory */
  705. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  706. {
  707. return MX25LM51245G_ERROR;
  708. }
  709. /* Initialize the reading of status register */
  710. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  711. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  712. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  713. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  714. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  715. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_READ_STATUS_REG_CMD : MX25LM51245G_OCTA_READ_STATUS_REG_CMD;
  716. s_command.AddressMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_ADDRESS_NONE : HAL_OSPI_ADDRESS_8_LINES;
  717. s_command.AddressDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_ADDRESS_DTR_ENABLE : HAL_OSPI_ADDRESS_DTR_DISABLE;
  718. s_command.AddressSize = HAL_OSPI_ADDRESS_32_BITS;
  719. s_command.Address = 0U;
  720. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  721. s_command.DataMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_DATA_1_LINE : HAL_OSPI_DATA_8_LINES;
  722. s_command.DataDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DATA_DTR_ENABLE : HAL_OSPI_DATA_DTR_DISABLE;
  723. s_command.DummyCycles = (Mode == MX25LM51245G_SPI_MODE) ? 0U : ((Rate == MX25LM51245G_DTR_TRANSFER) ? DUMMY_CYCLES_REG_OCTAL_DTR : DUMMY_CYCLES_REG_OCTAL);
  724. s_command.NbData = (Rate == MX25LM51245G_DTR_TRANSFER) ? 2U : 1U;
  725. s_command.DQSMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DQS_ENABLE : HAL_OSPI_DQS_DISABLE;
  726. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  727. /* Send the command */
  728. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  729. {
  730. return MX25LM51245G_ERROR;
  731. }
  732. /* Reception of the data */
  733. if (HAL_OSPI_Receive(Ctx, Value, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  734. {
  735. return MX25LM51245G_ERROR;
  736. }
  737. return MX25LM51245G_OK;
  738. }
  739. /**
  740. * @brief Write Flash Status register
  741. * SPI/OPI
  742. * @param Ctx Component object pointer
  743. * @param Mode Interface mode
  744. * @param Rate Transfer rate STR or DTR
  745. * @param Value Value to write to Status register
  746. * @retval error status
  747. */
  748. int32_t MX25LM51245G_WriteStatusRegister(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate, uint8_t Value)
  749. {
  750. OSPI_RegularCmdTypeDef s_command = {0};
  751. uint8_t reg[2];
  752. /* SPI mode and DTR transfer not supported by memory */
  753. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  754. {
  755. return MX25LM51245G_ERROR;
  756. }
  757. /* In SPI mode, the status register is configured with configuration register */
  758. if (Mode == MX25LM51245G_SPI_MODE)
  759. {
  760. if (MX25LM51245G_ReadCfgRegister(Ctx, Mode, Rate, &reg[1]) != MX25LM51245G_OK)
  761. {
  762. return MX25LM51245G_ERROR;
  763. }
  764. }
  765. reg[0] = Value;
  766. /* Initialize the writing of status register */
  767. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  768. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  769. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  770. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  771. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  772. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_WRITE_STATUS_REG_CMD : MX25LM51245G_OCTA_WRITE_STATUS_REG_CMD;
  773. s_command.AddressMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_ADDRESS_NONE : HAL_OSPI_ADDRESS_8_LINES;
  774. s_command.AddressDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_ADDRESS_DTR_ENABLE : HAL_OSPI_ADDRESS_DTR_DISABLE;
  775. s_command.AddressSize = HAL_OSPI_ADDRESS_32_BITS;
  776. s_command.Address = 0U;
  777. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  778. s_command.DataMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_DATA_1_LINE : HAL_OSPI_DATA_8_LINES;
  779. s_command.DataDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DATA_DTR_ENABLE : HAL_OSPI_DATA_DTR_DISABLE;
  780. s_command.DummyCycles = 0U;
  781. s_command.NbData = (Mode == MX25LM51245G_SPI_MODE) ? 2U : ((Rate == MX25LM51245G_DTR_TRANSFER) ? 2U : 1U);
  782. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  783. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  784. /* Send the command */
  785. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  786. {
  787. return MX25LM51245G_ERROR;
  788. }
  789. if (HAL_OSPI_Transmit(Ctx, reg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  790. {
  791. return MX25LM51245G_ERROR;
  792. }
  793. return MX25LM51245G_OK;
  794. }
  795. /**
  796. * @brief Write Flash configuration register
  797. * SPI/OPI
  798. * @param Ctx Component object pointer
  799. * @param Mode Interface mode
  800. * @param Rate Transfer rate STR or DTR
  801. * @param Value Value to write to configuration register
  802. * @retval error status
  803. */
  804. int32_t MX25LM51245G_WriteCfgRegister(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate, uint8_t Value)
  805. {
  806. OSPI_RegularCmdTypeDef s_command = {0};
  807. uint8_t reg[2];
  808. /* SPI mode and DTR transfer not supported by memory */
  809. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  810. {
  811. return MX25LM51245G_ERROR;
  812. }
  813. /* In SPI mode, the configuration register is configured with status register */
  814. if (Mode == MX25LM51245G_SPI_MODE)
  815. {
  816. if (MX25LM51245G_ReadStatusRegister(Ctx, Mode, Rate, &reg[0]) != MX25LM51245G_OK)
  817. {
  818. return MX25LM51245G_ERROR;
  819. }
  820. reg[1] = Value;
  821. }
  822. else
  823. {
  824. reg[0] = Value;
  825. }
  826. /* Initialize the writing of configuration register */
  827. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  828. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  829. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  830. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  831. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  832. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_WRITE_STATUS_REG_CMD : MX25LM51245G_OCTA_WRITE_STATUS_REG_CMD;
  833. s_command.AddressMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_ADDRESS_NONE : HAL_OSPI_ADDRESS_8_LINES;
  834. s_command.AddressDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_ADDRESS_DTR_ENABLE : HAL_OSPI_ADDRESS_DTR_DISABLE;
  835. s_command.AddressSize = HAL_OSPI_ADDRESS_32_BITS;
  836. s_command.Address = 1U;
  837. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  838. s_command.DataMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_DATA_1_LINE : HAL_OSPI_DATA_8_LINES;
  839. s_command.DataDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DATA_DTR_ENABLE : HAL_OSPI_DATA_DTR_DISABLE;
  840. s_command.DummyCycles = 0U;
  841. s_command.NbData = (Mode == MX25LM51245G_SPI_MODE) ? 2U : ((Rate == MX25LM51245G_DTR_TRANSFER) ? 2U : 1U);
  842. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  843. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  844. /* Send the command */
  845. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  846. {
  847. return MX25LM51245G_ERROR;
  848. }
  849. if (HAL_OSPI_Transmit(Ctx, reg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  850. {
  851. return MX25LM51245G_ERROR;
  852. }
  853. return MX25LM51245G_OK;
  854. }
  855. /**
  856. * @brief Read Flash configuration register value
  857. * SPI/OPI
  858. * @param Ctx Component object pointer
  859. * @param Mode Interface mode
  860. * @param Rate Transfer rate STR or DTR
  861. * @param Value configuration register value pointer
  862. * @retval error status
  863. */
  864. int32_t MX25LM51245G_ReadCfgRegister(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate, uint8_t *Value)
  865. {
  866. OSPI_RegularCmdTypeDef s_command = {0};
  867. /* SPI mode and DTR transfer not supported by memory */
  868. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  869. {
  870. return MX25LM51245G_ERROR;
  871. }
  872. /* Initialize the reading of configuration register */
  873. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  874. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  875. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  876. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  877. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  878. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_READ_CFG_REG_CMD : MX25LM51245G_OCTA_READ_CFG_REG_CMD;
  879. s_command.AddressMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_ADDRESS_NONE : HAL_OSPI_ADDRESS_8_LINES;
  880. s_command.AddressDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_ADDRESS_DTR_ENABLE : HAL_OSPI_ADDRESS_DTR_DISABLE;
  881. s_command.AddressSize = HAL_OSPI_ADDRESS_32_BITS;
  882. s_command.Address = 1U;
  883. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  884. s_command.DataMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_DATA_1_LINE : HAL_OSPI_DATA_8_LINES;
  885. s_command.DataDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DATA_DTR_ENABLE : HAL_OSPI_DATA_DTR_DISABLE;
  886. s_command.DummyCycles = (Mode == MX25LM51245G_SPI_MODE) ? 0U : ((Rate == MX25LM51245G_DTR_TRANSFER) ? DUMMY_CYCLES_REG_OCTAL_DTR : DUMMY_CYCLES_REG_OCTAL);
  887. s_command.NbData = (Rate == MX25LM51245G_DTR_TRANSFER) ? 2U : 1U;
  888. s_command.DQSMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DQS_ENABLE : HAL_OSPI_DQS_DISABLE;
  889. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  890. /* Send the command */
  891. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  892. {
  893. return MX25LM51245G_ERROR;
  894. }
  895. /* Reception of the data */
  896. if (HAL_OSPI_Receive(Ctx, Value, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  897. {
  898. return MX25LM51245G_ERROR;
  899. }
  900. return MX25LM51245G_OK;
  901. }
  902. /**
  903. * @brief Write Flash configuration register 2
  904. * SPI/OPI
  905. * @param Ctx Component object pointer
  906. * @param Mode Interface mode
  907. * @param Rate Transfer rate STR or DTR
  908. * @param Value Value to write to configuration register
  909. * @retval error status
  910. */
  911. int32_t MX25LM51245G_WriteCfg2Register(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate, uint32_t WriteAddr, uint8_t Value)
  912. {
  913. OSPI_RegularCmdTypeDef s_command = {0};
  914. /* SPI mode and DTR transfer not supported by memory */
  915. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  916. {
  917. return MX25LM51245G_ERROR;
  918. }
  919. /* Initialize the writing of configuration register 2 */
  920. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  921. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  922. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  923. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  924. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  925. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_WRITE_CFG_REG2_CMD : MX25LM51245G_OCTA_WRITE_CFG_REG2_CMD;
  926. s_command.AddressMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_ADDRESS_1_LINE : HAL_OSPI_ADDRESS_8_LINES;
  927. s_command.AddressDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_ADDRESS_DTR_ENABLE : HAL_OSPI_ADDRESS_DTR_DISABLE;
  928. s_command.AddressSize = HAL_OSPI_ADDRESS_32_BITS;
  929. s_command.Address = WriteAddr;
  930. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  931. s_command.DataMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_DATA_1_LINE : HAL_OSPI_DATA_8_LINES;
  932. s_command.DataDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DATA_DTR_ENABLE : HAL_OSPI_DATA_DTR_DISABLE;
  933. s_command.DummyCycles = 0U;
  934. s_command.NbData = (Mode == MX25LM51245G_SPI_MODE) ? 1U : ((Rate == MX25LM51245G_DTR_TRANSFER) ? 2U : 1U);
  935. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  936. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  937. /* Send the command */
  938. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  939. {
  940. return MX25LM51245G_ERROR;
  941. }
  942. if (HAL_OSPI_Transmit(Ctx, &Value, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  943. {
  944. return MX25LM51245G_ERROR;
  945. }
  946. return MX25LM51245G_OK;
  947. }
  948. /**
  949. * @brief Read Flash configuration register 2 value
  950. * SPI/OPI
  951. * @param Ctx Component object pointer
  952. * @param Mode Interface mode
  953. * @param Rate Transfer rate STR or DTR
  954. * @param Value configuration register 2 value pointer
  955. * @retval error status
  956. */
  957. int32_t MX25LM51245G_ReadCfg2Register(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate, uint32_t ReadAddr, uint8_t *Value)
  958. {
  959. OSPI_RegularCmdTypeDef s_command = {0};
  960. /* SPI mode and DTR transfer not supported by memory */
  961. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  962. {
  963. return MX25LM51245G_ERROR;
  964. }
  965. /* Initialize the reading of status register */
  966. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  967. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  968. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  969. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  970. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  971. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_READ_CFG_REG2_CMD : MX25LM51245G_OCTA_READ_CFG_REG2_CMD;
  972. s_command.AddressMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_ADDRESS_1_LINE : HAL_OSPI_ADDRESS_8_LINES;
  973. s_command.AddressDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_ADDRESS_DTR_ENABLE : HAL_OSPI_ADDRESS_DTR_DISABLE;
  974. s_command.AddressSize = HAL_OSPI_ADDRESS_32_BITS;
  975. s_command.Address = ReadAddr;
  976. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  977. s_command.DataMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_DATA_1_LINE : HAL_OSPI_DATA_8_LINES;
  978. s_command.DataDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DATA_DTR_ENABLE : HAL_OSPI_DATA_DTR_DISABLE;
  979. s_command.DummyCycles = (Mode == MX25LM51245G_SPI_MODE) ? 0U : ((Rate == MX25LM51245G_DTR_TRANSFER) ? DUMMY_CYCLES_REG_OCTAL_DTR : DUMMY_CYCLES_REG_OCTAL);
  980. s_command.NbData = (Rate == MX25LM51245G_DTR_TRANSFER) ? 2U : 1U;
  981. s_command.DQSMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DQS_ENABLE : HAL_OSPI_DQS_DISABLE;
  982. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  983. /* Send the command */
  984. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  985. {
  986. return MX25LM51245G_ERROR;
  987. }
  988. /* Reception of the data */
  989. if (HAL_OSPI_Receive(Ctx, Value, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  990. {
  991. return MX25LM51245G_ERROR;
  992. }
  993. return MX25LM51245G_OK;
  994. }
  995. /**
  996. * @brief Write Flash Security register
  997. * SPI/OPI
  998. * @param Ctx Component object pointer
  999. * @param Mode Interface mode
  1000. * @param Rate Transfer rate STR or DTR
  1001. * @param Value Value to write to Security register
  1002. * @retval error status
  1003. */
  1004. int32_t MX25LM51245G_WriteSecurityRegister(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate, uint8_t Value)
  1005. {
  1006. /* Prevent unused argument(s) compilation warning */
  1007. UNUSED(Value);
  1008. OSPI_RegularCmdTypeDef s_command = {0};
  1009. /* SPI mode and DTR transfer not supported by memory */
  1010. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  1011. {
  1012. return MX25LM51245G_ERROR;
  1013. }
  1014. /* Initialize the write of security register */
  1015. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  1016. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  1017. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  1018. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  1019. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  1020. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_WRITE_SECURITY_REG_CMD : MX25LM51245G_OCTA_WRITE_SECURITY_REG_CMD;
  1021. s_command.AddressMode = HAL_OSPI_ADDRESS_NONE;
  1022. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  1023. s_command.DataMode = HAL_OSPI_DATA_NONE;
  1024. s_command.DummyCycles = 0U;
  1025. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  1026. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  1027. /* Send the command */
  1028. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  1029. {
  1030. return MX25LM51245G_ERROR;
  1031. }
  1032. return MX25LM51245G_OK;
  1033. }
  1034. /**
  1035. * @brief Read Flash Security register value
  1036. * SPI/OPI
  1037. * @param Ctx Component object pointer
  1038. * @param Mode Interface mode
  1039. * @param Rate Transfer rate STR or DTR
  1040. * @param Value Security register value pointer
  1041. * @retval error status
  1042. */
  1043. int32_t MX25LM51245G_ReadSecurityRegister(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate, uint8_t *Value)
  1044. {
  1045. OSPI_RegularCmdTypeDef s_command = {0};
  1046. /* SPI mode and DTR transfer not supported by memory */
  1047. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  1048. {
  1049. return MX25LM51245G_ERROR;
  1050. }
  1051. /* Initialize the reading of security register */
  1052. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  1053. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  1054. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  1055. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  1056. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  1057. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_READ_SECURITY_REG_CMD : MX25LM51245G_OCTA_READ_SECURITY_REG_CMD;
  1058. s_command.AddressMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_ADDRESS_NONE : HAL_OSPI_ADDRESS_8_LINES;
  1059. s_command.AddressDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_ADDRESS_DTR_ENABLE : HAL_OSPI_ADDRESS_DTR_DISABLE;
  1060. s_command.AddressSize = HAL_OSPI_ADDRESS_32_BITS;
  1061. s_command.Address = 0U;
  1062. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  1063. s_command.DataMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_DATA_1_LINE : HAL_OSPI_DATA_8_LINES;
  1064. s_command.DataDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DATA_DTR_ENABLE : HAL_OSPI_DATA_DTR_DISABLE;
  1065. s_command.DummyCycles = (Mode == MX25LM51245G_SPI_MODE) ? 0U : ((Rate == MX25LM51245G_DTR_TRANSFER) ? DUMMY_CYCLES_REG_OCTAL_DTR : DUMMY_CYCLES_REG_OCTAL);
  1066. s_command.NbData = (Rate == MX25LM51245G_DTR_TRANSFER) ? 2U : 1U;
  1067. s_command.DQSMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DQS_ENABLE : HAL_OSPI_DQS_DISABLE;
  1068. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  1069. /* Send the command */
  1070. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  1071. {
  1072. return MX25LM51245G_ERROR;
  1073. }
  1074. /* Reception of the data */
  1075. if (HAL_OSPI_Receive(Ctx, Value, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  1076. {
  1077. return MX25LM51245G_ERROR;
  1078. }
  1079. return MX25LM51245G_OK;
  1080. }
  1081. /* ID Commands ****************************************************************/
  1082. /**
  1083. * @brief Read Flash 3 Byte IDs.
  1084. * Manufacturer ID, Memory type, Memory density
  1085. * SPI/OPI; 1-0-1/1-0-8
  1086. * @param Ctx Component object pointer
  1087. * @param Mode Interface mode
  1088. * @param ID 3 bytes IDs pointer
  1089. * @param DualFlash Dual flash mode state
  1090. * @retval error status
  1091. */
  1092. int32_t MX25LM51245G_ReadID(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate, uint8_t *ID)
  1093. {
  1094. OSPI_RegularCmdTypeDef s_command = {0};
  1095. /* SPI mode and DTR transfer not supported by memory */
  1096. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  1097. {
  1098. return MX25LM51245G_ERROR;
  1099. }
  1100. /* Initialize the read ID command */
  1101. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  1102. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  1103. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  1104. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  1105. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  1106. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_READ_ID_CMD : MX25LM51245G_OCTA_READ_ID_CMD;
  1107. s_command.AddressMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_ADDRESS_NONE : HAL_OSPI_ADDRESS_8_LINES;
  1108. s_command.AddressDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_ADDRESS_DTR_ENABLE : HAL_OSPI_ADDRESS_DTR_DISABLE;
  1109. s_command.AddressSize = HAL_OSPI_ADDRESS_32_BITS;
  1110. s_command.Address = 0U;
  1111. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  1112. s_command.DataMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_DATA_1_LINE : HAL_OSPI_DATA_8_LINES;
  1113. s_command.DataDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DATA_DTR_ENABLE : HAL_OSPI_DATA_DTR_DISABLE;
  1114. s_command.DummyCycles = (Mode == MX25LM51245G_SPI_MODE) ? 0U : ((Rate == MX25LM51245G_DTR_TRANSFER) ? DUMMY_CYCLES_REG_OCTAL_DTR : DUMMY_CYCLES_REG_OCTAL);
  1115. s_command.NbData = 3U;
  1116. s_command.DQSMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_DQS_ENABLE : HAL_OSPI_DQS_DISABLE;
  1117. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  1118. /* Configure the command */
  1119. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  1120. {
  1121. return MX25LM51245G_ERROR;
  1122. }
  1123. /* Reception of the data */
  1124. if (HAL_OSPI_Receive(Ctx, ID, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  1125. {
  1126. return MX25LM51245G_ERROR;
  1127. }
  1128. return MX25LM51245G_OK;
  1129. }
  1130. /* Reset Commands *************************************************************/
  1131. /**
  1132. * @brief Flash reset enable command
  1133. * SPI/OPI
  1134. * @param Ctx Component object pointer
  1135. * @param Mode Interface select
  1136. * @param Rate Transfer rate STR or DTR
  1137. * @retval error status
  1138. */
  1139. int32_t MX25LM51245G_ResetEnable(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate)
  1140. {
  1141. OSPI_RegularCmdTypeDef s_command = {0};
  1142. /* SPI mode and DTR transfer not supported by memory */
  1143. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  1144. {
  1145. return MX25LM51245G_ERROR;
  1146. }
  1147. /* Initialize the reset enable command */
  1148. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  1149. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  1150. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  1151. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  1152. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  1153. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_RESET_ENABLE_CMD : MX25LM51245G_OCTA_RESET_ENABLE_CMD;
  1154. s_command.AddressMode = HAL_OSPI_ADDRESS_NONE;
  1155. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  1156. s_command.DataMode = HAL_OSPI_DATA_NONE;
  1157. s_command.DummyCycles = 0U;
  1158. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  1159. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  1160. /* Send the command */
  1161. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  1162. {
  1163. return MX25LM51245G_ERROR;
  1164. }
  1165. return MX25LM51245G_OK;
  1166. }
  1167. /**
  1168. * @brief Flash reset memory command
  1169. * SPI/OPI
  1170. * @param Ctx Component object pointer
  1171. * @param Mode Interface select
  1172. * @param Rate Transfer rate STR or DTR
  1173. * @retval error status
  1174. */
  1175. int32_t MX25LM51245G_ResetMemory(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate)
  1176. {
  1177. OSPI_RegularCmdTypeDef s_command = {0};
  1178. /* SPI mode and DTR transfer not supported by memory */
  1179. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  1180. {
  1181. return MX25LM51245G_ERROR;
  1182. }
  1183. /* Initialize the reset enable command */
  1184. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  1185. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  1186. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  1187. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  1188. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  1189. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_RESET_MEMORY_CMD : MX25LM51245G_OCTA_RESET_MEMORY_CMD;
  1190. s_command.AddressMode = HAL_OSPI_ADDRESS_NONE;
  1191. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  1192. s_command.DataMode = HAL_OSPI_DATA_NONE;
  1193. s_command.DummyCycles = 0U;
  1194. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  1195. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  1196. /* Send the command */
  1197. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  1198. {
  1199. return MX25LM51245G_ERROR;
  1200. }
  1201. return MX25LM51245G_OK;
  1202. }
  1203. /**
  1204. * @brief Flash no operation command
  1205. * SPI/OPI
  1206. * @param Ctx Component object pointer
  1207. * @param Mode Interface select
  1208. * @param Rate Transfer rate STR or DTR
  1209. * @retval error status
  1210. */
  1211. int32_t MX25LM51245G_NoOperation(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate)
  1212. {
  1213. OSPI_RegularCmdTypeDef s_command = {0};
  1214. /* SPI mode and DTR transfer not supported by memory */
  1215. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  1216. {
  1217. return MX25LM51245G_ERROR;
  1218. }
  1219. /* Initialize the no operation command */
  1220. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  1221. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  1222. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  1223. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  1224. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  1225. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_NOP_CMD : MX25LM51245G_OCTA_NOP_CMD;
  1226. s_command.AddressMode = HAL_OSPI_ADDRESS_NONE;
  1227. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  1228. s_command.DataMode = HAL_OSPI_DATA_NONE;
  1229. s_command.DummyCycles = 0U;
  1230. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  1231. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  1232. /* Send the command */
  1233. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  1234. {
  1235. return MX25LM51245G_ERROR;
  1236. }
  1237. return MX25LM51245G_OK;
  1238. }
  1239. /**
  1240. * @brief Flash enter deep power-down command
  1241. * SPI/OPI
  1242. * @param Ctx Component object pointer
  1243. * @param Mode Interface select
  1244. * @param Rate Transfer rate STR or DTR
  1245. * @retval error status
  1246. */
  1247. int32_t MX25LM51245G_EnterPowerDown(OSPI_HandleTypeDef *Ctx, MX25LM51245G_Interface_t Mode, MX25LM51245G_Transfer_t Rate)
  1248. {
  1249. OSPI_RegularCmdTypeDef s_command = {0};
  1250. /* SPI mode and DTR transfer not supported by memory */
  1251. if ((Mode == MX25LM51245G_SPI_MODE) && (Rate == MX25LM51245G_DTR_TRANSFER))
  1252. {
  1253. return MX25LM51245G_ERROR;
  1254. }
  1255. /* Initialize the enter power down command */
  1256. s_command.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;
  1257. s_command.FlashId = HAL_OSPI_FLASH_ID_1;
  1258. s_command.InstructionMode = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_1_LINE : HAL_OSPI_INSTRUCTION_8_LINES;
  1259. s_command.InstructionDtrMode = (Rate == MX25LM51245G_DTR_TRANSFER) ? HAL_OSPI_INSTRUCTION_DTR_ENABLE : HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  1260. s_command.InstructionSize = (Mode == MX25LM51245G_SPI_MODE) ? HAL_OSPI_INSTRUCTION_8_BITS : HAL_OSPI_INSTRUCTION_16_BITS;
  1261. s_command.Instruction = (Mode == MX25LM51245G_SPI_MODE) ? MX25LM51245G_ENTER_DEEP_POWER_DOWN_CMD : MX25LM51245G_OCTA_ENTER_DEEP_POWER_DOWN_CMD;
  1262. s_command.AddressMode = HAL_OSPI_ADDRESS_NONE;
  1263. s_command.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  1264. s_command.DataMode = HAL_OSPI_DATA_NONE;
  1265. s_command.DummyCycles = 0U;
  1266. s_command.DQSMode = HAL_OSPI_DQS_DISABLE;
  1267. s_command.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
  1268. /* Send the command */
  1269. if (HAL_OSPI_Command(Ctx, &s_command, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
  1270. {
  1271. return MX25LM51245G_ERROR;
  1272. }
  1273. return MX25LM51245G_OK;
  1274. }
  1275. /**
  1276. * @}
  1277. */
  1278. /**
  1279. * @}
  1280. */
  1281. /**
  1282. * @}
  1283. */
  1284. /**
  1285. * @}
  1286. */
  1287. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/