OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2537|回复: 2

请教:spi中SPI_Flash_Write_NoCheck函数 中写入结束判断不明白啊!

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-1-12
在线时间
5 小时
发表于 2018-1-12 11:50:34 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 wo55059857 于 2018-1-12 11:55 编辑

向各位老师请教:
就是下面红的那句不明白,在蓝的那句中有pageremain=NumByteToWrite,那么在红的那句中NumByteToWrite==pageremain必然是相等的啊!难道在执行SPI_Flash_Write_Page(pBuffer,WriteAddr,pageremain);时pageremain的值还有变化吗?
................................................................................................................
//无检验写SPI FLASH
//必须确保所写的地址范围内的数据全部为0XFF,否则在非0XFF处写入的数据将失败!
//具有自动换页功能
//在指定地址开始写入指定长度的数据,但是要确保地址不越界!
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大65535)
//CHECK OK
void SPI_Flash_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
{                                          
        u16 pageremain;           
        pageremain=256-WriteAddr%256; //单页剩余的字节数                             
        if(NumByteToWrite<=pageremain)pageremain=NumByteToWrite;//不大于256个字节
        while(1)
        {           
                SPI_Flash_Write_Page(pBuffer,WriteAddr,pageremain);
                if(NumByteToWrite==pageremain)break;//写入结束了......1
                 else //NumByteToWrite>pageremain要写入的字节数大于剩余字节数
                {
                        pBuffer+=pageremain;//数据存储区+单页剩余的字节数
                        WriteAddr+=pageremain;//开始写入的地址+        单页剩余的字节数
                        NumByteToWrite-=pageremain;                          //减去已经写入了的字节数
                        if(NumByteToWrite>256)pageremain=256; //一次可以写入256个字节
                        else pageremain=NumByteToWrite;           //不够256个字节了
                }
        };            
}
.................................................................................................................

//SPI在一页(0~65535)内写入少于256个字节的数据
//在指定地址开始写入最大256字节的数据
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!!  
void SPI_Flash_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
  u16 i;  
    SPI_FLASH_Write_Enable();                  //SET WEL
SPI_FLASH_CS=0;                            //使能器件   
    SPI1_ReadWriteByte(W25X_PageProgram);      //发送写页命令   
    SPI1_ReadWriteByte((u8)((WriteAddr)>>16)); //发送24bit地址   
    SPI1_ReadWriteByte((u8)((WriteAddr)>>8));   
    SPI1_ReadWriteByte((u8)WriteAddr);   
    for(i=0;i<NumByteToWrite;i++)SPI1_ReadWriteByte(pBuffer);//循环写数  
SPI_FLASH_CS=1;                            //取消片选
SPI_Flash_Wait_Busy();        //等待写入结束
}

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

最佳答案

查看完整内容[请看2#楼]

注意那里有个if啊,不是每次都会满足这个if的!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-1-12 11:50:35 | 显示全部楼层
注意那里有个if啊,不是每次都会满足这个if的!!!

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-1-12
在线时间
5 小时
 楼主| 发表于 2018-1-13 09:04:18 | 显示全部楼层
谢谢原子的解答,昨晚想了想NumByteToWrite==pageremain应该是为了判断数据写完后在while中跳出来,可以当一个标志位来看,自己钻牛角尖了!基础不好!!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-13 22:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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