| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- #include "DMA.h"
- #include <FU68xx_5_DMA.h>
- //#define DMALENT 128
- unsigned char xdata sg_ucUartDbgData[DMALENT] = {0xaa, 0xbb};
- char sg_cUartDataLen;
- unsigned char sg_ucUartDataSum;
- void DMA0_XRAMToUART_Init(void)
- {
- /* -----DMACFG2:DMACFG1: DMACFG0-->001 传输方向XRAMToUART----- */
- SetReg(DMA0_CR0, DMAEN | DMACFG2 | DMACFG1 | DMACFG0 | DMAIE, DMACFG0 ); // DMAIE和DMACFG0为1
- DMA0_LEN = DMALENT; // 设置传输长度为7,每传输7字节产生一次中断
- DMA0_BA = (uint16)GetAddr_UARTDBG(); // 设置RAM中的首地址
- SetBit(DMA0_CR0, DMAEN); // 使能DMA1
- }
- /**
- 获取缓存区的地址
- @return 缓存区地址
- */
- unsigned char * GetAddr_UARTDBG(void)
- {
- return &sg_ucUartDbgData;
- }
- /**
- * 配置DMA
- *
- * @param DMAx DMA通道
- * @param DMAPipe DMA管道,可选参数如下
- * UART1_XDATA UART1-->XDATA
- * XDATA_UART1 UART1<--XDATA
- * I2C_XDATA I2C -->XDATA
- * XDATA_I2C I2C <--XDATA
- * SPI_XDATA SPI -->XDATA
- * XDATA_SPI SPI <--XDATA
- * UART2_XDATA UART2-->XDATA
- * XDATA_UART2 UART2<--XDATA
- * @param DMAAddr 传输首地址,可取地址范围:0x0000~0x0317
- * @param DMALen 数据包大小(1~64)
- */
- void Conf_DMA(uint8 DMAx, uint8 DMAPipe, uint16 DMAAddr, uint8 DMALen)
- {
- Wait_DMA(DMAx); // 等待DMAx传输结束
- ClrBit(*(&DMA0_CR0 + DMAx), DMAEN); // 禁止DMAx的传输
- SetReg(*(&DMA0_CR0 + DMAx), DMA_PIPE, DMAPipe); // 设置DMAx的传输管道
- *(&DMA0_LEN + DMAx) = DMALen - 1; // 设置DMAx传输数量
- *(&DMA0_BA + DMAx) = DMAAddr & 0x07ff; // 设置DMAx传输首地址
- }
- void SetPipe_DMA0(eType_DMA_PIPE ePipe)
- {
- bool bTmp = false;
- if (ReadBit(DMA0_CR0 , DMAEN))
- {
- bTmp = true;
- while (ReadBit(DMA0_CR0 , DMABSY));
- ClrBit(DMA0_CR0 , DMAEN);
- }
- SetReg(DMA0_CR0 , DMACFG2 | DMACFG1 | DMACFG0 , ePipe);
- if (bTmp) SetBit(DMA0_CR0 , DMAEN);
- }
- void SetPipe_DMA1(eType_DMA_PIPE ePipe)
- {
- bool bTmp = false;
- if (ReadBit(DMA1_CR0 , DMAEN))
- {
- bTmp = true;
- while (ReadBit(DMA1_CR0 , DMABSY));
- ClrBit(DMA1_CR0 , DMAEN);
- }
- SetReg(DMA1_CR0 , DMACFG2 | DMACFG1 | DMACFG0 , ePipe);
- if (bTmp) SetBit(DMA1_CR0 , DMAEN);
- }
- void SetDataPackage_DMA0(unsigned short ulAddr , char cLen)
- {
- bool bTmp = false;
- if (ReadBit(DMA0_CR0 , DMAEN))
- {
- bTmp = true;
- while (ReadBit(DMA0_CR0 , DMABSY));
- ClrBit(DMA0_CR0 , DMAEN);
- }
- DMA0_LEN = cLen;
- DMA0_BA = ulAddr;
- if (bTmp) SetBit(DMA0_CR0, DMAEN);
- }
- void SetDataPackage_DMA1(unsigned short ulAddr, char cLen)
- {
- bool bTmp = false;
- if (ReadBit(DMA1_CR0 , DMAEN))
- {
- bTmp = true;
- while (ReadBit(DMA1_CR0 , DMABSY));
- ClrBit(DMA1_CR0 , DMAEN);
- }
- DMA1_LEN = cLen;
- DMA1_BA = ulAddr;
- if (bTmp) SetBit(DMA1_CR0 , DMAEN);
- }
- void SetEndian_DMA(eType_DMA_Endian eEndian)
- {
- bool bTmp = false, bTmp1;
- if (ReadBit(DMA0_CR0 , DMAEN))
- {
- bTmp = true;
- while (ReadBit(DMA0_CR0 , DMABSY));
- ClrBit(DMA0_CR0 , DMAEN);
- }
- if (ReadBit(DMA1_CR0 , DMAEN))
- {
- bTmp1 = true;
- while (ReadBit(DMA1_CR0 , DMABSY));
- ClrBit(DMA1_CR0 , DMAEN);
- }
- SetReg(DMA0_CR0, ENDIAN, eEndian);
- if (bTmp) SetBit(DMA0_CR0 , DMAEN);
- if (bTmp1) SetBit(DMA1_CR0 , DMAEN);
- }
- void SetIRQ_DMA(ebool eIRQ, eType_DMA_IRQ eIP)
- {
- SetReg(DMA0_CR0, DMAIE, eIRQ ? DMAIE : 0);
- if (!EA) EA = 1;
- if (eIRQ) SetReg(IP1 , PDMA1 | PDMA0 , eIP);
- }
- void SetDbgMod_DMA(void)
- {
- bool bTmp = false;
- if (ReadBit(DMA1_CR0 , DMAEN))
- {
- bTmp = true;
- while (ReadBit(DMA1_CR0 , DMABSY));
- ClrBit(DMA1_CR0 , DMAEN);
- }
- SetBit(DMA1_CR0 , DBGEN);
- SetBit(DMA1_CR0 , ((eType_DMA_PIPE)DRAM_SPI));
- DMA1_LEN = 4;
- if (bTmp) SetBit(DMA1_CR0, DMAEN);
- }
- /**
- * 设置DMA1的DBG模式
- *
- * @param Addr 要DBG输出的地址
- */
- uint16 xdata spidebug[4] = { 0 };
- void Set_DBG_DMA(uint16 DMAAddr)
- {
- // SPI_Init();
-
- ClrBit(DMA1_CR0, DMAEN); // 禁止DMA1传输
- SetBit(DMA1_CR0, DBGEN | DRAM_SPI); // 设置DMA1使用DBG模式,XDATA发送数据到SPI
- if (!ReadBit(DMAAddr, 0x4000)) SetBit(DMA1_CR0, DBGSW); //根据DMAAddr判断是否在XRAM区,如果是则开启DBGSW
- DMA1_LEN = 7; // 设置DMA1发送数量为8
- // DMA1_BA = (uint16)spidebug & 0x07ff;
- DMA1_BA = DMAAddr & 0x07ff; // 设置DMA1发送首地址
- SetBit(*(&DMA0_CR0 + 1), DMAEN | DMABSY);
- // Switch_DMA(1); // 启动DMA1
- }
- void SetDbgData_DMA(unsigned short ulAddr)
- {
- bool bTmp = false;
- if (ReadBit(DMA1_CR0, DMAEN))
- {
- bTmp = true;
- while (ReadBit(DMA1_CR0, DMABSY));
- ClrBit(DMA1_CR0, DMAEN);
- }
- if (ulAddr <= 0xfff) ulAddr += 0x70000000;
- DMA1_BA = ulAddr;
- if (bTmp) SetBit(DMA1_CR0, DMAEN);
- }
- void EnableRun_DMA0(void)
- {
- SetBit(DMA0_CR0 , DMAEN | DMABSY);
- }
- void EnableRun_DMA1(void)
- {
- SetBit(DMA1_CR0 , DMAEN | DMABSY);
- }
- bool GetStatus_DMA0(eType_DMA_Statu eStatu)
- {
- return ReadBit(DMA0_CR0 , eStatu);
- }
- bool GetStatus_DMA1(eType_DMA_Statu eStatu)
- {
- return ReadBit(DMA1_CR0 , eStatu);
- }
|