中级会员
- 积分
- 437
- 金钱
- 437
- 注册时间
- 2014-10-21
- 在线时间
- 49 小时
|
ucosiii会导致flash数据初始化全部为0xff,flash是W25Q64,对flash的操作函数是原子哥的例程。而且我在进行flash操作的时候是把调度器给关闭掉的,求大神们帮助
void SPI_Flash_Write(CPU_INT08U* pBuffer,CPU_INT32U WriteAddr,CPU_INT16U NumByteToWrite)
{
CPU_INT32U secpos;
CPU_INT16U secoff;
CPU_INT16U secremain;
CPU_INT16U i;
CPU_SR_ALLOC();
OS_CRITICAL_ENTER();
secpos=WriteAddr/4096;//扇区地址
secoff=WriteAddr%4096;//在扇区内的偏移
secremain=4096-secoff;//扇区剩余空间大小
if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节
while(1)
{
SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//读出整个扇区的内容
for(i=0;i<secremain;i++)//校验数据
{
if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除
}
if(i<secremain)//需要擦除
{
SPI_Flash_Erase_Sector(secpos);//擦除这个扇区
for(i=0;i<secremain;i++) //复制
{
SPI_FLASH_BUF[i+secoff]=pBuffer[i];
}
SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区
}else SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间.
if(NumByteToWrite==secremain)break;//写入结束了
else//写入未结束
{
secpos++;//扇区地址增1
secoff=0;//偏移位置为0
pBuffer+=secremain; //指针偏移
WriteAddr+=secremain;//写地址偏移
NumByteToWrite-=secremain; //字节数递减
if(NumByteToWrite>4096)secremain=4096; //下一个扇区还是写不完
else secremain=NumByteToWrite; //下一个扇区可以写完了
}
}
OS_CRITICAL_EXIT_NO_SCHED();
}
void SPI_Flash_Read(CPU_INT08U* pBuffer,CPU_INT32U ReadAddr,CPU_INT16U NumByteToRead)
{
CPU_INT16U i;
CPU_SR_ALLOC();
OS_CRITICAL_ENTER();
SPI_FLASH_CS=0; //使能器件
SPI1_ReadWriteByte(W25X_ReadData); //发送读取命令
SPI1_ReadWriteByte((CPU_INT08U)((ReadAddr)>>16)); //发送24bit地址
SPI1_ReadWriteByte((CPU_INT08U)((ReadAddr)>>8));
SPI1_ReadWriteByte((CPU_INT08U)ReadAddr);
for(i=0;i<NumByteToRead;i++)
{
pBuffer[i]=SPI1_ReadWriteByte(0XFF); //循环读数
}
SPI_FLASH_CS=1; //取消片选
OS_CRITICAL_EXIT_NO_SCHED();
}
|
|