野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14265|回复: 11

FLASH BUFFER WRITER (重写火哥SPI FLASH burrer函数,更牛逼)

[复制链接]
发表于 2016-7-26 19:33:24 | 显示全部楼层 |阅读模式
       在学习火哥的SPI-FLASH实验时, 感觉火哥的SPI _ FLASH _ BufferWrite函数写的着实不好理解。 在费了一番功夫以后, 自己换了个思路重新将
此函数写了一遍。
       我的基本思路是根本没有必要考虑对齐的问题, 因为对齐是不对齐的特例, 如此一来, 思路就非常明朗了, 只需要考虑要写的数据的个数和要写
的地址所在页的剩余空间大小的比较即可。 即: 当要写的数据个数小于等于要写的地址所在页的剩余空间大小时, 则直接将要写的数据在要写的
地址开始一次性写完就OVER了; 当要写的数据个数大于要写的地址所在页的剩余空间大小时, 则首先将要写的地址所在页的剩余空间大小写完,
其次, 再分析剩下的数据: 即 要写的数据个数 - 上一步写的地址所在页的剩余空间大小 后, 数据还有几页要写, 然后分别写完。
       感觉自己说的让人更不好理解了, 直接看代码吧
/*******************************************************************************
* Function Name  : SPI_FLASH_BufferWrite
* Description    : Writes block of data to the FLASH. In this function, the
*                  number of WRITE cycles are reduced, using Page WRITE sequence.
* Input          : - pBuffer : pointer to the buffer  containing the data to be
*                    written to the FLASH.
*                  - WriteAddr : FLASH's internal address to write to.
*                  - NumByteToWrite : number of bytes to write to the FLASH.
* Output         : None
* Return         : None
*******************************************************************************/
void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite)
{
  u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;

  Addr = WriteAddr % SPI_FLASH_PageSize;
  count = SPI_FLASH_PageSize - Addr;//计算一页的剩余空间

        if(NumByteToWrite<=count)//要写的数据小于等于一页的剩余空间
        {
                SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
        }
        else//要写的数据大于一页的剩余空间
        {
                NumByteToWrite -= count;
                NumOfPage =  NumByteToWrite / SPI_FLASH_PageSize;
                NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;

                if(count)//先写一页的剩余空间
                {
                        SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);
                        WriteAddr +=  count;
                        pBuffer += count;
                }
               
                while (NumOfPage)//NumOfPage页数据
                {
                        SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);
                        WriteAddr +=  SPI_FLASH_PageSize;
                        pBuffer += SPI_FLASH_PageSize;
                        NumOfPage--;
                }

                if (NumOfSingle)//不足一页数据
                {
                        SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);
                }
        }
      

}

FLASH_buffer_write.pdf (51.68 KB, 下载次数: 78)

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2016-7-27 08:51:17 | 显示全部楼层
cool                        ,写的不错
回复 支持 反对

使用道具 举报

发表于 2016-7-27 09:07:52 | 显示全部楼层
很好,简单多了,火哥的这函数貌似是直接用st官方的,st写的比较复杂
回复 支持 反对

使用道具 举报

发表于 2016-7-27 09:33:22 | 显示全部楼层
GOOD JOB,复制下来验证下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 17:46:21 | 显示全部楼层
解凝然 发表于 2016-7-27 09:33
GOOD JOB,复制下来验证下

我简单的验证过,如果你发现BUG,我们可以相互学习,期待你的验证结果。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 17:47:30 | 显示全部楼层
fire 发表于 2016-7-27 08:51
cool                        ,写的不错

还在学习中~~~~~~~~~~~~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 17:50:05 | 显示全部楼层
相津童 发表于 2016-7-27 09:07
很好,简单多了,火哥的这函数貌似是直接用st官方的,st写的比较复杂

不知道是不是st官方的,不过理解却废了我一番功夫
回复 支持 反对

使用道具 举报

发表于 2016-7-28 17:15:24 | 显示全部楼层
不错哦
                             
回复 支持 反对

使用道具 举报

发表于 2016-7-28 17:19:36 | 显示全部楼层
li756595003 发表于 2016-7-27 17:50
不知道是不是st官方的,不过理解却废了我一番功夫

是的,我们用的是直接从st官方搞过来的函数,理解是比较复杂,我讲视频还要搞个表来解释,不直观
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-29 17:46:41 | 显示全部楼层
flyleaf 发表于 2016-7-28 17:19
是的,我们用的是直接从st官方搞过来的函数,理解是比较复杂,我讲视频还要搞个表来解释,不直观

如果可以的话,可以介绍这个思路给大家参考啊
回复 支持 反对

使用道具 举报

发表于 2016-10-29 22:54:50 | 显示全部楼层
厉害 谢谢              
回复 支持 反对

使用道具 举报

发表于 2017-6-6 16:02:53 | 显示全部楼层
厉害了WORD哥               
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-29 17:38 , Processed in 0.056771 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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