打印

cc2530 通过DMA访问flash问题

[复制链接]
2270|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
m503022388|  楼主 | 2015-11-5 14:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
两个问题:首先,我用这段代码擦除35页的数据,但是在XDATA窗口看到的和读取出来放到数组里看到的都是0x00,并没有擦除,这是为什么啊?
void Flash_PageErase( int pg)
{
  FADDRH = pg<<1;
  FCTL |= 0x01; //启动页面擦除
  while (FCTL & 0x80); //等待擦除完成
}


其次,我用DMA传输内存到flash的4字节数据,怎么都写不进去,底下是我的写函数,有没有高手指教一下。
void WriteFlashDMA( uint16 saddr, uint16 length, uint16 flashadr) //Write Flash, DMA Method
//Length Must be Divisible by 4 or last bytes fail to write
{
//配置DMA通道每次传送一个字节
  DMA_DESC dmaConfig0;//定义DMA通道
  //MEMCTR|=0X07;//将bank 7 映射到Xdata区
  dmaConfig0.SRCADDRH  = (saddr >> 8) & 0x00FF; //XData - To Be Written to Flash - Gets Incremented;存储data的高8位;
  dmaConfig0.SRCADDRL  = saddr & 0x00FF;//存储data地址的低8位;
  dmaConfig0.DESTADDRH = (((int)&FWDATA) >> 8) & 0x00FF; //Flash Controller Data Address - Flash Controller Writes Data//存储写寄存器的地址的高8位
  dmaConfig0.DESTADDRL = ((int)&FWDATA) & 0x00FF;//存储写寄存器的低8位;
  dmaConfig0.VLEN      = 0; //Variable Length Transfer - 0=Fixed LEN Transfer//采用LEN作为传送长度
  dmaConfig0.LENH      = (length>>8) & 0x00FF; //Number of WORDSZIE in Transfer - Must be Divisible by 4 - NET_ADDR_SIZE=4//存储传送长度高5位
  dmaConfig0.LENL      = length & 0x00FF;//存储长度低8位;
  dmaConfig0.WORDSIZE  = 0; //Size of Each Transfer - 0=8 Bit;每个DMA传送采用8位传送
  dmaConfig0.TMODE     = 0; //Transfer Mode - 1=Block, 0=Single,传送模式为单一模式
  dmaConfig0.TRIG      = 18; //DMA Trigger - 0=Manual Via DMAREQ, 18=Flash;flash触发
  dmaConfig0.SRCINC    = 0; //Source Address Increment - 1=1 Byte//源地址增量模式为1字节/字
  dmaConfig0.DESTINC   = 1; //Destination Address Increment - 0=0 Bytes (Always Write to FWDATA, No Need to Increment)目标地址增量模式0字节/字
  dmaConfig0.IRQMASK   = 0; //Interrupt Mask - 0=Disable Interrupts//禁止通道完成中断产生
  dmaConfig0.M8        = 0; //8th Bit Mode - 0=Use All 8 Bits使用全部8位作为传送长度
  dmaConfig0.PRIORITY  = 2; //Priority - 10(2)=High Priority优先级为DMA优先
//DMA模式写
  while (FCTL & 0x80); //Wait Until DMA Controller is Available - Busy Bit 7//等待写或擦除状态被激活
  
  /********* 存储写入flash页地址 ***********************************************/
  
  FADDRH =(flashadr >> 8) & 0x00FF; //
  FADDRL =(flashadr >> 0) & 0x00FF;  //
  //通道0配置地址
  DMA0CFGH = (((int)&dmaConfig0) >> 8) & 0x00FF; //Pass DmaConfig0
  DMA0CFGL = ((int)&dmaConfig0) & 0x00FF;
   
  
  DMAARM |= 0x01; //Arm the DMA Channel//通道0进去工作状态
  FCTL |= 0x02; //Start Write
    //while (!(DMAIRQ & 0x01)); //Wait Until Write Complete
    //DMAIRQ &= 0xFE; //Clear Any DMA IRQ on Channel 0 - Bit 0
  while (FCTL & (0x80)); //Wait Until Flash Controller is Not Busy - Busy Bit 7//等待或者擦除状态激活
}


我的写操作通过串口触发的,一次写一个uint32的字,但是调试的时候在XDATA的目的地址里看到的都是0xff,是这个flash有跟stm32类似有个写保护么?还是怎么回事

相关帖子

沙发
dirtwillfly| | 2015-11-5 21:08 | 只看该作者

使用特权

评论回复
板凳
zhangbo1985| | 2015-11-7 16:20 | 只看该作者
DMA的用处非常多的,可以节省单片机的片内资源的

