spi.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. #include "spi.h"
  2. void SPI_Init(SPI_TypeDef *spi, SPI_SclkDivTypeDef div)
  3. {
  4. SPI_Reset(spi);
  5. spi->CTRL = div | SPI_CTRL_LITTLE_ENDIAN;
  6. }
  7. void SPI_Send(SPI_TypeDef *spi, int tx_bytes, const uint32_t tx_data)
  8. {
  9. // When sending more than 4 bytes, the first 4 bytes are from tx_data and the rest are dummy.
  10. ASSERT(tx_bytes <= SPI_PHASE_BYTE_CNT_MAX);
  11. SPI_SetPhaseCtrl(spi, SPI_PHASE_0, SPI_PHASE_ACTION_TX, SPI_PHASE_MODE_SINGLE, tx_bytes);
  12. SPI_SetPhaseData(spi, SPI_PHASE_0, tx_data);
  13. SPI_Start(spi, SPI_CTRL_PHASE_CNT1, SPI_CTRL_DMA_OFF, SPI_INTERRUPT_OFF);
  14. SPI_WaitForDone(spi);
  15. }
  16. void SPI_SendDMAStart(SPI_TypeDef *spi, int tx_bytes, const uint32_t *tx_data, DMAC_ChannelNumTypeDef channel)
  17. {
  18. // If tx_bytes is no more than 4, use SPI_Send.
  19. ASSERT(tx_bytes > 4 && tx_bytes <= SPI_PHASE_BYTE_CNT_MAX);
  20. SPI_SetPhaseCtrl(spi, SPI_PHASE_0, SPI_PHASE_ACTION_TX, SPI_PHASE_MODE_SINGLE, 4);
  21. SPI_SetPhaseData(spi, SPI_PHASE_0, *tx_data);
  22. SPI_SetPhaseCtrl(spi, SPI_PHASE_1, SPI_PHASE_ACTION_TX, SPI_PHASE_MODE_SINGLE, tx_bytes - 4);
  23. DMAC_Config(channel, (uint32_t)(tx_data + 1), (uint32_t)&spi->PHASE_DATA[SPI_PHASE_1],
  24. DMAC_ADDR_INCR_ON, DMAC_ADDR_INCR_OFF, DMAC_WIDTH_32_BIT, DMAC_WIDTH_32_BIT,
  25. DMAC_BURST_1, DMAC_BURST_1, 0, DMAC_MEM_TO_PERIPHERAL_PERIPHERAL_CTRL,
  26. 0, SPI_TX_DMA_REQ(spi));
  27. SPI_Start(spi, SPI_CTRL_PHASE_CNT2, SPI_CTRL_DMA_ON, SPI_INTERRUPT_OFF);
  28. }
  29. void SPI_DMAWait(SPI_TypeDef *spi, DMAC_ChannelNumTypeDef channel)
  30. {
  31. SPI_WaitForDone(spi);
  32. DMAC_HaltChannel(channel);
  33. }
  34. void SPI_SendDMA(SPI_TypeDef *spi, int tx_bytes, const uint32_t *tx_data, DMAC_ChannelNumTypeDef channel)
  35. {
  36. SPI_SendDMAStart(spi, tx_bytes, tx_data, channel);
  37. SPI_DMAWait(spi, channel);
  38. }
  39. uint32_t SPI_SendAndReceive(SPI_TypeDef *spi, int tx_bytes, const uint32_t tx_data, int rx_bytes)
  40. {
  41. // When sending more than 4 bytes, the first 4 bytes are from tx_data and the rest are dummy.
  42. ASSERT(tx_bytes <= SPI_PHASE_BYTE_CNT_MAX && rx_bytes <= 4); // Can receive up to 4 bytes.
  43. SPI_SetPhaseCtrl(spi, SPI_PHASE_0, SPI_PHASE_ACTION_TX, SPI_PHASE_MODE_SINGLE, tx_bytes);
  44. SPI_SetPhaseData(spi, SPI_PHASE_0, tx_data);
  45. if (SPI_RX_PIPELINE) {
  46. SPI_SetPhaseCtrl(spi, SPI_PHASE_1, SPI_PHASE_ACTION_DUMMY_TX, SPI_PHASE_MODE_QUAD, 1);
  47. }
  48. SPI_SetPhaseCtrl(spi, SPI_RX_PIPELINE ? SPI_PHASE_2 : SPI_PHASE_1, SPI_PHASE_ACTION_RX, SPI_PHASE_MODE_SINGLE, rx_bytes);
  49. SPI_Start(spi, SPI_RX_PIPELINE ? SPI_CTRL_PHASE_CNT3 : SPI_CTRL_PHASE_CNT2, SPI_CTRL_DMA_OFF, SPI_INTERRUPT_OFF);
  50. SPI_WaitForDone(spi);
  51. return SPI_GetPhaseData(spi, SPI_RX_PIPELINE ? SPI_PHASE_2 : SPI_PHASE_1);
  52. }
  53. void SPI_SendAndReceiveDMAStart(SPI_TypeDef *spi, int tx_bytes, const uint32_t *tx_data,
  54. int rx_bytes, uint32_t *rx_data, DMAC_ChannelNumTypeDef channel)
  55. {
  56. ASSERT(tx_bytes <= (SPI_RX_PIPELINE ? 24 : 28) && rx_bytes <= SPI_PHASE_BYTE_CNT_MAX);
  57. SPI_PhaseNumberTypeDef phase = SPI_PHASE_0;
  58. while (tx_bytes > 0) {
  59. int bytes = tx_bytes > 4 ? 4 : tx_bytes;
  60. SPI_SetPhaseCtrl(spi, phase, SPI_PHASE_ACTION_TX, SPI_PHASE_MODE_SINGLE, bytes);
  61. SPI_SetPhaseData(spi, phase++, *tx_data++);
  62. tx_bytes -= bytes;
  63. }
  64. if (SPI_RX_PIPELINE) {
  65. SPI_SetPhaseCtrl(spi, phase++, SPI_PHASE_ACTION_DUMMY_TX, SPI_PHASE_MODE_QUAD, 1);
  66. }
  67. SPI_SetPhaseCtrl(spi, phase, SPI_PHASE_ACTION_RX, SPI_PHASE_MODE_SINGLE, rx_bytes);
  68. DMAC_Config(channel, (uint32_t)&spi->PHASE_DATA[phase], (uint32_t)rx_data,
  69. DMAC_ADDR_INCR_OFF, DMAC_ADDR_INCR_ON, DMAC_WIDTH_32_BIT, DMAC_WIDTH_32_BIT,
  70. DMAC_BURST_1, DMAC_BURST_1, 0, DMAC_PERIPHERAL_TO_MEM_PERIPHERAL_CTRL,
  71. SPI_RX_DMA_REQ(spi), 0);
  72. SPI_Start(spi, phase << SPI_CTRL_PHASE_CNT_OFFSET, SPI_CTRL_DMA_ON, SPI_INTERRUPT_OFF);
  73. }
  74. void SPI_SendAndReceiveDMA(SPI_TypeDef *spi, int tx_bytes, const uint32_t *tx_data,
  75. int rx_bytes, uint32_t *rx_data, DMAC_ChannelNumTypeDef channel)
  76. {
  77. SPI_SendAndReceiveDMAStart(spi, tx_bytes, tx_data, rx_bytes, rx_data, channel);
  78. SPI_DMAWait(spi, channel);
  79. }
  80. void SPI_FLASH_SetCmdPhase(SPI_TypeDef *spi, uint32_t cmd)
  81. {
  82. // Command phase is always the first phase and tx 1 byte in single mode
  83. SPI_SetPhaseCtrl(spi, SPI_PHASE_0, SPI_PHASE_ACTION_TX, SPI_PHASE_MODE_SINGLE, 1);
  84. SPI_SetPhaseData(spi, SPI_PHASE_0, cmd);
  85. }
  86. void SPI_FLASH_SetCmdAddrPhase(SPI_TypeDef *spi, uint32_t cmd, uint32_t addr)
  87. {
  88. // Command + address make the first phase and tx 4 bytes in single mode
  89. SPI_SetPhaseCtrl(spi, SPI_PHASE_0, SPI_PHASE_ACTION_TX, SPI_PHASE_MODE_SINGLE, 4);
  90. addr = SPI_FLASH_ADDR(addr);
  91. SPI_SetPhaseData(spi, SPI_PHASE_0, cmd | (addr << SPI_PHASE_BYTE_CNT_OFFSET));
  92. }
  93. // 1 byte of command without any extra address or data
  94. void SPI_FLASH_SingleCmd(SPI_TypeDef *spi, uint32_t cmd)
  95. {
  96. SPI_Send(spi, 1, cmd);
  97. }
  98. // 1 byte of command with 3 bytes of address and no data
  99. void SPI_FLASH_SingleCmdAddr(SPI_TypeDef *spi, uint32_t cmd, uint32_t addr)
  100. {
  101. SPI_Send(spi, 4, SPI_FLASH_CMD_ADDR(cmd, addr));
  102. }
  103. void SPI_FLASH_WaitForWrite(SPI_TypeDef *spi, SPI_InterruptTypeDef interrupt)
  104. {
  105. SPI_FLASH_SetCmdPhase(spi, SPI_FLASH_CMD_RDSR);
  106. if (SPI_RX_PIPELINE) {
  107. SPI_SetPhaseCtrl(spi, SPI_PHASE_1, SPI_PHASE_ACTION_DUMMY_TX, SPI_PHASE_MODE_QUAD, 1);
  108. }
  109. const int rx_phase = SPI_RX_PIPELINE ? SPI_PHASE_2 : SPI_PHASE_1;
  110. const int phase_cnt = SPI_RX_PIPELINE ? SPI_CTRL_PHASE_CNT3 : SPI_CTRL_PHASE_CNT2;
  111. SPI_SetPhaseCtrl(spi, rx_phase, SPI_PHASE_ACTION_POLL, SPI_PHASE_MODE_SINGLE, 0);
  112. SPI_SetPhaseData(spi, rx_phase, SPI_FLASH_WIP_FLAG << 16);
  113. SPI_Start(spi, phase_cnt, SPI_CTRL_DMA_OFF, interrupt);
  114. if (interrupt == SPI_INTERRUPT_OFF) {
  115. SPI_WaitForDone(spi);
  116. }
  117. }
  118. uint32_t SPI_FLASH_ReadID(SPI_TypeDef *spi)
  119. {
  120. return SPI_SendAndReceive(spi, 1, SPI_FLASH_CMD_RDID, 3);
  121. }
  122. uint32_t SPI_FLASH_ReadManufacturerID(SPI_TypeDef *spi)
  123. {
  124. return SPI_SendAndReceive(spi, 4, SPI_FLASH_CMD_ADDR(SPI_FLASH_CMD_REMS, 0), 2);
  125. }
  126. uint32_t SPI_FLASH_GetCapacity(SPI_TypeDef *spi)
  127. {
  128. return SPI_SendAndReceive(spi, 5, SPI_FLASH_CMD_ADDR(SPI_FLASH_CMD_SFDP, 0x34), 4);
  129. }
  130. void SPI_FLASH_ReadUniqueID(SPI_TypeDef *spi, uint32_t *uid, DMAC_ChannelNumTypeDef channel)
  131. {
  132. uint32_t data[2] = {SPI_FLASH_CMD_RDUID, 0};
  133. SPI_SendAndReceiveDMA(spi, 5, data, 16, uid, channel);
  134. }
  135. uint32_t SPI_FLASH_ReleaseDP(SPI_TypeDef *spi)
  136. {
  137. return SPI_SendAndReceive(spi, 4, SPI_FLASH_CMD_RDP, 1);
  138. }
  139. uint16_t SPI_FLASH_ReadStatus(SPI_TypeDef *spi)
  140. {
  141. return SPI_SendAndReceive(spi, 1, SPI_FLASH_CMD_RDSR, 1) | SPI_SendAndReceive(spi, 1, SPI_FLASH_CMD_RDSR2, 1) << 8;
  142. }
  143. void SPI_FLASH_WriteStatus(SPI_TypeDef *spi, uint16_t status)
  144. {
  145. SPI_FLASH_WriteEnable(spi);
  146. SPI_Send(spi, 3, SPI_FLASH_CMD_WRSR | status << 8);
  147. SPI_FLASH_WaitForWrite(spi, SPI_INTERRUPT_OFF);
  148. }
  149. void SPI_FLASH_QuadEnable(SPI_TypeDef *spi)
  150. {
  151. uint16_t status = SPI_FLASH_ReadStatus(spi);
  152. if (!(status & SPI_FLASH_QE_FLAG)) {
  153. SPI_FLASH_WriteStatus(spi, status | SPI_FLASH_QE_FLAG);
  154. }
  155. }
  156. void SPI_FLASH_QuadDisable(SPI_TypeDef *spi)
  157. {
  158. uint16_t status = SPI_FLASH_ReadStatus(spi);
  159. if (status & SPI_FLASH_QE_FLAG) {
  160. SPI_FLASH_WriteStatus(spi, status & ~SPI_FLASH_QE_FLAG);
  161. }
  162. }
  163. void SPI_FLASH_EraseSector(SPI_TypeDef *spi, uint32_t addr, SPI_InterruptTypeDef interrupt)
  164. {
  165. SPI_FLASH_WriteEnable(spi);
  166. SPI_FLASH_SingleCmdAddr(spi, SPI_FLASH_CMD_SE, addr);
  167. SPI_FLASH_WaitForWrite(spi, interrupt);
  168. }
  169. void SPI_FLASH_EraseBlock(SPI_TypeDef *spi, uint32_t addr, SPI_InterruptTypeDef interrupt)
  170. {
  171. SPI_FLASH_WriteEnable(spi);
  172. SPI_FLASH_SingleCmdAddr(spi, SPI_FLASH_CMD_BE, addr);
  173. SPI_FLASH_WaitForWrite(spi, interrupt);
  174. }
  175. void SPI_FLASH_EraseChip(SPI_TypeDef *spi, SPI_InterruptTypeDef interrupt)
  176. {
  177. SPI_FLASH_WriteEnable(spi);
  178. SPI_FLASH_SingleCmd(spi, SPI_FLASH_CMD_CE);
  179. SPI_FLASH_WaitForWrite(spi, interrupt);
  180. }
  181. // Program a flash page, length must be <=256 and the range [addr, addr + length) cannot go across page boundary.
  182. void SPI_FLASH_WritePage(SPI_TypeDef *spi, uint32_t *buf, uint32_t addr, uint32_t length, SPI_PhaseModeTypeDef mode,
  183. DMAC_ChannelNumTypeDef channel, SPI_InterruptTypeDef interrupt)
  184. {
  185. uint32_t cmd = mode == SPI_PHASE_MODE_SINGLE ? SPI_FLASH_CMD_PP : mode == SPI_PHASE_MODE_DUAL ? SPI_FLASH_CMD_DPP : SPI_FLASH_CMD_QPP;
  186. SPI_FLASH_WriteEnable(spi);
  187. SPI_FLASH_SetCmdAddrPhase(spi, cmd, addr);
  188. SPI_SetPhaseCtrl(spi, SPI_PHASE_1, SPI_PHASE_ACTION_TX, mode, length);
  189. DMAC_Config(channel, (uint32_t)buf, (uint32_t)&spi->PHASE_DATA[SPI_PHASE_1],
  190. DMAC_ADDR_INCR_ON, DMAC_ADDR_INCR_OFF, DMAC_WIDTH_32_BIT, DMAC_WIDTH_32_BIT,
  191. DMAC_BURST_1, DMAC_BURST_1, 0, DMAC_MEM_TO_PERIPHERAL_PERIPHERAL_CTRL,
  192. 0, SPI_TX_DMA_REQ(spi));
  193. SPI_Start(spi, SPI_CTRL_PHASE_CNT2, SPI_CTRL_DMA_ON, SPI_INTERRUPT_OFF);
  194. SPI_WaitForDone(spi);
  195. DMAC_HaltChannel(channel);
  196. SPI_FLASH_WaitForWrite(spi, interrupt);
  197. }
  198. void SPI_FLASH_ReadSector(SPI_TypeDef *spi, uint32_t *buf, uint32_t addr, uint32_t length, SPI_PhaseModeTypeDef mode,
  199. DMAC_ChannelNumTypeDef channel, SPI_InterruptTypeDef interrupt)
  200. {
  201. length = (length <= SPI_PHASE_BYTE_CNT_MAX ? length : SPI_PHASE_BYTE_CNT_MAX);
  202. uint32_t cmd = mode == SPI_PHASE_MODE_SINGLE ? SPI_FLASH_CMD_FREAD : mode == SPI_PHASE_MODE_DUAL ? SPI_FLASH_CMD_2READ : SPI_FLASH_CMD_4READ;
  203. int dummy_bytes = mode == SPI_PHASE_MODE_QUAD ? 3 : 1;
  204. SPI_FLASH_SetCmdPhase(spi, cmd);
  205. SPI_SetPhaseCtrl(spi, SPI_PHASE_1, SPI_PHASE_ACTION_TX, mode, 3 + dummy_bytes); // 3 bytes address + dummy
  206. SPI_SetPhaseData(spi, SPI_PHASE_1, SPI_FLASH_ADDR(addr));
  207. if (SPI_RX_PIPELINE) {
  208. SPI_SetPhaseCtrl(spi, SPI_PHASE_2, SPI_PHASE_ACTION_DUMMY_TX, SPI_PHASE_MODE_QUAD, 1);
  209. }
  210. int rx_phase = SPI_RX_PIPELINE ? SPI_PHASE_3 : SPI_PHASE_2;
  211. int phase_cnt = SPI_RX_PIPELINE ? SPI_CTRL_PHASE_CNT4 : SPI_CTRL_PHASE_CNT3;
  212. SPI_SetPhaseCtrl(spi, rx_phase, SPI_PHASE_ACTION_RX, mode, length);
  213. DMAC_Config(channel, (uint32_t)&spi->PHASE_DATA[rx_phase], (uint32_t)buf,
  214. DMAC_ADDR_INCR_OFF, DMAC_ADDR_INCR_ON, DMAC_WIDTH_32_BIT, DMAC_WIDTH_32_BIT,
  215. DMAC_BURST_1, DMAC_BURST_1, 0, DMAC_PERIPHERAL_TO_MEM_PERIPHERAL_CTRL,
  216. SPI_RX_DMA_REQ(spi), 0);
  217. SPI_Start(spi, phase_cnt, SPI_CTRL_DMA_ON, interrupt);
  218. if (interrupt == SPI_INTERRUPT_OFF) {
  219. SPI_WaitForDone(spi);
  220. DMAC_HaltChannel(channel);
  221. }
  222. }
  223. void SPI_FLASH_Erase(SPI_TypeDef *spi, uint32_t addr, int total)
  224. {
  225. while (total > 0) {
  226. uint32_t block_start = addr & SPI_FLASH_BLOCK_MASK;
  227. uint32_t sector_start = addr & SPI_FLASH_SECTOR_MASK;
  228. uint32_t erase_size;
  229. bool use_block_erase = (addr - block_start + total > SPI_FLASH_BLOCK_SIZE - SPI_FLASH_SECTOR_SIZE);
  230. if (block_start == sector_start && use_block_erase) {
  231. erase_size = (block_start + SPI_FLASH_BLOCK_SIZE - addr);
  232. SPI_FLASH_EraseBlock(spi, addr, SPI_INTERRUPT_OFF);
  233. } else {
  234. erase_size = (sector_start + SPI_FLASH_SECTOR_SIZE - addr);
  235. SPI_FLASH_EraseSector(spi, addr, SPI_INTERRUPT_OFF);
  236. }
  237. addr += erase_size;
  238. total -= erase_size;
  239. }
  240. }
  241. void SPI_FLASH_Read(SPI_TypeDef *spi, uint32_t *buf, uint32_t addr, int total, SPI_PhaseModeTypeDef mode, DMAC_ChannelNumTypeDef channel)
  242. {
  243. while (total > 0) {
  244. uint32_t length = total > SPI_PHASE_BYTE_CNT_MAX ? SPI_PHASE_BYTE_CNT_MAX : total;
  245. SPI_FLASH_ReadSector(spi, buf, addr, length, mode, channel, SPI_INTERRUPT_OFF);
  246. addr += length ;
  247. total -= length;
  248. buf += length / 4;
  249. }
  250. }
  251. void SPI_FLASH_Write(SPI_TypeDef *spi, uint32_t *buf, uint32_t addr, int total, SPI_PhaseModeTypeDef mode, DMAC_ChannelNumTypeDef channel)
  252. {
  253. while (total > 0) {
  254. uint32_t length = ((addr + SPI_FLASH_PAGE_SIZE) & SPI_FLASH_PAGE_MASK) - addr;
  255. if ((int)length > total) {
  256. length = total;
  257. }
  258. SPI_FLASH_WritePage(spi, buf, addr, length, mode, channel, SPI_INTERRUPT_OFF);
  259. addr += length;
  260. total -= length;
  261. buf += length / 4;
  262. }
  263. }
  264. // SPI PSRAM functions
  265. void SPI_PRAM_EnableQPI(SPI_TypeDef *spi)
  266. {
  267. SPI_FLASH_SingleCmd(spi, SPI_PSRAM_CMD_QPI_EN);
  268. }
  269. void SPI_PRAM_DisableQPI(SPI_TypeDef *spi)
  270. {
  271. SPI_SetPhaseCtrl(spi, SPI_PHASE_0, SPI_PHASE_ACTION_TX, SPI_PHASE_MODE_QUAD, 1);
  272. SPI_SetPhaseData(spi, SPI_PHASE_0, SPI_PSRAM_CMD_QPI_DIS);
  273. SPI_Start(spi, SPI_CTRL_PHASE_CNT1, SPI_CTRL_DMA_OFF, SPI_INTERRUPT_OFF);
  274. SPI_WaitForDone(spi);
  275. }
  276. void SPI_PSRAM_WritePage(SPI_TypeDef *spi, uint32_t *buf, uint32_t addr, uint32_t length, SPI_PhaseModeTypeDef mode,
  277. DMAC_ChannelNumTypeDef channel, SPI_InterruptTypeDef interrupt, bool qpi_mode)
  278. {
  279. uint32_t cmd = mode == SPI_PHASE_MODE_SINGLE ? SPI_PSRAM_CMD_WRITE : SPI_PSRAM_CMD_QWRITE;
  280. SPI_SetPhaseCtrl(spi, SPI_PHASE_0, SPI_PHASE_ACTION_TX, qpi_mode ? mode : SPI_PHASE_MODE_SINGLE, 1);
  281. SPI_SetPhaseData(spi, SPI_PHASE_0, cmd);
  282. SPI_SetPhaseCtrl(spi, SPI_PHASE_1, SPI_PHASE_ACTION_TX, mode, 3);
  283. SPI_SetPhaseData(spi, SPI_PHASE_1, SPI_FLASH_ADDR(addr));
  284. SPI_SetPhaseCtrl(spi, SPI_PHASE_2, SPI_PHASE_ACTION_TX, mode, length);
  285. DMAC_Config(channel, (uint32_t)buf, (uint32_t)&spi->PHASE_DATA[SPI_PHASE_2],
  286. DMAC_ADDR_INCR_ON, DMAC_ADDR_INCR_OFF, DMAC_WIDTH_32_BIT, DMAC_WIDTH_32_BIT,
  287. DMAC_BURST_1, DMAC_BURST_1, 0, DMAC_MEM_TO_PERIPHERAL_PERIPHERAL_CTRL,
  288. 0, SPI_TX_DMA_REQ(spi));
  289. SPI_Start(spi, SPI_CTRL_PHASE_CNT3, SPI_CTRL_DMA_ON, SPI_INTERRUPT_OFF);
  290. SPI_WaitForDone(spi);
  291. DMAC_HaltChannel(channel);
  292. }
  293. void SPI_PSRAM_ReadPage(SPI_TypeDef *spi, uint32_t *buf, uint32_t addr, uint32_t length, SPI_PhaseModeTypeDef mode,
  294. DMAC_ChannelNumTypeDef channel, SPI_InterruptTypeDef interrupt, bool qpi_mode)
  295. {
  296. length = (length <= SPI_PHASE_BYTE_CNT_MAX ? length : SPI_PHASE_BYTE_CNT_MAX);
  297. uint32_t cmd = mode == SPI_PHASE_MODE_SINGLE ? SPI_PSRAM_CMD_READ : SPI_PSRAM_CMD_QREAD;
  298. int dummy_bytes = mode == SPI_PHASE_MODE_QUAD ? 3 : 1;
  299. SPI_SetPhaseCtrl(spi, SPI_PHASE_0, SPI_PHASE_ACTION_TX, qpi_mode ? mode : SPI_PHASE_MODE_SINGLE, 1);
  300. SPI_SetPhaseData(spi, SPI_PHASE_0, cmd);
  301. SPI_SetPhaseCtrl(spi, SPI_PHASE_1, SPI_PHASE_ACTION_TX, mode, 3 + dummy_bytes); // 3 bytes address + dummy
  302. SPI_SetPhaseData(spi, SPI_PHASE_1, SPI_FLASH_ADDR(addr));
  303. if (SPI_RX_PIPELINE) {
  304. SPI_SetPhaseCtrl(spi, SPI_PHASE_2, SPI_PHASE_ACTION_DUMMY_TX, SPI_PHASE_MODE_QUAD, 1);
  305. }
  306. int rx_phase = SPI_RX_PIPELINE ? SPI_PHASE_3 : SPI_PHASE_2;
  307. int phase_cnt = SPI_RX_PIPELINE ? SPI_CTRL_PHASE_CNT4 : SPI_CTRL_PHASE_CNT3;
  308. SPI_SetPhaseCtrl(spi, rx_phase, SPI_PHASE_ACTION_RX, mode, length);
  309. DMAC_Config(channel, (uint32_t)&spi->PHASE_DATA[rx_phase], (uint32_t)buf,
  310. DMAC_ADDR_INCR_OFF, DMAC_ADDR_INCR_ON, DMAC_WIDTH_32_BIT, DMAC_WIDTH_32_BIT,
  311. DMAC_BURST_1, DMAC_BURST_1, 0, DMAC_PERIPHERAL_TO_MEM_PERIPHERAL_CTRL,
  312. SPI_RX_DMA_REQ(spi), 0);
  313. SPI_Start(spi, phase_cnt, SPI_CTRL_DMA_ON, interrupt);
  314. if (interrupt == SPI_INTERRUPT_OFF) {
  315. SPI_WaitForDone(spi);
  316. DMAC_HaltChannel(channel);
  317. }
  318. }
  319. void SPI_PSRAM_Write(SPI_TypeDef *spi, uint32_t *buf, uint32_t addr, int total, SPI_PhaseModeTypeDef mode,
  320. DMAC_ChannelNumTypeDef channel, bool qpi_mode)
  321. {
  322. while (total > 0) {
  323. uint32_t length = ((addr + SPI_PSRAM_PAGE_SIZE) & SPI_PSRAM_PAGE_MASK) - addr;
  324. if ((int)length > total) {
  325. length = total;
  326. }
  327. SPI_PSRAM_WritePage(spi, buf, addr, length, mode, channel, SPI_INTERRUPT_OFF, qpi_mode);
  328. addr += length;
  329. total -= length;
  330. buf += length / 4;
  331. }
  332. }
  333. void SPI_PSRAM_Read(SPI_TypeDef *spi, uint32_t *buf, uint32_t addr, int total, SPI_PhaseModeTypeDef mode,
  334. DMAC_ChannelNumTypeDef channel, bool qpi_mode)
  335. {
  336. while (total > 0) {
  337. // Don't cross page boundary to achieve higher frequency
  338. uint32_t length = ((addr + SPI_PSRAM_PAGE_SIZE) & SPI_PSRAM_PAGE_MASK) - addr;
  339. if ((int)length > total) {
  340. length = total;
  341. }
  342. SPI_PSRAM_ReadPage(spi, buf, addr, length, mode, channel, SPI_INTERRUPT_OFF, qpi_mode);
  343. addr += length ;
  344. total -= length;
  345. buf += length / 4;
  346. }
  347. }