DMA.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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. *
  26. * @param DMAx DMA通道
  27. * @param DMAPipe DMA管道,可选参数如下
  28. * UART1_XDATA UART1-->XDATA
  29. * XDATA_UART1 UART1<--XDATA
  30. * I2C_XDATA I2C -->XDATA
  31. * XDATA_I2C I2C <--XDATA
  32. * SPI_XDATA SPI -->XDATA
  33. * XDATA_SPI SPI <--XDATA
  34. * UART2_XDATA UART2-->XDATA
  35. * XDATA_UART2 UART2<--XDATA
  36. * @param DMAAddr 传输首地址,可取地址范围:0x0000~0x0317
  37. * @param DMALen 数据包大小(1~64)
  38. */
  39. void Conf_DMA(uint8 DMAx, uint8 DMAPipe, uint16 DMAAddr, uint8 DMALen)
  40. {
  41. Wait_DMA(DMAx); // 等待DMAx传输结束
  42. ClrBit(*(&DMA0_CR0 + DMAx), DMAEN); // 禁止DMAx的传输
  43. SetReg(*(&DMA0_CR0 + DMAx), DMA_PIPE, DMAPipe); // 设置DMAx的传输管道
  44. *(&DMA0_LEN + DMAx) = DMALen - 1; // 设置DMAx传输数量
  45. *(&DMA0_BA + DMAx) = DMAAddr & 0x07ff; // 设置DMAx传输首地址
  46. }
  47. void SetPipe_DMA0(eType_DMA_PIPE ePipe)
  48. {
  49. bool bTmp = false;
  50. if (ReadBit(DMA0_CR0 , DMAEN))
  51. {
  52. bTmp = true;
  53. while (ReadBit(DMA0_CR0 , DMABSY));
  54. ClrBit(DMA0_CR0 , DMAEN);
  55. }
  56. SetReg(DMA0_CR0 , DMACFG2 | DMACFG1 | DMACFG0 , ePipe);
  57. if (bTmp) SetBit(DMA0_CR0 , DMAEN);
  58. }
  59. void SetPipe_DMA1(eType_DMA_PIPE ePipe)
  60. {
  61. bool bTmp = false;
  62. if (ReadBit(DMA1_CR0 , DMAEN))
  63. {
  64. bTmp = true;
  65. while (ReadBit(DMA1_CR0 , DMABSY));
  66. ClrBit(DMA1_CR0 , DMAEN);
  67. }
  68. SetReg(DMA1_CR0 , DMACFG2 | DMACFG1 | DMACFG0 , ePipe);
  69. if (bTmp) SetBit(DMA1_CR0 , DMAEN);
  70. }
  71. void SetDataPackage_DMA0(unsigned short ulAddr , char cLen)
  72. {
  73. bool bTmp = false;
  74. if (ReadBit(DMA0_CR0 , DMAEN))
  75. {
  76. bTmp = true;
  77. while (ReadBit(DMA0_CR0 , DMABSY));
  78. ClrBit(DMA0_CR0 , DMAEN);
  79. }
  80. DMA0_LEN = cLen;
  81. DMA0_BA = ulAddr;
  82. if (bTmp) SetBit(DMA0_CR0, DMAEN);
  83. }
  84. void SetDataPackage_DMA1(unsigned short ulAddr, char cLen)
  85. {
  86. bool bTmp = false;
  87. if (ReadBit(DMA1_CR0 , DMAEN))
  88. {
  89. bTmp = true;
  90. while (ReadBit(DMA1_CR0 , DMABSY));
  91. ClrBit(DMA1_CR0 , DMAEN);
  92. }
  93. DMA1_LEN = cLen;
  94. DMA1_BA = ulAddr;
  95. if (bTmp) SetBit(DMA1_CR0 , DMAEN);
  96. }
  97. void SetEndian_DMA(eType_DMA_Endian eEndian)
  98. {
  99. bool bTmp = false, bTmp1;
  100. if (ReadBit(DMA0_CR0 , DMAEN))
  101. {
  102. bTmp = true;
  103. while (ReadBit(DMA0_CR0 , DMABSY));
  104. ClrBit(DMA0_CR0 , DMAEN);
  105. }
  106. if (ReadBit(DMA1_CR0 , DMAEN))
  107. {
  108. bTmp1 = true;
  109. while (ReadBit(DMA1_CR0 , DMABSY));
  110. ClrBit(DMA1_CR0 , DMAEN);
  111. }
  112. SetReg(DMA0_CR0, ENDIAN, eEndian);
  113. if (bTmp) SetBit(DMA0_CR0 , DMAEN);
  114. if (bTmp1) SetBit(DMA1_CR0 , DMAEN);
  115. }
  116. void SetIRQ_DMA(ebool eIRQ, eType_DMA_IRQ eIP)
  117. {
  118. SetReg(DMA0_CR0, DMAIE, eIRQ ? DMAIE : 0);
  119. if (!EA) EA = 1;
  120. if (eIRQ) SetReg(IP1 , PDMA1 | PDMA0 , eIP);
  121. }
  122. void SetDbgMod_DMA(void)
  123. {
  124. bool bTmp = false;
  125. if (ReadBit(DMA1_CR0 , DMAEN))
  126. {
  127. bTmp = true;
  128. while (ReadBit(DMA1_CR0 , DMABSY));
  129. ClrBit(DMA1_CR0 , DMAEN);
  130. }
  131. SetBit(DMA1_CR0 , DBGEN);
  132. SetBit(DMA1_CR0 , ((eType_DMA_PIPE)DRAM_SPI));
  133. DMA1_LEN = 4;
  134. if (bTmp) SetBit(DMA1_CR0, DMAEN);
  135. }
  136. /**
  137. * 设置DMA1的DBG模式
  138. *
  139. * @param Addr 要DBG输出的地址
  140. */
  141. uint16 xdata spidebug[4] = { 0 };
  142. void Set_DBG_DMA(uint16 DMAAddr)
  143. {
  144. // SPI_Init();
  145. ClrBit(DMA1_CR0, DMAEN); // 禁止DMA1传输
  146. SetBit(DMA1_CR0, DBGEN | DRAM_SPI); // 设置DMA1使用DBG模式,XDATA发送数据到SPI
  147. if (!ReadBit(DMAAddr, 0x4000)) SetBit(DMA1_CR0, DBGSW); //根据DMAAddr判断是否在XRAM区,如果是则开启DBGSW
  148. DMA1_LEN = 7; // 设置DMA1发送数量为8
  149. // DMA1_BA = (uint16)spidebug & 0x07ff;
  150. DMA1_BA = DMAAddr & 0x07ff; // 设置DMA1发送首地址
  151. SetBit(*(&DMA0_CR0 + 1), DMAEN | DMABSY);
  152. // Switch_DMA(1); // 启动DMA1
  153. }
  154. void SetDbgData_DMA(unsigned short ulAddr)
  155. {
  156. bool bTmp = false;
  157. if (ReadBit(DMA1_CR0, DMAEN))
  158. {
  159. bTmp = true;
  160. while (ReadBit(DMA1_CR0, DMABSY));
  161. ClrBit(DMA1_CR0, DMAEN);
  162. }
  163. if (ulAddr <= 0xfff) ulAddr += 0x70000000;
  164. DMA1_BA = ulAddr;
  165. if (bTmp) SetBit(DMA1_CR0, DMAEN);
  166. }
  167. void EnableRun_DMA0(void)
  168. {
  169. SetBit(DMA0_CR0 , DMAEN | DMABSY);
  170. }
  171. void EnableRun_DMA1(void)
  172. {
  173. SetBit(DMA1_CR0 , DMAEN | DMABSY);
  174. }
  175. bool GetStatus_DMA0(eType_DMA_Statu eStatu)
  176. {
  177. return ReadBit(DMA0_CR0 , eStatu);
  178. }
  179. bool GetStatus_DMA1(eType_DMA_Statu eStatu)
  180. {
  181. return ReadBit(DMA1_CR0 , eStatu);
  182. }