打印
[DSP]

关于F28335驱动W25Q64的问题

[复制链接]
558|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DLAM|  楼主 | 2020-7-31 17:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
DLAM|  楼主 | 2020-8-1 09:45 | 只看该作者
这是 w25q64.h
#ifndef W25Q64_H_
#define W25Q64_H_

#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"

#define W25Q64_PAGE_SIZE        256
#define W25Q64_SECTOR_SIZE         (4*1024)
#define W25Q64_BLOCK_SIZE         (16*W25Q64_SECTOR_SIZE)
#define W25Q64_SIZE                 (128*W25Q64_BLOCK_SIZE)


#define SPISTE_SETH                (GpioDataRegs.GPBSET.bit.GPIO57 = 1)
#define SPISTE_SETL                (GpioDataRegs.GPBCLEAR.bit.GPIO57 = 1)


void SPI_Init(void);
Uint8 W25Q64_RWData(Uint16 val);
void W25Q64_WriteEnable(void);
void W25Q64_Wait(void);
void W25Q64_SectorErase(Uint32 SAddr);
Uint32 W25Q64_GetDeviceID(void);
void W25Q64_PageProgram(Uint8* buf,Uint32 WAddr, Uint16 len);
void W25Q64_ReadData(Uint8* buf,Uint32 RAddr, Uint16 len);

#endif /* W25Q64_H_ */

使用特权

评论回复
板凳
DLAM|  楼主 | 2020-8-1 09:46 | 只看该作者
这是 w25q64.c
#include "w25q64_1.h"
#include "spi.h"

#define FLAG 0xFF

// 初始化SPI,设置系统时钟和SPI时钟等
void SPI_Init(void){

        SPIA_Init();
}

// SPI 收发数据
Uint8 W25Q64_RWData(Uint16 val){

        return SPIA_SendRecData(val);
}

// 写使能
void W25Q64_WriteEnable(void){

        SPISTE_SETL;                // 片选拉低

        W25Q64_RWData(0x06);        // 0x06: 写使能指令

        SPISTE_SETH;                // 片选拉高

}

// 等待FLASH空闲
void W25Q64_Wait(void){

        Uint8 status = 0;

        SPISTE_SETL;

        W25Q64_RWData(0x05);                // 0x05: 读状态寄存器指令

        do {
                        status = W25Q64_RWData(FLAG);
        } while ((status & 0x01) == 1);

        SPISTE_SETH;

}

// 擦除扇区
/*
* SAdrr = 0x20 —— 4K Erase
* SAdrr = 0x52 —— 32K Erase
* SAdrr = 0xD8 —— 64K Erase
*/

void W25Q64_SectorErase(Uint32 SAddr){

        // 写使能
        W25Q64_WriteEnable();
        W25Q64_Wait();

        SPISTE_SETL;

        SPIA_SendRecData(0x60);                // 0x60: 芯片擦除指令
        SPIA_SendRecData((SAddr & 0xFF0000) >> 16);
        SPIA_SendRecData((SAddr & 0x00FF00) >> 8);
        SPIA_SendRecData(SAddr & 0x0000FF);

        SPISTE_SETH;

        W25Q64_Wait();
}

// 读取FLASH型号,检测SPI与FLASH的连通性
Uint32 W25Q64_GetDeviceID(void){

        Uint32 ID = 0;
        Uint32 id0 = 0, id1 = 0, id2 = 0;
        SPISTE_SETL;

        SPIA_SendRecData(0x9F);                // 0x9F: 读取ID指令
        id0 = SPIA_SendRecData(FLAG);
        id1 = SPIA_SendRecData(FLAG);
        id2 = SPIA_SendRecData(FLAG);

        SPISTE_SETH;

        ID = (id0 << 16) | (id1 << 8) | id2;
        return ID;
}

// 页写函数
void W25Q64_PageProgram(Uint8* buf,Uint32 WAddr, Uint16 len){

        W25Q64_WriteEnable();                // 写使能

        SPISTE_SETL;

        SPIA_SendRecData(0x02);                // 0x02: 页写指令
        SPIA_SendRecData((WAddr & 0xFF0000) >> 16);
        SPIA_SendRecData((WAddr & 0x00FF00) >> 8);
        SPIA_SendRecData(WAddr & 0x0000FF);

        if(len > W25Q64_PAGE_SIZE)                // 每页最多写入256 字节
                len =  W25Q64_PAGE_SIZE;

        while(len--){

                SPIA_SendRecData(*buf);
                buf++;
        }

        SPISTE_SETH;

        W25Q64_Wait();
}

// 读数据函数
void W25Q64_ReadData(Uint8* buf,Uint32 RAddr, Uint16 len){

        SPISTE_SETL;

        SPIA_SendRecData(0x03);                // 0x03:读数据指令
        SPIA_SendRecData((RAddr & 0xFF0000) >> 16);
        SPIA_SendRecData((RAddr & 0x00FF00) >> 8);
        SPIA_SendRecData(RAddr & 0x0000FF);

        while(len--){

                *buf = SPIA_SendRecData(FLAG);
                buf++;
        }

        SPISTE_SETH;
}

使用特权

评论回复
地板
DLAM|  楼主 | 2020-8-1 09:47 | 只看该作者
这是 main.c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"

#include "spi.h"
#include "w25q64_1.h"
#include <stdio.h>


void main()
{
        Uint8 writebuf[256] = "abcde";
        Uint8 readbuf[4096];
        char str[256];

        InitSysCtrl();                        // 系统时钟初始化,默认开启 F28335 所有外设时钟
        MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);                // 写入 FLASH

        DINT;
        InitPieCtrl();                        // 初始化 PIE 控制寄存器
        IER = 0x0000;                        // 关闭所有外设 CUP 级中断使能
        IFR = 0x0000;                        // 清除 CPU 级中断状态标志
        InitPieVectTable();                // 初始化 PIE 中断向量表

        SPI_Init();                                // 初始化 SPI


        while(1){

                W25Q64_SectorErase(0x00);
                W25Q64_Wait();
                W25Q64_PageProgram(writebuf, 0x00, 5);
                W25Q64_ReadData(readbuf, 0x00, 4096);
                sprintf(str, "senddata = %d        recdata = %d\r\n", writebuf, readbuf);
        }
}

使用特权

评论回复
5
DLAM|  楼主 | 2020-8-1 09:50 | 只看该作者
还差一个  spi.c
#include "spi.h"

void SPIA_Init(void){

        EALLOW;
        SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;                //SPI-A
        EDIS;

        InitSpiaGpio();

        //Initialize SPI FIFO registers
//        SpiaRegs.SPIFFTX.all = 0xE040;                // Enable FIFO, clear transmition interrupt
//        SpiaRegs.SPIFFRX.all = 0x204F;                // Enable FIFO to receive 16th depth
//        SpiaRegs.SPIFFCT.all = 0x0;                        // Clear FIFO counter

        SpiaRegs.SPICCR.all = 0x0007;                // 8-bit, send on rising edge
        SpiaRegs.SPICTL.all = 0x0006;                // No phase delay, main mode
        SpiaRegs.SPIBRR = 0x007F;                        // Determine SPI, no loopback
        SpiaRegs.SPICCR.all = 0x0087;                // NO Self-test mode and release reset
        SpiaRegs.SPIPRI.bit.FREE = 1;                // Free running

}

Uint8 SPIA_SendRecData(Uint16 dat){

        SpiaRegs.SPITXBUF = (dat << 8);                //Transmit data

//        while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1);

        return ((SpiaRegs.SPIRXBUF) >> 8);                // Recieve data
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

17

帖子

0

粉丝