使用特权

评论回复
地板
tongbu2015| | 2015-11-7 17:09 | 只看该作者
这个是提高了访问flash的效率的。

使用特权

评论回复
5
m503022388|  楼主 | 2015-11-9 11:41 | 只看该作者
dirtwillfly 发表于 2015-11-5 21:08
可以参考这个帖子:http://e2e.ti.com/support/wireless_connectivity/f/155/t/231885

请问下,能不能用DMA直接从串口的U0DBUF寄存器读取到FLASH制定地址但不经过RAM?可以的话要怎么做?

使用特权

评论回复
6
dirtwillfly| | 2015-11-9 13:53 | 只看该作者
m503022388 发表于 2015-11-9 11:41
请问下,能不能用DMA直接从串口的U0DBUF寄存器读取到FLASH制定地址但不经过RAM?可以的话要怎么做? ...

不清楚。我对这个协议栈不熟。应该可以吧

使用特权

评论回复
7
m503022388|  楼主 | 2015-11-9 14:01 | 只看该作者
dirtwillfly 发表于 2015-11-9 13:53
不清楚。我对这个协议栈不熟。应该可以吧

那在裸机的情况下呢?因为我最近看的很多例程都是把串口数据读到内存,再从内存写到FLASH里,只不过写的方式用的是DMA。所以我想跳过内存这部分直接写FLASH。裸机的DMA写一直没配置成功所以很不确定能不能这么做。

使用特权

评论回复
8
Snow7| | 2015-11-9 20:58 | 只看该作者
跳过内存这部分直接写FLASH

感觉这样不行吧

使用特权

评论回复
9
309030| | 2015-11-10 19:30 | 只看该作者
跳过内存这部分直接写FLASH可以吗,期待楼主解决

使用特权

评论回复
10
m503022388|  楼主 | 2015-11-14 14:36 | 只看该作者
请问下,cc2530的DMA在传输中,如果我要传输一个成员全是uint32的结构体,那么1个字/字节算一次传输还是传输整个结构体算一次传输?datasheet也没讲明白四个传输模式到底能实现怎么样的效果。
我现在的情况是,我在写这个结构体的时候flash能被写入但是每个成员都只被写入了第一个字节,搞不懂传输模式跟源/目的地址的增量要怎么配置。以下是我的配置代码,而且奇怪的是目的地址的增量如果不是0就不能写入flash,求解!
  halDMADesc_t *ch = HAL_NV_DMA_GET_DESC();

  HAL_DMA_SET_SOURCE(ch, buf);
  HAL_DMA_SET_DEST(ch, &FWDATA);
  HAL_DMA_SET_VLEN(ch, HAL_DMA_VLEN_USE_LEN);
  HAL_DMA_SET_LEN(ch, (cnt * HAL_FLASH_WORD_SIZE));
  HAL_DMA_SET_WORD_SIZE(ch, HAL_DMA_WORDSIZE_BYTE);
  HAL_DMA_SET_TRIG_MODE(ch, HAL_DMA_TMODE_SINGLE);
  HAL_DMA_SET_TRIG_SRC(ch, HAL_DMA_TRIG_FLASH);
  HAL_DMA_SET_SRC_INC(ch, HAL_DMA_SRCINC_1);
  HAL_DMA_SET_DST_INC(ch, HAL_DMA_DSTINC_0);
  // The DMA is to be polled and shall not issue an IRQ upon completion.
  HAL_DMA_SET_IRQ(ch, HAL_DMA_IRQMASK_DISABLE);
  HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS);
  HAL_DMA_SET_PRIORITY(ch, HAL_DMA_PRI_HIGH);
  HAL_DMA_CLEAR_IRQ(HAL_NV_DMA_CH);
  HAL_DMA_ARM_CH(HAL_NV_DMA_CH);

  FADDRL = (uint8)addr;
  FADDRH = (uint8)(addr >> 8);
  
//  DMA0CFGH =(uint8)(((uint)&dmaCh0) >> 8) & 0x00FF;
//  DMA0CFGL = (uint8)((uint)&dmaCh0) & 0x00FF;
  
  FCTL |= 0x02;         // Trigger the DMA writes.
  while (FCTL & 0x80);  // Wait until writing is done.

使用特权

评论回复
11
m503022388|  楼主 | 2015-11-14 14:37 | 只看该作者
自己顶起来啊!只有这个论坛有回复,求不沉!

使用特权

评论回复
12
309030| | 2015-11-14 19:51 | 只看该作者
DMA可以节省片内资源

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

37

帖子

0

粉丝