DMA.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. #include "DMA.h"
  2. #include <FU68xx_5_DMA.h>
  3. //#define DMALENT 128
  4. unsigned char xdata sg_ucUartDbgData[DMALENT] = {0xaa, 0xbb};
  5. char sg_cUartDataLen;
  6. unsigned char sg_ucUartDataSum;
  7. void DMA0_XRAMToUART_Init(void)
  8. {
  9. /* -----DMACFG2:DMACFG1: DMACFG0-->001 传输方向XRAMToUART----- */
  10. SetReg(DMA0_CR0, DMAEN | DMACFG2 | DMACFG1 | DMACFG0 | DMAIE, DMACFG0 ); // DMAIE和DMACFG0为1
  11. DMA0_LEN = DMALENT; // 设置传输长度为7,每传输7字节产生一次中断
  12. DMA0_BA = (uint16)GetAddr_UARTDBG(); // 设置RAM中的首地址
  13. SetBit(DMA0_CR0, DMAEN); // 使能DMA1
  14. }
  15. /**
  16. 获取缓存区的地址
  17. @return 缓存区地址
  18. */
  19. unsigned char * GetAddr_UARTDBG(void)
  20. {
  21. return &sg_ucUartDbgData;
  22. }
  23. /**
  24. 配置DMA
  25. @param DMAx DMA通道
  26. @param DMAPipe DMA管道,可选参数如下
  27. UART1_XDATA UART1-->XDATA
  28. XDATA_UART1 UART1<--XDATA
  29. I2C_XDATA I2C -->XDATA
  30. XDATA_I2C I2C <--XDATA
  31. SPI_XDATA SPI -->XDATA
  32. XDATA_SPI SPI <--XDATA
  33. UART2_XDATA UART2-->XDATA
  34. XDATA_UART2 UART2<--XDATA
  35. @param DMAAddr 传输首地址,可取地址范围:0x0000~0x0317
  36. @param DMALen 数据包大小(1~64)
  37. */
  38. void Conf_DMA(uint8 DMAx, uint8 DMAPipe, uint16 DMAAddr, uint8 DMALen)
  39. {
  40. Wait_DMA(DMAx); // 等待DMAx传输结束
  41. ClrBit(*(&DMA0_CR0 + DMAx), DMAEN); // 禁止DMAx的传输
  42. SetReg(*(&DMA0_CR0 + DMAx), DMA_PIPE, DMAPipe); // 设置DMAx的传输管道
  43. *(&DMA0_LEN + DMAx) = DMALen - 1; // 设置DMAx传输数量
  44. *(&DMA0_BA + DMAx) = DMAAddr & 0x07ff; // 设置DMAx传输首地址
  45. }
  46. void SetPipe_DMA0(eType_DMA_PIPE ePipe)
  47. {
  48. bool bTmp = false;
  49. if (ReadBit(DMA0_CR0, DMAEN))
  50. {
  51. bTmp = true;
  52. while (ReadBit(DMA0_CR0, DMABSY));
  53. ClrBit(DMA0_CR0, DMAEN);
  54. }
  55. SetReg(DMA0_CR0, DMACFG2 | DMACFG1 | DMACFG0, ePipe);
  56. if (bTmp)
  57. {
  58. SetBit(DMA0_CR0, DMAEN);
  59. }
  60. }
  61. void SetPipe_DMA1(eType_DMA_PIPE ePipe)
  62. {
  63. bool bTmp = false;
  64. if (ReadBit(DMA1_CR0, DMAEN))
  65. {
  66. bTmp = true;
  67. while (ReadBit(DMA1_CR0, DMABSY));
  68. ClrBit(DMA1_CR0, DMAEN);
  69. }
  70. SetReg(DMA1_CR0, DMACFG2 | DMACFG1 | DMACFG0, ePipe);
  71. if (bTmp)
  72. {
  73. SetBit(DMA1_CR0, DMAEN);
  74. }
  75. }
  76. void SetDataPackage_DMA0(unsigned short ulAddr, char cLen)
  77. {
  78. bool bTmp = false;
  79. if (ReadBit(DMA0_CR0, DMAEN))
  80. {
  81. bTmp = true;
  82. while (ReadBit(DMA0_CR0, DMABSY));
  83. ClrBit(DMA0_CR0, DMAEN);
  84. }
  85. DMA0_LEN = cLen;
  86. DMA0_BA = ulAddr;
  87. if (bTmp)
  88. {
  89. SetBit(DMA0_CR0, DMAEN);
  90. }
  91. }
  92. void SetDataPackage_DMA1(unsigned short ulAddr, char cLen)
  93. {
  94. bool bTmp = false;
  95. if (ReadBit(DMA1_CR0, DMAEN))
  96. {
  97. bTmp = true;
  98. while (ReadBit(DMA1_CR0, DMABSY));
  99. ClrBit(DMA1_CR0, DMAEN);
  100. }
  101. DMA1_LEN = cLen;
  102. DMA1_BA = ulAddr;
  103. if (bTmp)
  104. {
  105. SetBit(DMA1_CR0, DMAEN);
  106. }
  107. }
  108. void SetEndian_DMA(eType_DMA_Endian eEndian)
  109. {
  110. bool bTmp = false, bTmp1;
  111. if (ReadBit(DMA0_CR0, DMAEN))
  112. {
  113. bTmp = true;
  114. while (ReadBit(DMA0_CR0, DMABSY));
  115. ClrBit(DMA0_CR0, DMAEN);
  116. }
  117. if (ReadBit(DMA1_CR0, DMAEN))
  118. {
  119. bTmp1 = true;
  120. while (ReadBit(DMA1_CR0, DMABSY));
  121. ClrBit(DMA1_CR0, DMAEN);
  122. }
  123. SetReg(DMA0_CR0, ENDIAN, eEndian);
  124. if (bTmp)
  125. {
  126. SetBit(DMA0_CR0, DMAEN);
  127. }
  128. if (bTmp1)
  129. {
  130. SetBit(DMA1_CR0, DMAEN);
  131. }
  132. }
  133. void SetIRQ_DMA(ebool eIRQ, eType_DMA_IRQ eIP)
  134. {
  135. SetReg(DMA0_CR0, DMAIE, eIRQ ? DMAIE : 0);
  136. if (!EA)
  137. {
  138. EA = 1;
  139. }
  140. if (eIRQ)
  141. {
  142. SetReg(IP1, PDMA1 | PDMA0, eIP);
  143. }
  144. }
  145. void SetDbgMod_DMA(void)
  146. {
  147. bool bTmp = false;
  148. if (ReadBit(DMA1_CR0, DMAEN))
  149. {
  150. bTmp = true;
  151. while (ReadBit(DMA1_CR0, DMABSY));
  152. ClrBit(DMA1_CR0, DMAEN);
  153. }
  154. SetBit(DMA1_CR0, DBGEN);
  155. SetBit(DMA1_CR0, ((eType_DMA_PIPE)DRAM_SPI));
  156. DMA1_LEN = 4;
  157. if (bTmp)
  158. {
  159. SetBit(DMA1_CR0, DMAEN);
  160. }
  161. }
  162. /**
  163. 设置DMA1的DBG模式
  164. @param Addr 要DBG输出的地址
  165. */
  166. uint16 xdata spidebug[4] = { 0 };
  167. void Set_DBG_DMA(uint16 DMAAddr)
  168. {
  169. // SPI_Init();
  170. ClrBit(DMA1_CR0, DMAEN); // 禁止DMA1传输
  171. SetBit(DMA1_CR0, DBGEN | DRAM_SPI); // 设置DMA1使用DBG模式,XDATA发送数据到SPI
  172. if (!ReadBit(DMAAddr, 0x4000))
  173. {
  174. SetBit(DMA1_CR0, DBGSW); //根据DMAAddr判断是否在XRAM区,如果是则开启DBGSW
  175. }
  176. DMA1_LEN = 7; // 设置DMA1发送数量为8
  177. // DMA1_BA = (uint16)spidebug & 0x07ff;
  178. DMA1_BA = DMAAddr & 0x07ff; // 设置DMA1发送首地址
  179. SetBit(*(&DMA0_CR0 + 1), DMAEN | DMABSY);
  180. // Switch_DMA(1); // 启动DMA1
  181. }
  182. void SetDbgData_DMA(unsigned short ulAddr)
  183. {
  184. bool bTmp = false;
  185. if (ReadBit(DMA1_CR0, DMAEN))
  186. {
  187. bTmp = true;
  188. while (ReadBit(DMA1_CR0, DMABSY));
  189. ClrBit(DMA1_CR0, DMAEN);
  190. }
  191. if (ulAddr <= 0xfff)
  192. {
  193. ulAddr += 0x70000000;
  194. }
  195. DMA1_BA = ulAddr;
  196. if (bTmp)
  197. {
  198. SetBit(DMA1_CR0, DMAEN);
  199. }
  200. }
  201. void EnableRun_DMA0(void)
  202. {
  203. SetBit(DMA0_CR0, DMAEN | DMABSY);
  204. }
  205. void EnableRun_DMA1(void)
  206. {
  207. SetBit(DMA1_CR0, DMAEN | DMABSY);
  208. }
  209. bool GetStatus_DMA0(eType_DMA_Statu eStatu)
  210. {
  211. return ReadBit(DMA0_CR0, eStatu);
  212. }
  213. bool GetStatus_DMA1(eType_DMA_Statu eStatu)
  214. {
  215. return ReadBit(DMA1_CR0, eStatu);
  216. }