移植需要更改sendrcv函数里面内容,宏定义内容

#define     DRV_SPI_FLASH_WRITE_ENABLE              (0x06)    //Write Enable
#define     DRV_SPI_FLASH_WRITE_DISABLE             (0x04)    //Write Disable
#define     DRV_SPI_FLASH_READ_STATUS_REG           (0x05)    //Read Status Register
#define     DRV_SPI_FLASH_WRITE_STATUS_REG          (0x01)    //Write Status Register
#define     DRV_SPI_FLASH_READ_DATA                 (0x03)    //Read Data
#define     DRV_SPI_FLASH_FAST_READ                 (0x0B)    //Fast Read
#define     DRV_SPI_FLASH_FAST_READ_DUAL_OUTPUT     (0x3B)    //Fast Read Dual Output
#define     DRV_SPI_FLASH_PAGEPROGRAM               (0x02)    //Page Program
#define     DRV_SPI_FLASH_BLOCK_ERASE               (0xD8)    //Block Erase(64KB)
#define     DRV_SPI_FLASH_HALF_BLOCK_ERASE          (0x52)    //Half Block Erase(32KB)
#define     DRV_SPI_FLASH_SECTOR_ERASE              (0x20)    //Sector Erase(4KB)
#define     DRV_SPI_FLASH_CHIP_ERASE                (0xC7)    //Chip Erase
#define     DRV_SPI_FLASH_JEDEC_ID                  (0x9F)    //JEDEC ID#define APP_SPI3_CS_LOW                SCU_SetSpiCsn(SPI3_CSN,LOW)
#define APP_SPI3_CS_HIGH               SCU_SetSpiCsn(SPI3_CSN,HIGH)uint8_t DrvFlashSendRcvByte(uint8_t ucData)
{uint8_t ucTemp;while(SPI_GetFlagStatus(SGCC_SPI3_P,SPI_FLAG_RFNE))ucTemp = SPI_ReceiveData(SGCC_SPI3_P);SPI_SendData(SGCC_SPI3_P, ucData);while(0 == SPI_GetFlagStatus(SGCC_SPI3_P,SPI_FLAG_RFNE));ucTemp = SPI_ReceiveData(SGCC_SPI3_P);return ucTemp;
}uint32_t DrvFlashReadID(void)
{uint32_t ulDevID = 0;APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_JEDEC_ID);ulDevID |= DrvFlashSendRcvByte(0xFF) << 16;ulDevID |= DrvFlashSendRcvByte(0xFF) << 8;ulDevID |= DrvFlashSendRcvByte(0xFF);APP_SPI3_CS_HIGH;return ulDevID;
}
uint8_t DrvFlashReadStausReg(void)
{uint8_t ucReg;APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_READ_STATUS_REG);ucReg = DrvFlashSendRcvByte(0xFF);APP_SPI3_CS_HIGH;return ucReg;
}
void DrvFlashWaitBusy(void)
{while((DrvFlashReadStausReg() & 0x01) == 0x01);
}void DrvFlashWriteEnable(void)
{APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_WRITE_ENABLE);APP_SPI3_CS_HIGH;
}void DrvFlashWriteDisable(void)
{APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_WRITE_DISABLE);APP_SPI3_CS_HIGH;
}void DrvFlashReadData(uint8_t* pRcvBuf, uint32_t ulReAddr, uint16_t usReNum)
{uint16_t i;APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_READ_DATA);DrvFlashSendRcvByte((uint8_t)((ulReAddr)>>16));DrvFlashSendRcvByte((uint8_t)((ulReAddr)>>8));DrvFlashSendRcvByte((uint8_t)ulReAddr);for(i=0; i < usReNum; i++){pRcvBuf[i] = DrvFlashSendRcvByte(0XFF);}APP_SPI3_CS_HIGH;}void DrvFlashPageWrite(uint8_t* pWrBuf, uint32_t ulWrAddr, uint16_t usWrNum)
{uint16_t i;DrvFlashWriteEnable();APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_PAGEPROGRAM);DrvFlashSendRcvByte((uint8_t)((ulWrAddr)>>16));DrvFlashSendRcvByte((uint8_t)((ulWrAddr)>>8));DrvFlashSendRcvByte((uint8_t)ulWrAddr);for(i = 0; i < usWrNum; i++)DrvFlashSendRcvByte(pWrBuf[i]);APP_SPI3_CS_HIGH;DrvFlashWaitBusy();
}void DrvFlashWriteNoCheck(uint8_t* pBuffer, uint32_t addr, uint16_t num)
{uint16_t pageremain;pageremain = 256 - addr % 256;//鍗曢〉鍓╀綑瀛楄妭鏁�if(num <= pageremain)//涓嶅ぇ浜�256pageremain = num;while(1){DrvFlashPageWrite(pBuffer, addr, pageremain);if(num == pageremain)break;//鍐欑粨鏉熶簡else{pBuffer += pageremain;addr += pageremain;num -= pageremain;//鍑忓幓宸茬粡鍐欏叆鐨勫瓧鑺傛暟if(num  > 256)pageremain = 256;//鏈鍙互鍐欏叆涓�椤垫暟鎹�elsepageremain = num;//鏈�鍚庝竴娆″啓}};
}void DrvFlashWriteData(uint8_t* pBuffer,uint32_t addr,uint16_t num)
{uint32_t secpos;uint16_t secoff;uint16_t secremain;uint16_t i;uint8_t * W25QXX_BUF;uint8_t W25QXX_BUFFER[4096];W25QXX_BUF = W25QXX_BUFFER;secpos = addr / 4096;//鎵囧尯鍦板潃secoff = addr % 4096;//鍦ㄦ墖鍖哄唴鐨勫亸绉�secremain = 4096 - secoff;//鎵囧尯鍓╀綑绌洪棿澶у皬
//    printfif(num <= secremain)//涓嶅ぇ浜庡綋鍓嶆墖鍖哄墿浣欏瓧鑺�{secremain = num;}while(1){DrvFlashReadData(W25QXX_BUF, secpos * 4096, 4096);//璇诲彇鏁翠釜鎵囧尯for(i = 0; i < secremain; i++)//鏍¢獙鏁版嵁{if(W25QXX_BUF[secoff + i] != 0XFF)//闇�瑕佹摝鍑�break;}if(i < secremain)//闇�瑕佹摝鍑�{DrvFlashSectorErase(secpos * 4096);//鎿﹂櫎鏁翠釜鎵囧尯for(i = 0; i < secremain; i++){W25QXX_BUF[i + secoff] = pBuffer[i];//澶嶅埗}DrvFlashWriteNoCheck(W25QXX_BUF, secpos * 4096, 4096);//鍐欏叆鏁翠釜鎵囧尯}elseDrvFlashWriteNoCheck(pBuffer, addr, secremain);//鍐欏凡缁忔摝闄や簡鐨勶紝鐩存帴鍐欏叆鎵囧尯鍓╀綑绌洪棿if(num == secremain)break;//鍐欑粨鏉熶簡else//{secpos++;//鎵囧尯鍦板潃澧炲姞1secoff = 0;//鍋忕Щ浣嶇疆涓�0pBuffer += secremain;//鎸囬拡鍋忕Щaddr += secremain;//鍐欏湴鍧�鍋忕Щnum -= secremain;//瀛楄妭鏁伴�掑噺if(num > 4096)secremain = 4096;//涓嬩竴涓墖鍖鸿繕鏄啓涓嶅畬elsesecremain = num;//涓嬩竴涓墖鍖哄彲浠ュ啓瀹屼簡}};
}void DrvFlashChipErase(void)
{DrvFlashWriteEnable();DrvFlashWaitBusy();APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_CHIP_ERASE);APP_SPI3_CS_HIGH;DrvFlashWaitBusy();
}void DrvFlashSectorErase(uint32_t ulErAddr)
{DrvFlashWriteEnable();DrvFlashWaitBusy();APP_SPI3_CS_LOW;DrvFlashSendRcvByte(DRV_SPI_FLASH_SECTOR_ERASE);DrvFlashSendRcvByte((uint8_t)((ulErAddr)>>16));DrvFlashSendRcvByte((uint8_t)((ulErAddr)>>8));DrvFlashSendRcvByte((uint8_t)ulErAddr);APP_SPI3_CS_HIGH;DrvFlashWaitBusy();
}

