10833|11

11

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

TI的CC2540读写spiflash [复制链接]

最近用TI的cc2540(51的核,8Kram,128kflash)读写华邦的W25Q16的SPIflash,发现CC2540每一个小时都会定时死机,只有重新上电复位才能重新开始工作,经过多方调试才把问题定位到了是spiflash有问题,但是研究代码又没发现有什么问题!真是纠结了。
我程序的流程是每2秒写一次flash,每次写的数据量是9个字节,写完后spiflash进入休眠,cc2540也进入休眠,2秒的定时到了之后,重复上面的过程,数据是循环写的。

写数据的程序如下:

void spi_flash_BufferWrite(uint8* pBuffer, uint32 WriteAddr, uint16 NumByteToWrite)
{
    uint8 Addr = 0, NumOfPage = 0, NumOfSingle = 0, count = 0, temp = 0;

    Addr = WriteAddr % SPI_FLASH_PageSize; //某页中的第Addr个地址
    count = SPI_FLASH_PageSize - Addr;  //某页中还剩余coun个地址空闲
    NumOfPage =  NumByteToWrite / SPI_FLASH_PageSize; //待写数据占用了页数
    NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; //待写数据写了整数页大小的数据量后还剩多少个字节要写

    if (Addr == 0) // 写入的地址刚好在下页地址首地址  
    {
        if (NumOfPage == 0) // 待写入的数据小于一页的容量256
        {
            spi_flash_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
        }
        else // 待写入的数据大于一页的容量256
        {
            while (NumOfPage--)
            {
                spi_flash_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);
                WriteAddr +=  SPI_FLASH_PageSize;
                pBuffer += SPI_FLASH_PageSize;
            }

            spi_flash_PageWrite(pBuffer, WriteAddr, NumOfSingle);
        }
    }
    else // 待写入的地址不在某页的首地址
    {
        if (NumOfPage == 0) // 待写入的数据 < 256字节
        {
            if (NumOfSingle > count) // 待写入的数据量 + 待写入数据的首地址 > 当前页空余的空间
            {
                temp = NumOfSingle - count;

                spi_flash_PageWrite(pBuffer, WriteAddr, count);
                WriteAddr +=  count;
                pBuffer += count;

                spi_flash_PageWrite(pBuffer, WriteAddr, temp);
            }
            else
            {
                spi_flash_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
            }
        }
        else // 待写入的数据 > 256字节
        {
            NumByteToWrite -= count;
            NumOfPage =  NumByteToWrite / SPI_FLASH_PageSize;
            NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;

            spi_flash_PageWrite(pBuffer, WriteAddr, count);
            WriteAddr +=  count;
            pBuffer += count;

            while (NumOfPage--)
            {
                spi_flash_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);
                WriteAddr +=  SPI_FLASH_PageSize;
                pBuffer += SPI_FLASH_PageSize;
            }

            if (NumOfSingle != 0)
            {
                spi_flash_PageWrite(pBuffer, WriteAddr, NumOfSingle);
            }
        }
    }
}

----------------------------------------------------------------------------------------------------------------------------------
void spi_flash_PageWrite(uint8* pBuffer, uint32 WriteAddr, uint16 NumByteToWrite)
{
   
    halspi_cs_low(); // 使能slave
   
    spi_flash_WriteEnable(); // 使能Flash写操作
      
    spi_flash_SendByte(W25X_PageProgram); // 发送 "Write to Memory " 指令
   
    //if(WriteAddr >= 0x1fffff)  WriteAddr = START_WRITE_LOCATION;//写到片尾,从第三个sector手开始从新写
   
    spi_flash_SendByte((WriteAddr & 0xFF0000) >> 16); // 发送待写入地址的高地址位
   
    spi_flash_SendByte((WriteAddr & 0xFF00) >> 8); // 发送待写入地址的中间不服地址位
   
    spi_flash_SendByte(WriteAddr & 0xFF); // 发送待写入地址的低地址位
   
    if(NumByteToWrite > SPI_FLASH_PerWritePageSize)
    {
        NumByteToWrite = SPI_FLASH_PerWritePageSize;
    }
   
    while (NumByteToWrite--) // 循环写数据
    {
        
        spi_flash_SendByte(*pBuffer); // 发送当前待写入的数据
        
        pBuffer++; // 下一个待写入数据
    }
   
    halspi_cs_high(); // 禁用slave
   
    spi_flash_WaitForWriteEnd(); // 等待Flash写操作结束
}
此帖出自无线连接论坛

