yc11xx_spi.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  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. #include "yc11xx_gpio.h"
  14. #include "systick.h"
  15. #include <stdio.h>
  16. #include "yc11xx_uart.h"
  17. void delay(uint16_t X)
  18. {
  19. int i,j;
  20. for(i=0; i<X;i++)
  21. for(j=0 ;j<X ;j++);
  22. }
  23. void SPI_FLASH_Init(void)
  24. {
  25. GPIO_SetGpioMultFunction(19,GPCFG_PULLUP); //设置GPIO19为sck,输出模式
  26. GPIO_SetGpioMultFunction(24,GPCFG_PULLUP); //设置GPIO24为MOSI,输出模式
  27. GPIO_SetGpioMultFunction(23,GPCFG_PULLUP); //设置GPIO27为CS,输出模式
  28. GPIO_SetGpioMultFunction(6,GPCFG_INPUT); //设置GPIO6为MISO,输入模式
  29. GPIO_SetOut(23, 1); //拉高CS片选信号线
  30. GPIO_SetOut(19, 1); //拉高sck时钟信号线,模拟SPI时钟相位在没有工作的时候为高电平(模式3)
  31. delay(100);
  32. }
  33. //软件模拟SPI写(发送)
  34. void Soft_SPI_Write(uint8_t a)
  35. {
  36. uint8_t cnt;
  37. for(cnt=0; cnt<8; cnt++)
  38. {
  39. GPIO_SetOut(19, 0); //拉低时钟信号线
  40. delay(5); //延时时间任意,主要是为了模拟时序
  41. if( a & 0x80)
  42. {
  43. GPIO_SetOut(24,1);
  44. }
  45. else
  46. {
  47. GPIO_SetOut(24,0);
  48. }
  49. a <<=1;
  50. delay(5);
  51. GPIO_SetOut(19,1); //拉高时钟信号线,这时候MOSI的信号被采样(模式3)
  52. delay(5);
  53. }
  54. }
  55. uint8_t Soft_SPI_Read(void)
  56. {
  57. uint8_t cnt;
  58. uint8_t Rxdata = 0;
  59. for(cnt=0; cnt<8; cnt++)
  60. {
  61. GPIO_SetOut(19, 0); //拉低时钟信号线
  62. delay(5); //延时时间任意,主要是为了模拟时序
  63. Rxdata <<=1;
  64. if(GPIO_GetInputStatus(6))
  65. {
  66. Rxdata |=0x01;
  67. }
  68. GPIO_SetOut(19,1);
  69. delay(5);
  70. }
  71. return Rxdata;
  72. }
  73. //Flash的扇区擦除函数
  74. void Soft_Flash_chipErase(uint32_t addr)
  75. {
  76. GPIO_SetOut(23,0); //拉低CS片选信号线
  77. Soft_SPI_Write(0x06); //写使能指令
  78. GPIO_SetOut(23,1); //拉高CS片选信号线
  79. GPIO_SetOut(23,0); //拉低CS片选信号线
  80. Soft_SPI_Write(0x60); //全擦除指令
  81. Soft_SPI_Write((addr & 0xff0000)>>16);
  82. Soft_SPI_Write((addr & 0xff00)>>8);
  83. Soft_SPI_Write((addr & 0xff));
  84. GPIO_SetOut(23,1); //拉高CS片选信号线
  85. }
  86. //页写入函数
  87. void Soft_SPIFlashPageWrite(uint8_t *Writebuffer, uint32_t Writeaddr, uint16_t NumberbiteToWrite)
  88. {
  89. GPIO_SetOut(23,0); //拉低CS片选信号线
  90. Soft_SPI_Write(0x06); //写使能指令
  91. GPIO_SetOut(23,1); //拉高CS片选信号线
  92. GPIO_SetOut(23,0); //拉低CS片选信号线
  93. Soft_SPI_Write(0x02); //写页写入指令
  94. Soft_SPI_Write((Writeaddr & 0xff0000)>>16);
  95. Soft_SPI_Write((Writeaddr & 0xff00)>>8);
  96. Soft_SPI_Write((Writeaddr & 0xff));
  97. if(NumberbiteToWrite > 256)
  98. {
  99. NumberbiteToWrite = 256;
  100. }
  101. while(NumberbiteToWrite--)
  102. {
  103. Soft_SPI_Write(*Writebuffer);
  104. Writebuffer++;
  105. }
  106. GPIO_SetOut(23,1); //拉高CS片选信号线
  107. }
  108. //读Flash函数,支持多字节一直读
  109. void Soft_SPIFlashRead(uint8_t *Readbuffer, uint32_t Readaddr, uint16_t NumberbiteToRead)
  110. {
  111. GPIO_SetOut(23,0); //拉低CS片选信号线
  112. delay(5);
  113. Soft_SPI_Write(0x06); //写使能指令
  114. GPIO_SetOut(23,1); //拉高CS片选信号线
  115. GPIO_SetOut(23,0); //拉低CS片选信号线
  116. Soft_SPI_Write(0x03);
  117. Soft_SPI_Write((Readaddr & 0xff0000)>>16);
  118. Soft_SPI_Write((Readaddr & 0xff00)>>8);
  119. Soft_SPI_Write((Readaddr & 0xff));
  120. while(NumberbiteToRead--)
  121. {
  122. *Readbuffer = Soft_SPI_Read();
  123. Readbuffer++;
  124. }
  125. GPIO_SetOut(23,1); //拉高CS片选信号线
  126. }
  127. uint32_t Soft_SPIFlashIDRead(void)
  128. {
  129. uint32_t temp;
  130. uint8_t temp1,temp2,temp3;
  131. GPIO_SetOut(23,0); //拉低CS片选信号线
  132. Soft_SPI_Write(0x9f);
  133. temp1=Soft_SPI_Read();
  134. temp2=Soft_SPI_Read();
  135. temp3=Soft_SPI_Read();
  136. printf("temp1=%x\n temp2=%x\n temp3=%x\n",temp1,temp2 ,temp3 );
  137. temp= (temp1 << 16) | (temp2 << 8) | temp3;
  138. printf("temp is %x",temp);
  139. GPIO_SetOut(23,1); //拉高CS片选信号线
  140. return temp;
  141. }
  142. //#define YC1121B
  143. typedef struct
  144. {
  145. uint8_t Ctrl;
  146. uint8_t Dealy;
  147. uint16_t TxLen;
  148. uint16_t TxAddr;
  149. uint16_t RxAddr;
  150. uint16_t RxLen;
  151. } Spix_RegDef;
  152. void SPI_Init(SPI_InitTypeDef* SPI_InitStruct)
  153. {
  154. #define SPI_AUTO_INCR_ADDR ((uint8_t)1<<6)
  155. register uint16_t SpixCtrl = 0;
  156. Spix_RegDef * SpiAdr = NULL;
  157. void *Ptr = NULL;
  158. /*check parameter*/
  159. _ASSERT(SPI_InitStruct != NULL);
  160. _ASSERT(IS_SPI_MODE(SPI_InitStruct->SPI_Mode));
  161. _ASSERT(IS_SPI_CPOL(SPI_InitStruct->SPI_CPOL));
  162. _ASSERT(IS_SPI_CPHA(SPI_InitStruct->SPI_CPHA));
  163. _ASSERT(IS_SPI_BAUDSPEED(SPI_InitStruct->SPI_BaudSpeed));
  164. _ASSERT(IS_SPI_TXLen(SPI_InitStruct->SPI_TXLen));
  165. _ASSERT(IS_SPI_RXLen(SPI_InitStruct->SPI_RXlen));
  166. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  167. /*set spi control*/
  168. SpixCtrl = SPI_InitStruct->SPI_BaudSpeed | \
  169. SPI_InitStruct->SPI_CPOL | \
  170. SPI_InitStruct->SPI_CPHA | \
  171. SPI_AUTO_INCR_ADDR;
  172. HWRITE((uint32_t)&SpiAdr->Ctrl, SpixCtrl);
  173. #ifdef YC1121B
  174. /*set spi delay between read and write*/
  175. HWRITE((uint32_t)&SpiAdr->Dealy, 0x0a);
  176. /*init spi tx buff*/
  177. HW_REG_16BIT((uint32_t)&SpiAdr->TxAddr, 0x4f00);
  178. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, 0);
  179. /*init spi tx buff*/
  180. HW_REG_16BIT((uint32_t)&SpiAdr->RxAddr, 0x4f80);
  181. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 0);
  182. #else
  183. /*set spi delay between read and write*/
  184. HWRITE((uint32_t)&SpiAdr->Dealy, 0xfa);
  185. /*init spi tx buff*/
  186. Ptr = malloc(SPI_InitStruct->SPI_TXLen);
  187. HW_REG_16BIT((uint32_t)&SpiAdr->TxAddr,(uint32_t) Ptr);
  188. _ASSERT(Ptr != NULL);
  189. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, 0);
  190. Ptr = NULL;
  191. /*init spi tx buff*/
  192. Ptr = malloc(SPI_InitStruct->SPI_RXlen);
  193. HW_REG_16BIT((uint32_t)&SpiAdr->RxAddr,(uint32_t) Ptr);
  194. _ASSERT(Ptr != NULL);
  195. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 0);
  196. #endif
  197. }
  198. void SPI_DeInit(void)
  199. {
  200. Spix_RegDef * SpiAdr = NULL;
  201. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  202. free((void *)((uint32_t)SpiAdr->RxAddr));
  203. free((void *)((uint32_t)SpiAdr->TxAddr));
  204. }
  205. #define START_SPI_DMA 0x02 //start spi dma
  206. #define CHECK_SPI_DMA_DONE 0x40 //check spi dma is done
  207. void Spi_SendReceDataToBuff(uint8_t *txdata,int txlen,uint8_t *rxbuf,int rxlen)
  208. {
  209. volatile int j;
  210. HWRITEW(CORE_SPID_TXADDR ,(int)txdata );
  211. HWRITEW(CORE_SPID_TXLEN , txlen);
  212. HWRITEW(CORE_SPID_RXADDR , (int)rxbuf);
  213. HWRITEW(CORE_SPID_RXLEN , rxlen);
  214. HWRITE(CORE_DMA_START , 2);
  215. for(j = 0;j < 20;j++);
  216. while(!(HREAD(CORE_DMA_STATUS) & 0x40) );
  217. }
  218. void SPI_SendData(uint16_t Data)
  219. {
  220. Spix_RegDef * SpiAdr = NULL;
  221. uint8_t * SpiTxPtr = NULL;
  222. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  223. #ifdef YC1121B
  224. SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  225. #else
  226. SpiTxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  227. #endif
  228. *SpiTxPtr = Data;
  229. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, 1);
  230. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 0);
  231. HWRITE(CORE_DMA_START, START_SPI_DMA);
  232. while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
  233. }
  234. uint16_t SPI_ReadRegister(uint16_t RegAdr)
  235. {
  236. Spix_RegDef * SpiAdr = NULL;
  237. uint8_t * SpiRxPtr = NULL;
  238. uint8_t * SpiTxPtr = NULL;
  239. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  240. #ifdef YC1121B
  241. SpiRxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->RxAddr));
  242. SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  243. #else
  244. SpiRxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->RxAddr));
  245. SpiTxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  246. #endif
  247. *SpiTxPtr =RegAdr;
  248. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, 1);
  249. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 1);
  250. HWRITE(CORE_DMA_START, START_SPI_DMA);
  251. while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
  252. return *SpiRxPtr;
  253. }
  254. void SPI_SendDataFromBuff(uint8_t *Buff, uint16_t Len)
  255. {
  256. Spix_RegDef * SpiAdr = NULL;
  257. uint8_t * SpiTxPtr = NULL;
  258. _ASSERT(Len);
  259. _ASSERT(Buff != NULL);
  260. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  261. #ifdef YC1121B
  262. SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  263. #else
  264. SpiTxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  265. #endif
  266. memcpy(SpiTxPtr, Buff, Len);
  267. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, Len);
  268. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 0);
  269. HWRITE(CORE_DMA_START, START_SPI_DMA);
  270. while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
  271. }
  272. void SPI_SendDataFromBuffWithoutDMAdone(uint8_t *Buff, uint16_t Len)
  273. {
  274. Spix_RegDef * SpiAdr = NULL;
  275. uint8_t * SpiTxPtr = NULL;
  276. _ASSERT(Len);
  277. _ASSERT(Buff != NULL);
  278. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  279. #ifdef YC1121B
  280. SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  281. #else
  282. SpiTxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  283. #endif
  284. memcpy(SpiTxPtr, Buff, Len);
  285. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, Len);
  286. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, 0);
  287. HWRITE(CORE_DMA_START, START_SPI_DMA);
  288. // while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
  289. }
  290. uint32_t test;
  291. void SPI_ReceiveDataToBuff(uint8_t *TxBuff,
  292. uint16_t TxLen,
  293. uint8_t *RxBuff,
  294. uint16_t RxLen)
  295. {
  296. uint8_t j;
  297. Spix_RegDef * SpiAdr = NULL;
  298. uint8_t * SpiTxPtr = NULL;
  299. uint8_t * SpiRxPtr = NULL;
  300. test++;
  301. _ASSERT(TxLen);
  302. _ASSERT(TxBuff != NULL);
  303. _ASSERT(RxBuff != NULL);
  304. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  305. HWRITE((uint32_t)&SpiAdr->Dealy, 0x8a);
  306. #ifdef YC1121B
  307. SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  308. SpiRxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->RxAddr));
  309. #else
  310. SpiTxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  311. SpiRxPtr = (uint8_t *) reg_map_m0(HR_REG_16BIT((uint32_t)&SpiAdr->RxAddr));
  312. #endif
  313. memcpy(SpiTxPtr, TxBuff, TxLen);
  314. HW_REG_16BIT((uint32_t)&SpiAdr->RxAddr, (uint32_t)RxBuff);
  315. HW_REG_16BIT((uint32_t)&SpiAdr->TxAddr, (uint32_t)TxBuff);
  316. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, TxLen);
  317. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, RxLen);
  318. HWRITE(CORE_DMA_START, START_SPI_DMA);
  319. for(j = 0;j < 20;j++);
  320. while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
  321. memcpy(RxBuff, SpiRxPtr, RxLen);
  322. }
  323. void SPI_ReceiveDataToBuff2(uint8_t *TxBuff,
  324. uint16_t TxLen,
  325. uint8_t *RxBuff,
  326. uint16_t RxLen)
  327. {
  328. Spix_RegDef * SpiAdr = NULL;
  329. uint8_t * SpiTxPtr = NULL;
  330. uint8_t * SpiRxPtr = NULL;
  331. _ASSERT(TxLen);
  332. _ASSERT(TxBuff != NULL);
  333. _ASSERT(RxBuff != NULL);
  334. SpiAdr = (Spix_RegDef *)(reg_map(CORE_SPID_CTRL));
  335. HWRITE((uint32_t)&SpiAdr->Dealy, 0x0a);
  336. SpiTxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->TxAddr));
  337. SpiRxPtr = (uint8_t *) reg_map(HR_REG_16BIT((uint32_t)&SpiAdr->RxAddr));
  338. // memcpy(SpiTxPtr, TxBuff, TxLen);
  339. HW_REG_16BIT((uint32_t)&SpiAdr->RxAddr, (uint32_t)RxBuff);
  340. HW_REG_16BIT((uint32_t)&SpiAdr->TxAddr, (uint32_t)TxBuff);
  341. HW_REG_16BIT((uint32_t)&SpiAdr->TxLen, TxLen);
  342. HW_REG_16BIT((uint32_t)&SpiAdr->RxLen, RxLen);
  343. HWRITE(CORE_DMA_START, START_SPI_DMA);
  344. // while(!(HREAD(CORE_DMA_STATUS) & CHECK_SPI_DMA_DONE));
  345. // memcpy(RxBuff, SpiRxPtr, RxLen);
  346. }
  347. bool SPI_WaitDone(void) {
  348. if(!(HREAD(CORE_DMA_STATUS) & (CHECK_SPI_DMA_DONE))) {
  349. return true;
  350. }
  351. return false;
  352. }