yc11xx_spi(1).c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. /*
  2. * Copyright 2016, yichip Semiconductor(shenzhen office)
  3. * All Rights Reserved.
  4. *
  5. * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Yichip Semiconductor;
  6. * the contents of this file may not be disclosed to third parties, copied
  7. * or duplicated in any form, in whole or in part, without the prior
  8. * written permission of Yichip Semiconductor.
  9. */
  10. #include "yc11xx_spi.h"
  11. #include <stdlib.h>
  12. #include <string.h>
  13. //#define YC1121B
  14. typedef struct
  15. {
  16. uint8_t Ctrl;
  17. uint8_t Dealy;
  18. uint16_t TxLen;
  19. uint16_t TxAddr;
  20. uint16_t RxAddr;
  21. uint16_t RxLen;
  22. } __packed Spix_RegDef;
  23. void SPI_Init(SPI_InitTypeDef* SPI_InitStruct)
  24. {
  25. #define SPI_AUTO_INCR_ADDR ((uint8_t)1<<6)
  26. register uint16_t SpixCtrl = 0;
  27. Spix_RegDef * SpiAdr = NULL;
  28. void *Ptr = NULL;
  29. /*check parameter*/
  30. _ASSERT(SPI_InitStruct != NULL);
  31. _ASSERT(IS_SPI_MODE(SPI_InitStruct->SPI_Mode));
  32. _ASSERT(IS_SPI_CPOL(SPI_InitStruct->SPI_CPOL));
  33. _ASSERT(IS_SPI_CPHA(SPI_InitStruct->SPI_CPHA));
  34. _ASSERT(IS_SPI_BAUDSPEED(SPI_InitStruct->SPI_BaudSpeed));
  35. _ASSERT(IS_SPI_TXLen(SPI_InitStruct->SPI_TXLen));
  36. _ASSERT(IS_SPI_RXLen(SPI_InitStruct->SPI_RXlen));
  37. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  38. /*set spi control*/
  39. SpixCtrl = SPI_InitStruct->SPI_BaudSpeed | \
  40. SPI_InitStruct->SPI_CPOL | \
  41. SPI_InitStruct->SPI_CPHA | \
  42. SPI_AUTO_INCR_ADDR;
  43. HWRITE((uint32_t)&SpiAdr->Ctrl, SpixCtrl);
  44. #ifdef YC1121B
  45. /*set spi delay between read and write*/
  46. HWRITE((uint32_t)&SpiAdr->Dealy, 0x0a);
  47. /*init spi tx buff*/
  48. HW_REG_16BIT((uint32_t)&SpiAdr->TxAddr, 0x4f00);
  49. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, 0);
  50. /*init spi tx buff*/
  51. HW_REG_16BIT((uint32_t)&SpiAdr->RxAddr, 0x4f80);
  52. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 0);
  53. #else
  54. /*set spi delay between read and write*/
  55. HWRITE((uint32_t)&SpiAdr->Dealy, 0x8a);
  56. /*init spi tx buff*/
  57. Ptr = malloc(SPI_InitStruct->SPI_TXLen);
  58. HW_REG_16BIT((uint32_t)&SpiAdr->TxAddr,(uint32_t) Ptr);
  59. _ASSERT(Ptr != NULL);
  60. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, 0);
  61. Ptr = NULL;
  62. /*init spi tx buff*/
  63. Ptr = malloc(SPI_InitStruct->SPI_RXlen);
  64. HW_REG_16BIT((uint32_t)&SpiAdr->RxAddr,(uint32_t) Ptr);
  65. _ASSERT(Ptr != NULL);
  66. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 0);
  67. #endif
  68. }
  69. void SPI_DeInit(void)
  70. {
  71. Spix_RegDef * SpiAdr = NULL;
  72. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  73. free((void *)((uint32_t)SpiAdr->RxAddr));
  74. free((void *)((uint32_t)SpiAdr->TxAddr));
  75. }
  76. #define START_SPI_DMA 0x02 //start spi dma
  77. #define CHECK_SPI_DMA_DONE 0x40 //check spi dma is done
  78. void SPI_SendData(uint16_t Data)
  79. {
  80. Spix_RegDef * SpiAdr = NULL;
  81. uint8_t * SpiTxPtr = NULL;
  82. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  83. #ifdef YC1121B
  84. SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  85. #else
  86. SpiTxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  87. #endif
  88. *SpiTxPtr = Data;
  89. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, 1);
  90. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 0);
  91. HWRITE(CORE_DMA_START, START_SPI_DMA);
  92. while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
  93. }
  94. uint16_t SPI_ReadRegister(uint16_t RegAdr)
  95. {
  96. Spix_RegDef * SpiAdr = NULL;
  97. uint8_t * SpiRxPtr = NULL;
  98. uint8_t * SpiTxPtr = NULL;
  99. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  100. #ifdef YC1121B
  101. SpiRxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->RxAddr));
  102. SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  103. #else
  104. SpiRxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->RxAddr));
  105. SpiTxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  106. #endif
  107. *SpiTxPtr =RegAdr;
  108. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, 1);
  109. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 1);
  110. HWRITE(CORE_DMA_START, START_SPI_DMA);
  111. while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
  112. return *SpiRxPtr;
  113. }
  114. void SPI_SendDataFromBuff(uint8_t *Buff, uint16_t Len)
  115. {
  116. Spix_RegDef * SpiAdr = NULL;
  117. uint8_t * SpiTxPtr = NULL;
  118. _ASSERT(Len);
  119. _ASSERT(Buff != NULL);
  120. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  121. #ifdef YC1121B
  122. SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  123. #else
  124. SpiTxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  125. #endif
  126. xmemcpy(SpiTxPtr, Buff, Len);
  127. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, Len);
  128. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 0);
  129. HWRITE(CORE_DMA_START, START_SPI_DMA);
  130. while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
  131. }
  132. void SPI_SendDataFromBuffWithoutDMAdone(uint8_t *Buff, uint16_t Len)
  133. {
  134. Spix_RegDef * SpiAdr = NULL;
  135. uint8_t * SpiTxPtr = NULL;
  136. _ASSERT(Len);
  137. _ASSERT(Buff != NULL);
  138. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  139. #ifdef YC1121B
  140. SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  141. #else
  142. SpiTxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  143. #endif
  144. xmemcpy(SpiTxPtr, Buff, Len);
  145. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, Len);
  146. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 0);
  147. HWRITE(CORE_DMA_START, START_SPI_DMA);
  148. // while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
  149. }
  150. uint32_t test;
  151. void SPI_ReceiveDataToBuff(uint8_t *TxBuff,
  152. uint16_t TxLen,
  153. uint8_t *RxBuff,
  154. uint16_t RxLen)
  155. {
  156. Spix_RegDef * SpiAdr = NULL;
  157. uint8_t * SpiTxPtr = NULL;
  158. uint8_t * SpiRxPtr = NULL;
  159. test++;
  160. _ASSERT(TxLen);
  161. _ASSERT(TxBuff != NULL);
  162. _ASSERT(RxBuff != NULL);
  163. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  164. HWRITE((uint32_t)&SpiAdr->Dealy, 0x8a);
  165. #ifdef YC1121B
  166. SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  167. SpiRxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->RxAddr));
  168. #else
  169. SpiTxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  170. SpiRxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->RxAddr));
  171. #endif
  172. // memcpy(SpiTxPtr, TxBuff, TxLen);
  173. HW_REG_16BIT((uint32_t)&SpiAdr->RxAddr, (uint32_t)RxBuff);
  174. HW_REG_16BIT((uint32_t)&SpiAdr->TxAddr, (uint32_t)TxBuff);
  175. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, TxLen);
  176. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, RxLen);
  177. HWRITE(CORE_DMA_START, START_SPI_DMA);
  178. // while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
  179. // memcpy(RxBuff, SpiRxPtr, RxLen);
  180. }
  181. void SPI_ReceiveDataToBuff2(uint8_t *TxBuff,
  182. uint16_t TxLen,
  183. uint8_t *RxBuff,
  184. uint16_t RxLen)
  185. {
  186. Spix_RegDef * SpiAdr = NULL;
  187. uint8_t * SpiTxPtr = NULL;
  188. uint8_t * SpiRxPtr = NULL;
  189. _ASSERT(TxLen);
  190. _ASSERT(TxBuff != NULL);
  191. _ASSERT(RxBuff != NULL);
  192. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  193. HWRITE((uint32_t)&SpiAdr->Dealy, 0x0a);
  194. SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  195. SpiRxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->RxAddr));
  196. // memcpy(SpiTxPtr, TxBuff, TxLen);
  197. HW_REG_16BIT((uint32_t)&SpiAdr->RxAddr, (uint32_t)RxBuff);
  198. HW_REG_16BIT((uint32_t)&SpiAdr->TxAddr, (uint32_t)TxBuff);
  199. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, TxLen);
  200. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, RxLen);
  201. HWRITE(CORE_DMA_START, START_SPI_DMA);
  202. // while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
  203. // memcpy(RxBuff, SpiRxPtr, RxLen);
  204. }
  205. bool SPI_WaitDone(void) {
  206. if(!(HREAD(CORE_DMA_STATUS) & (CHECK_SPI_DMA_DONE))) {
  207. return true;
  208. }
  209. return false;
  210. }