DMA.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /* --------------------------- (C) COPYRIGHT 2021 Fortiortech ShenZhen -----------------------------
  2. File Name : DMA.c
  3. Author : Fortiortech Appliction Team
  4. Version : V1.0
  5. Date : 2021-04-11
  6. Description : This file contains .C file function used for Motor Control.
  7. ----------------------------------------------------------------------------------------------------
  8. All Rights Reserved
  9. ------------------------------------------------------------------------------------------------- */
  10. #include <MyProject.h>
  11. #define Switch_DMA(a) SetBit(*(&DMA0_CR0 + a), DMAEN | DMABSY)
  12. void SetPipe_DMA0(eType_DMA_PIPE ePipe)
  13. {
  14. bool bTmp = false;
  15. if (ReadBit(DMA0_CR0 , DMAEN))
  16. {
  17. bTmp = true;
  18. while (ReadBit(DMA0_CR0 , DMABSY));
  19. ClrBit(DMA0_CR0 , DMAEN);
  20. }
  21. SetReg(DMA0_CR0 , DMACFG2 | DMACFG1 | DMACFG0 , (uint8)ePipe);
  22. if (bTmp) SetBit(DMA0_CR0 , DMAEN);
  23. }
  24. void SetPipe_DMA1(eType_DMA_PIPE ePipe)
  25. {
  26. bool bTmp = false;
  27. if (ReadBit(DMA1_CR0 , DMAEN))
  28. {
  29. bTmp = true;
  30. while (ReadBit(DMA1_CR0 , DMABSY));
  31. ClrBit(DMA1_CR0 , DMAEN);
  32. }
  33. SetReg(DMA1_CR0 , DMACFG2 | DMACFG1 | DMACFG0 , (uint8)ePipe);
  34. if (bTmp) SetBit(DMA1_CR0 , DMAEN);
  35. }
  36. void SetDataPackage_DMA0(unsigned short ulAddr , char cLen)
  37. {
  38. bool bTmp = false;
  39. if (ReadBit(DMA0_CR0 , DMAEN))
  40. {
  41. bTmp = true;
  42. while (ReadBit(DMA0_CR0 , DMABSY));
  43. ClrBit(DMA0_CR0 , DMAEN);
  44. }
  45. DMA0_LEN = cLen;
  46. DMA0_BA = ulAddr;
  47. if (bTmp) SetBit(DMA0_CR0, DMAEN);
  48. }
  49. void SetDataPackage_DMA1(unsigned short ulAddr, char cLen)
  50. {
  51. bool bTmp = false;
  52. if (ReadBit(DMA1_CR0 , DMAEN))
  53. {
  54. bTmp = true;
  55. while (ReadBit(DMA1_CR0 , DMABSY));
  56. ClrBit(DMA1_CR0 , DMAEN);
  57. }
  58. DMA1_LEN = cLen;
  59. DMA1_BA = ulAddr;
  60. if (bTmp) SetBit(DMA1_CR0 , DMAEN);
  61. }
  62. void SetEndian_DMA(eType_DMA_Endian eEndian)
  63. {
  64. bool bTmp = false, bTmp1 = false;
  65. if (ReadBit(DMA0_CR0 , DMAEN))
  66. {
  67. bTmp = true;
  68. while (ReadBit(DMA0_CR0 , DMABSY));
  69. ClrBit(DMA0_CR0 , DMAEN);
  70. }
  71. if (ReadBit(DMA1_CR0 , DMAEN))
  72. {
  73. bTmp1 = true;
  74. while (ReadBit(DMA1_CR0 , DMABSY));
  75. ClrBit(DMA1_CR0 , DMAEN);
  76. }
  77. SetReg(DMA0_CR0, ENDIAN, (uint8)eEndian);
  78. if (bTmp) SetBit(DMA0_CR0 , DMAEN);
  79. if (bTmp1) SetBit(DMA1_CR0 , DMAEN);
  80. }
  81. void SetIRQ_DMA(ebool eIRQ, eType_DMA_IRQ eIP)
  82. {
  83. SetReg(DMA0_CR0, DMAIE, eIRQ ? DMAIE : 0);
  84. if (!EA) EA = 1;
  85. if (eIRQ) SetReg(IP1 , PDMA1 | PDMA0 , (uint8)eIP);
  86. }
  87. void SetDbgMod_DMA(void)
  88. {
  89. bool bTmp = false;
  90. if (ReadBit(DMA1_CR0 , DMAEN))
  91. {
  92. bTmp = true;
  93. while (ReadBit(DMA1_CR0 , DMABSY));
  94. ClrBit(DMA1_CR0 , DMAEN);
  95. }
  96. SetBit(DMA1_CR0 , DBGEN);
  97. SetBit(DMA1_CR0 , ((uint8)DRAM_SPI));
  98. DMA1_LEN = 4;
  99. if (bTmp) SetBit(DMA1_CR0, DMAEN);
  100. }
  101. /**
  102. * 设置DMA1的DBG模式
  103. *
  104. * @param Addr 要DBG输出的地址
  105. */
  106. void Set_DBG_DMA(uint16 DMAAddr)
  107. {
  108. ClrBit(DMA1_CR0, DMAEN); // 禁止DMA1传输
  109. SetBit(DMA1_CR0, (DBGEN | (uint8)DRAM_SPI)); // 设置DMA1使用DBG模式,XDATA发送数据到SPI
  110. if (!ReadBit(DMAAddr, 0x4000)) SetBit(DMA1_CR0, DBGSW); //根据DMAAddr判断是否在XRAM区,如果是则开启DBGSW
  111. DMA1_LEN = 7; // 设置DMA1发送数量为8
  112. DMA1_BA = DMAAddr & 0x07ff; // 设置DMA1发送首地址
  113. Switch_DMA(1); // 启动DMA1
  114. }
  115. void SetDbgData_DMA(unsigned short ulAddr)
  116. {
  117. bool bTmp = false;
  118. if (ReadBit(DMA1_CR0, DMAEN))
  119. {
  120. bTmp = true;
  121. while (ReadBit(DMA1_CR0, DMABSY));
  122. ClrBit(DMA1_CR0, DMAEN);
  123. }
  124. if (ulAddr <= 0xfff) ulAddr += 0x70000000;
  125. DMA1_BA = ulAddr;
  126. if (bTmp) SetBit(DMA1_CR0, DMAEN);
  127. }
  128. void EnableRun_DMA0(void)
  129. {
  130. SetBit(DMA0_CR0 , DMAEN | DMABSY);
  131. }
  132. void EnableRun_DMA1(void)
  133. {
  134. SetBit(DMA1_CR0 , DMAEN | DMABSY);
  135. }
  136. bool GetStatus_DMA0(eType_DMA_Statu eStatu)
  137. {
  138. return ReadBit(DMA0_CR0 , (uint8)eStatu);
  139. }
  140. bool GetStatus_DMA1(eType_DMA_Statu eStatu)
  141. {
  142. return ReadBit(DMA1_CR0 , (uint8)eStatu);
  143. }