OpenEdv-开源电子网

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

移植FATFS,diskio.c发现W25Q80扇区读写函数不行,导致创建文件失败,求大神指点,多谢!

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-6-30
在线时间
5 小时
发表于 2016-7-9 09:48:17 | 显示全部楼层 |阅读模式
//Sector Read
void Flash_Read_Sector( uint32_t nSector, uint8_t* pBuffer )
{
        uint16_t i;

        //扇区号转为地址
        nSector *= W25QXX_SECTOR_SIZE;

        aTxBuffer[0]   = W25X_ReadData;
        aTxBuffer[1]   = ( ( nSector & 0xFFFFFF ) >> 16 );
        aTxBuffer[2]   = ( ( nSector & 0xFFFF ) >> 8 );
        aTxBuffer[3]   = ( nSector & 0xFF );
        aTxBuffer[4]   = 0x00;

        for( i = 5; i < 5 + W25QXX_SECTOR_SIZE; i++ )
        {
                aTxBuffer[i] = 0xff;
        }

        NORFLASH_CS_EN( );
        if( HAL_SPI_TransmitReceive_DMA( &SpiHandle, (uint8_t*)aTxBuffer, (uint8_t *)aRxBuffer, 5 + W25QXX_SECTOR_SIZE ) != HAL_OK )
        {
                Error_Handler( (uint8_t*)__FILE__, __LINE__ );
        }

        while( !txrxOK )
        {
                ;
        }
        txrxOK = 0;
        memcpy( pBuffer, &aRxBuffer[5], 4096 );
}

//Sector Write
void Flash_Write_Sector( uint32_t nSector, uint8_t* pBuffer )
{
        int i, j;
        //扇区号转为地址
        nSector *= W25QXX_SECTOR_SIZE;

        //一个扇区需要几个页
        for( j = 0; j < W25QXX_PAGES_PER_SECTOR; j++ )
        {
                W25QXX_Write_Enable( );
                aTxBuffer[0]   = W25X_PageProgram;
                aTxBuffer[1]   = ( ( nSector & 0xFFFFFF ) >> 16 );  //selcet high 8 bit from 24
                aTxBuffer[2]   = ( ( nSector & 0xFFFF ) >> 8 );     //selcet high 8 bit from 16
                aTxBuffer[3]   = ( nSector & 0xFF );
                for( i = 0; i < W25QXX_PAGE_SIZE; i++ )
                {
                        aTxBuffer[4 + i] = pBuffer[i];
                }
                pBuffer          += W25QXX_PAGE_SIZE;
                nSector          += W25QXX_PAGE_SIZE;

                NORFLASH_CS_EN( );
                if( HAL_SPI_TransmitReceive_DMA( &SpiHandle,
                                                 (uint8_t*)aTxBuffer,
                                                 (uint8_t *)aRxBuffer,
                                                 4 + W25QXX_SECTOR_SIZE ) != HAL_OK
                    )
                {
                        Error_Handler( (uint8_t*)__FILE__, __LINE__ );
                }

                while( !txrxOK )
                {
                        ;
                }
                txrxOK = 0;

                W25QXX_Wait_Busy( );
        }
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

102

帖子

0

精华

高级会员

Rank: 4

积分
900
金钱
900
注册时间
2013-8-28
在线时间
114 小时
发表于 2016-7-9 10:45:57 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-6-30
在线时间
5 小时
 楼主| 发表于 2016-7-9 13:57:51 | 显示全部楼层
求大神帮忙呀
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 15:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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