spi flash驱动相关推荐

  1. 2017年5月问题记录与总结——powerpc p1020 spi flash驱动

    1.SPI基础 SPI是串行外围接口的意思,一般用来接一些低速的外围设备,比如eeprom,flash,ad传感器,rtc等.硬件上,SPI有四根线,SDI/SDO/CS/SCLK,具体的协议可以参看 ...

  2. FPGA接口_N25Q128型号的spi flash驱动verilog代码编写

    # N25Q128型号的spi flash驱动verilog代码编写 提示:使用正点原子达芬奇pro做的小例子,由于教程中无flash的读写,因此撰写记录 文章目录 # N25Q128型号的spi f ...

  3. 一个x86平台的spi flash驱动移植笔记

    最近一个项目,要用到flash存放一些数据,要内核支持.于是又要去移植. 其实,这个项目的合作方式我一直不喜欢,但言语轻微.起初我也不断地提意见,但看了几次的结果后,觉得不提也罢.对于开发人员来说,合 ...

  4. FreeScale mpc8xxx + vxWorks平台下spi flash驱动开发三步走

    最近在弄PowerPC平台上的spi flash的驱动程序,总体比较简单,在借鉴了U-Boot中的相关源码后,花了两周左右的时间搞定了,对于spi总线之前一直都有了解,但未能实际接触,这次在vxWor ...

  5. ESP8266_RTOS_SDK 之spi flash驱动小窥

    学习时间到,来看一下人家的flash驱动是咋写的吧,用文字记录不容易有所遗漏,也更加方便想起. 先从驱动测试代码开始,进而切入调用关系底层,以下是sdk中测试flash read的测试代码: stat ...

  6. 串行 spi Flash 跨页编程的注意点

    spi Flash 进行 page program的时候,编程的数据为1-256个字节不等.在Datasheet中,如果编程的数据为256个字节,那么,输入的起始地址需要256个字节对齐,即需要页对齐 ...

  7. flash挂载到系统 spi_jffs2根文件系统挂载不上spi flash

    这几天一直在弄jffs2,让jffs2挂载到spi flash上,所以在内核中对spi flash进行了分区,给uboot了1M的空间,给kernel 4M的空间,给jffs2了11M的空间,因为我们 ...

  8. 【STM32H7教程】第85章 STM32H7的SPI 总线应用之SPI Flash的STM32CubeProg下载算法制作

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第85章       STM32H7的SPI 总线应用之SPI ...

  9. stm32f407单片机rt thread 片外spi flash OTA升级配置示例

    参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...

