CC2540读写SPIFlash

2019-07-27 17:47发布

最近用TI的cc2540读写韦帮的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写操作结束
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。