This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2533 DMA 读写我没有成功。can you give me some advice?

Other Parts Discussed in Thread: CC2533

 #include <ioCC2533.h>
#include "mcu_io.h"
#include "flash.h"
#include <string.h>
typedef unsigned char uint8;

typedef struct
{
  unsigned char SRCADDRH;           //源地址高8位
  unsigned char SRCADDRL;           //源地址低8位
  unsigned char DESTADDRH;          //目的地址高8位
  unsigned char DESTADDRL;          //目的地址低8位
  unsigned char VLEN        :3;     //长度域模式选择
  unsigned char LENH        :5;     //传输长度高字节
  unsigned char LENL        :8;     //传输长度低字节
  unsigned char WORDSIZE    :1;     //字节(byte)或字(word)传输
  unsigned char TMODE       :2;     //传输模式选择
  unsigned char TRIG        :5;     //触发事件选择
  unsigned char SRCINC      :2;     //源地址增量:-1/0/1/2
  unsigned char DESTINC     :2;     //目的地址增量:-1/0/1/2
  unsigned char IRQMASK     :1;     //中断屏蔽
  unsigned char M8          :1;     //7或8bit传输长度,仅在字节传输模式下适用
  unsigned char PRIORITY    :2;     //优先级
}DMA_CFG;


void sys_clk_init(void)
{
    CLKCONCMD = ~0x47;
}

void delay(unsigned int ts)
{
    unsigned int t;
    for(t=0;t<ts;t++);
    for(t=0;t<ts;t++);
    for(t=0;t<ts;t++);
    for(t=0;t<ts;t++);
}


void Flash_read(unsigned char pg,   \
               unsigned char offset,\
               unsigned char* str,  \
               unsigned int n)      \
{
    unsigned char *addr;
    unsigned char save;
    pg /= 32;
    save = MEMCTR;
    MEMCTR = (MEMCTR & 0xF8)|pg;
    addr = (unsigned char*)0x8000+offset+(pg%32)*1024;
    while(n--)
    {
        *str++ = *addr++;
    }
    MEMCTR = save;
}
#define debug
void main(void)
{
  unsigned char str[10] = {0};
  DMA_CFG dmaConfig;       //定义配置结构体
  unsigned char sourceString[]="chinaymj learn cc2533 RF mcu";      //源字符串
  MEMCTR  = (MEMCTR & 0xF8)|0;//flash 低32kb映射到xdata 0x8000后的空间
  sys_clk_init();
  P1_1 = 0;
  P1DIR = 0xff;
#define flash
#ifdef flash
#ifdef debug
  FADDRH = 0;
  FCTL |= 0x01;//清空32页的1Kb空间
  //配置DMA结构体
#endif
  dmaConfig.SRCADDRH=(unsigned char)((unsigned int)&sourceString >> 8);     //源地址
  dmaConfig.SRCADDRL=(unsigned char)((unsigned int)&sourceString);
  dmaConfig.DESTADDRH=(unsigned char)((unsigned int)&FWDATA >> 8);      //目的地址
  dmaConfig.DESTADDRL=(unsigned char)((unsigned int)&FWDATA);
  dmaConfig.VLEN=0x00;         //选择LEN作为传送长度
  dmaConfig.LENH=(unsigned char)((unsigned int)sizeof(sourceString) >> 8);  //传输长度
  dmaConfig.LENL=(unsigned char)((unsigned int)sizeof(sourceString));
  dmaConfig.WORDSIZE=0x00;     //选择字节(byte)传送
  dmaConfig.TMODE=0x00;        //single
  dmaConfig.TRIG=18;            //flash
  dmaConfig.SRCINC=0x01;       //源地址增量为1
  dmaConfig.DESTINC=0x00;      //目的地址增量为0
  dmaConfig.IRQMASK=0;         //DMA中断屏蔽
  dmaConfig.M8=0x00;           //选择8位长的字节来传送数据
  dmaConfig.PRIORITY=0x02;     //传输优先级为高
  DMA0CFGH=(unsigned char)((unsigned int)&dmaConfig >> 8);   //将配置结构体的首地址赋予相关SFR
  DMA0CFGL=(unsigned char)((unsigned int)&dmaConfig);
  DMAARM=0x01;                 //启用配置 进入工作状态
  DMAIRQ=0x00;                 //清中断标志位
  DMAREQ=0x01;                 //启动DMA传输
  FADDRL = 0;//设置flash页面地址
  FADDRH = 1;
  FCTL |= 0x02;         // Trigger the DMA writes.
  while (FCTL & 0x80);  // Wait until writing is done.
  while(!(DMAIRQ&0x01));       //等待传输结束
 // MEMCTR  = (MEMCTR & 0xF8)|1;
  Flash_read(1,0,str,10);
  if(str[0] == 'c')
    LED_ON;
  else
    LED_OFF;
#endif
 
// MEMCTR &= ~(1<<3);// ram
}

我实在是没的办法了,没的效果啊!