搜索
bottom↓
回复: 14

两个CC2530之间通讯,不上zstack怎么读写内部flash啊, 30莫元

[复制链接]

出0入0汤圆

发表于 2015-11-2 21:01:11 | 显示全部楼层 |阅读模式
zstack看起来蛋疼,很多别扭,参照网上用了点对点直接简单传输。
但是需要内部flash读写,无奈网上基本zstack操作方式,用了其他的教程也没成功。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2015-11-2 21:17:30 | 显示全部楼层
成功了   以下程序可以用  只不多读取的时候地址要+0x8000
比如
      Flash_PageErase(3);
      WriteFlashDMA(test,8, 0X1900);
      Read_Flash_To_Buf(0X9900, buf, 8);   


#define uint unsigned int
#define uchar unsigned char

//定义DMA通道配置数据结构,每个DMA通道配置由8个字节组成;
//#pragma bitfields=reversed//采用大端格式的意思是用于几位的意思
                          //通知编译器完成特定的操作
typedef struct {

     uchar SRCADDRH;   //Byte 0 通道源地址 高位[15:8]
     uchar SRCADDRL;   //Byte 1通道源地址 地位[7: 0]
     uchar DESTADDRH;  //Byte 2通道目标地址 高位[15:8],flash存储器不可直接写
     uchar DESTADDRL;  //Byte 3通道目标地址 低位[7: 0],flash存储器不可直接写      
     uchar LENH:5;     //Byte 4 - Bit 4:0 DMA通道传送长度
     uchar VLEN:3;     //Byte 4 - Bit 7:5可变长度传送模式
     uchar LENL;       //Byte 5DMA通道传送长度
     uchar TRIG:5;     //Byte 6 - Bit 4:0; Timer 2, event pulse 1;选择要使用的DMA触发
     uchar TMODE:2;    //Byte 6 - Bit 6:5; Repeated single;DMA通道传送模式:重复单一模式
     uchar WORDSIZE:1; //Byte 6 - Bit 7; Selects whether each DMA transfer is 8-bit (0) or 16-bit (1);传送长度8位还是16位
     uchar PRIORITY:2; //Byte 7 - Bit 1:0;High, DMA has priority;DMA通道优先级:高
     uchar M8:1;       //Byte 7 - Bit 2  Use 7 LSB for transfer count;采用8th模式作为VLEN传送长度,仅应用在WORDSIZE =0且VLEN =000/111时;
     uchar IRQMASK:1;  //Byte 7 - Bit 3  Enable interrupt generation on DMA channel done;该通道的中断屏蔽
     uchar DESTINC:2;  //Byte 7 - Bit 5:4  Destination address increment mode (after each transfer);目标地址增量模式(传送之后)
     uchar SRCINC:2;  //Byte 7 - Bit 7:6  Source address increment mode (after each transfer);源地址增量模式(传送之后)

} DMA_DESC;
//#pragma bitfields=default //恢复默认的小端格式
//DMA 模式写数据

void WriteFlashDMA(uchar data[], int length, int 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  = ((int)data >> 8) & 0x00FF; //XData - To Be Written to Flash - Gets Incremented;存储data的高8位;
  dmaConfig0.SRCADDRL  = (int)data & 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    = 1; //Source Address Increment - 1=1 Byte//源地址增量模式为1字节/字
  dmaConfig0.DESTINC   = 0; //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 >> 10) & 0x00FF; // page size: 2048; select the flash page via FADDRH[7:1] bits//由于写入flash时是字(4字节)寻址的,所以存储高位需要右移2位;
  FADDRL =(flashadr >> 2) & 0x00FF;  //4字节寻址,存储要写入flash地址的低字节需要右移2位
  //通道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//等待或者擦除状态激活
   

}
//flash 页擦除
void Flash_PageErase(uchar byPage)
{
  EA=0;
  while(FCTL & 0x80);//等待闪存控制器整备好
  FADDRH = byPage << 1;//选择擦除的页面
  FCTL |= 0x01;//启动页面擦除
  while(FCTL & 0x80);//等待擦除完成
  EA=1;
}
//flash 读数据到缓存buf中

void Read_Flash_To_Buf(int read_adr, uchar *buf, uchar num_bytes)//read_adr=flashadr+0x8000
{
  unsigned char i;   
  for( i=0; i<num_bytes; i++)
  {
    buf[i]=*(volatile char *)(read_adr + i);
  }
}

出0入0汤圆

发表于 2015-11-26 17:48:28 | 显示全部楼层
请问楼主,这款芯片在仿真时,只能读不能写Flash吗?
我在仿真状态时,下面这3条语句怎么也没法执行
FADDRH =(flashadr >> 10) & 0x00FF; //
FADDRL =(flashadr >> 2) & 0x00FF;  //

FCTL |= 0x02; //Start Write

擦除函数倒是可以执行。

不知道为啥,是仿真状态的原因吗?

出0入0汤圆

发表于 2015-11-26 17:52:36 | 显示全部楼层
我看到闪存有锁定位保护的

出0入0汤圆

发表于 2015-11-26 17:53:14 | 显示全部楼层
对于锁定保护位你是怎么处理的?

出0入0汤圆

发表于 2015-11-26 18:19:03 | 显示全部楼层
用你的代码,测试结果如下截图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-11-26 18:20:02 | 显示全部楼层
是IAR配置原因??

出0入0汤圆

 楼主| 发表于 2015-11-26 20:15:48 | 显示全部楼层
codeyear 发表于 2015-11-26 18:20
是IAR配置原因??

具体我没研究   按照那个程序可以存储和读写,主要是地址对了,就可以了。

出0入0汤圆

 楼主| 发表于 2015-11-26 20:17:05 | 显示全部楼层
codeyear 发表于 2015-11-26 17:53
对于锁定保护位你是怎么处理的?

具体没研究下去,网上资料太少。  要不你研究下那个ZSTACK 的OTA。

出0入0汤圆

 楼主| 发表于 2015-11-26 20:18:46 | 显示全部楼层
你读写不对么?

出0入0汤圆

发表于 2015-11-26 21:40:36 | 显示全部楼层
我借用的你的例程,可是无法写入,不得其解
请问一下,
        MEMCTR =9;
        FMAP = 1;       
这两个寄存器你怎么配置的?

出0入0汤圆

发表于 2015-11-27 08:44:43 | 显示全部楼层

借用贵宝地,看能否有高人过来指导一下。

出0入0汤圆

 楼主| 发表于 2015-11-27 11:49:51 | 显示全部楼层
codeyear 发表于 2015-11-27 08:44
借用贵宝地,看能否有高人过来指导一下。

给你个我整理的 文件,你地址得弄下,地址没弄对就不行。具体怎么弄,我也是凑出来的,没深入

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-11-27 13:39:25 | 显示全部楼层
3050311118 发表于 2015-11-27 11:49
给你个我整理的 文件,你地址得弄下,地址没弄对就不行。具体怎么弄,我也是凑出来的,没深入

...

谢谢楼主的代码,再请问一下

        MEMCTR =9;//闪存相关
        FMAP = 1;   //闪存相关
这两个寄存器,你怎样配置的?

出0入0汤圆

 楼主| 发表于 2015-11-27 20:14:57 | 显示全部楼层
codeyear 发表于 2015-11-27 13:39
谢谢楼主的代码,再请问一下

        MEMCTR =9;//闪存相关

我除了下载下来  选个地址测试成功之后。其他的都没去研究
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 07:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表