世纪电源网社区logo
社区
Datasheet
标题
返回顶部
未解决

关于F28335 SPI驱动W25Q64读写操作

[复制链接]
查看: 1460 |回复: 0
1
DLAM
  • DLAM
  • 离线
  • LV3
  • 助理工程师
  • 积分:263
  • |
  • 主题:0
  • |
  • 帖子:5
积分:263
LV3
助理工程师
  • 2020-8-1 18:24:09
10问答币
各路大神,本人这几天做一个F28335驱动W25Q64读写程序,可是就是无法读写。想问问各位大佬 ,有没有相关的例程,借小弟参考一二!或者高抬贵眼帮我瞧瞧程序错在哪了。如果有什么低级错误,请大家赐教!。


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;
}

spi.c
#include "spi.h"


void SPIA_Init(void){


        EALLOW;
        GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0;    // Enable pull-up on GPIO54 (SPISIMO)
        GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3;  // Asynch input GPIO54 (SPISIMO)
        GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1;  // Configure GPIO54 as SPISIMO


        GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0;    // Enable pull-up on GPIO55 (SPISOMI)
        GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3;  // Asynch input GPIO55 (SPISOMI)
        GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1;  // Configure GPIO55 as SPISOMI


        GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0;    // Enable pull-up on GPIO56 (SPICLK)
        GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3;  // Asynch input GPIO56 (SPICLK)
        GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1;  // Configure GPIO56 as SPICLK


        GpioCtrlRegs.GPBPUD.bit.GPIO57 = 1;    // Enable pull-up on GPIO57 (SPISET)
        GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3;  // Asynch input GPIO57 (SPISET)
        GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 1;  // Configure GPIO57 as SPISET




        EDIS;


        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, no loopback
        SpiaRegs.SPICTL.all = 0x000E;                // No phase delay, main mode
        SpiaRegs.SPIBRR = 0x007F;                        //
        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.SPIRXEMU) >> 8);                // Recieve data
}


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(0x20);
                W25Q64_Wait();
                W25Q64_PageProgram(writebuf, 0x00, 5);
                W25Q64_ReadData(readbuf, 0x00, 4096);
                sprintf(str, "senddata = %d        recdata = %d\r\n", writebuf, readbuf);
        }
}
                                                  




F28335_SPI_FLASH.rar

942.29 KB, 下载次数: 7, 下载积分: 财富 -2

收藏收藏
热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦8层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan.com(#换成@)

世纪电源网分部

广 东:(0755)82437996 /(138 2356 2357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 | 不良信息举报 | 网站举报

Copyright 2008-2024 21dianyuan.com All Rights Reserved    备案许可证号为:津ICP备10002348号-2   津公网安备 12010402000296号