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