最新文章

  1. 【安装MongoDB】CentOS7 下安装NodeJs+Express+MongoDB+Redis
  2. 【转】Loadrunner入门(《软件性能测试过程详解与案例剖析》)
  3. shell脚本(查看多台服务器端口)
  4. python给生活带来哪些改变_你们觉得python简单么?真的能给生活带来更多机遇么?或者说某些改变?...
  5. Java微服务(一)【idea安装2020版本】
  6. 牛客网【每日一题】4月2日 月月查华华的手机
  7. Form.php 日期表单,Bootstrap日期和时间表单组件使用方法
  8. leetcode509. 斐波那契数(矩阵快速幂)
  9. sed mysql配置文件_shell解析my.cnf配置文件
  10. 操作系统(4)状态机视角下的程序执行
  11. mybatis 批量增加 Parameter '__frch_item_0' not found. Available parameters are [lis
  12. 计算机主板南桥的作用,电脑主板上的南北桥芯片的位置和作用介绍
  13. sql还原mysql_如何还原sql数据库
  14. 如何激发孩子的想象力_如何激发孩子的创造力,想象力?
  15. android编译错误记录
  16. 有虚继承的类其有几个虚继承的基类则该类就有几个虚表
  17. 海外代购系统/代购网站怎么搭建——源码解析
  18. 10年大数据平台经验,总结出这份数据建设干货(内含多张架构图)
  19. 第一次开水果店怎么进货,水果店进货攻略
  20. EmuELEC 4.3 安装和乐视手柄 LeWGP-201 evremap问题解决

热门文章

  1. json对象转换成string的方法
  2. perl学习笔记(9)
  3. 关于js获取radio和select的属性并控制
  4. [NHibernate]获取分组查询的记录总数
  5. java swing运行没反应_java – 无法从命令行运行swing
  6. python文件行数统计_文件行数和代码行数统计
  7. [蓝桥杯][2016年第七届真题]冰雹数(暴力打表找规律)
  8. [蓝桥杯][基础练习VIP]完美的代价(贪心)
  9. [蓝桥杯][2015年第六届真题]表格计算(递归+记忆化)
  10. Skyscrapers (hard version) CodeForces - 1313C2(单调栈)