最新回复

  详情 回复 发表于 2020-2-28 17:04
点赞 关注
 

回复
举报

1295

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
cc2540f先建议不用休眠模式测试!!!!!!!!!!!!
此帖出自无线连接论坛
个人签名

 

 

 
 
 

回复

1295

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
另外需要大批量烧录cc2540f芯片工具可以联系我!
此帖出自无线连接论坛
个人签名

 

 

 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

4
 
大秦正声 发表于 2015-4-7 17:05
cc2540f先建议不用休眠模式测试!!!!!!!!!!!!

无休眠模式测试过,也是1小时左右准时死机,死机提示IDATA益处,等几十秒后再提示XDATA益处!不知道是在操作flash的哪个步骤引起的问题!
此帖出自无线连接论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

5
 
这么有规律的错误显然是你的代码造成的,而且提示也很明确了,Xdata溢出。有可能是你的指针一直在加,直到超过了8K的范围,再读写这个指针指向的内容的时候就会出现这种情况了。仔细检查一下吧。
而且Flash每2秒写一些,一个扇区也就用三四天吧。我记得flash的扇区擦写次数也就10万次,具体的看一下datashet吧,确认一下这样的操作会不会影响flash的寿命。
此帖出自无线连接论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

6
 
jishuaihu 发表于 2015-4-8 13:24
这么有规律的错误显然是你的代码造成的,而且提示也很明确了,Xdata溢出。有可能是你的指针一直在加,直到超过了8K的范围,再读写这个指针指向的内容的时候就会出现这种情况了。仔细检查一下吧。
而且Flash每2秒写一些,一个扇区也就用三四天吧。我记得flash的扇区擦写次数也就10万次,具体的看一下datashet吧,确认一下这样的操作会不会影响flash的寿命。

  一个扇区怎么可能用三到四天……循环写的!写一年都不会出事!XDATA溢出肯定知道是程序在某些情况操作出错导致程序跑飞呀,要不然程序怎么会跑飞呢?经过多次测试已经证明代码没错了!
此帖出自无线连接论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

7
 
自己确定了就行。既然代码没有问题那就是硬件问题。自己找呗
此帖出自无线连接论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
TI的CC2540读写spiflash,你这个搞好了么?可以把相关驱动发我一份么?谢谢,joneming@163.com
此帖出自无线连接论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(中级)

9
 
你这个操作spiflash的流程有问题吧
1.要写入spiflash数据,如果不是全FF,需要先擦除后再写
2.写数据流程:
    2.1:先写首页;判断首页还剩下多少bytes
    2.2:写中间页
    2.3:写最后页
此帖出自无线连接论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(中级)

10
 
CC2540自身去操作spiflash的话很容易导致蓝牙断开,TI本身就有这个bug。
像这种应用,最好外挂一个MCU去操作外挂的spiflash,不然很容易导致蓝牙断开。SPIFLASH擦除很费时间的,一个sector的擦除都要150ms具体看规格书
此帖出自无线连接论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
chuck_pz 发表于 2017-3-25 20:57 CC2540自身去操作spiflash的话很容易导致蓝牙断开,TI本身就有这个bug。 像这种应用,最好外挂一个MCU去操 ...

你好,请问这个蓝牙断开的问题,只能外挂mcu吗

 

此帖出自无线连接论坛
 
 
 

回复

2618

帖子

0

TA的资源

纯净的硅(高级)

12
 

此帖出自无线连接论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表