首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

W25Q16 C驱动代码(原创)

W25Q16 C驱动代码(原创)

  • 这些代码在我的     STM32F103ZET6上运行 能正常支持W25Q16.我用的是模拟SPI的方式
  • #define CS_L     //拉低CS的宏  自己定义  以下以此类推
  • #define SCLK_L
  • #define DO_L
  • #define DIO_L
  • #define CS_H        //拉高CS的宏 自己定义  以下以此类推
  • #define SCLK_H
  • #define DO_H
  • #define DIO_H
  • #define DO_Read //读DO的宏
  • void SPI_Write(uint8_t data) //用SPI发送8位数据
  • {
  •     uint8_t i;
  •     for(i=0;i<8;i++)
  •     {
  •         SCLK_L;
  •         if(data&0x80)
  •             DIO_H;
  •         else
  •             DIO_L;
  •         SCLK_H;
  •         data<<=1;`
  •      }
  • }
  • uint8_t SPI_Read(void) //SPI接受8位数据
  • {
  •     uint8_t buffl=0x00,i;
  •     for(i=0;i<8;i++)
  •     {
  •         SCLK_L;
  •         buff<<=1;
  •         if(DO_Read)
  •             buff|=0x01;
  •         SCLK_H;
  •     }
  •     return buff;
  • }
  • void Write_Enable(void) //写使能函数 对W25Q16进行写操作之前要进行这一步操作
  • {
  •     CS_L;
  •     SPI_Write(0x06);
  •     CS_H;
  • }
  • void Write_Disable(void) //写禁止函数
  • {
  •     CS_L;
  •      SPI_Write(0x04);
  •         CS_H;
  • }
  • uint8_t W25Q16_BUSY(void) //判断W25Q16是否繁忙函数 繁忙则返回1
  • {
  •     uint8_t flag;
  •     CS_L;
  •         SPI_Write(0x05;
  •         flag=SPI_Read();
  •         CS_H;
  •     flag&=0x01;
  •     return flag;
  • }
  • void W25Q16_Write(uint32_t address,uint8_t *data,uint8_t j)//向W25Q16写入 j个8位数据 第一个参数是 W25Q16的首地址 第二个参数是 内存的首地址
  • {
  •     uint8_t i;
  •     while(W25Q16_BUSY());//如果芯片繁忙就等在这里
  •     Write_Enable();//要先写入允许命令
  •     CS_L;
  •     SPI_Write(0x02);
  •     SPI_Write(address>>16);
  •     SPI_Write(address>>8);
  •     SPI_Write(address);
  •     for(i=0;i<j;i++)
  •     {
  •         SPI_Write(*(data+i));
  •     }
  •     CS_H;
  • }
  • void W25Q16_Read(uint32_t address,uint8_t *data,uint8_t j)//从W25Q16中的address地址上读取 j个字节的数据保存到 以data为首地址的内存中
  • {
  •     uint8_t i;
  •     while(W25Q16_BUSY());
  •     CS_L;
  •     SPI_Write(0x03);
  •     SPI_Write(address>>16);
  •     SPI_Write(address>>8);
  •     SPI_Write(address);
  •     for(i=0;i<8;i++)
  •     {
  •         *(data+i)=SPI_Read();
  •     }
  •     CS_H;
  • }
  • void W25q16_Erasure()//擦除整个芯片的数据 由于芯片中的数据只能从1写到0所以 写了一次以后就不能写了 要先擦除 擦除成功后的每个字节都是 255
  • {
  •     Write_Enable();
  •     SPI_Write(0x00);
  •     Write_Enable;
  •     while(W25Q16_BUSY());
  •     CS_L;
  •     SPI_Write(0xc7);
  •     CS_H;
  • `    while(W25Q16_BUSY());
  • } //擦除过程比较慢

复制代码


返回列表