求凌阳61单片机SPCE061A读写W25Q16的程序,我写的读到ID总是FF
时间:10-02
整理:3721RD
点击:
我的程序:
#include "spce061a.h"
#include "nbc61.h"
#define uchar unsigned char
#define uint unsigned int
#define W25Q_DeviceID 0xAB
#define W25Q_ManufactDeviceID 0x90
#define Flash_CS PB3 // SPI总线的片选信号线
#define Flash_CLK PB6 // SPI总线的钟信号线
#define Flash_MOSI PB5 // SPI总线的串行数据输入线
#define Flash_MISO PB4 // SPI总线的串行数据输出线
void SPI_Delay(uchar time)
{
uchar i;
for(i = 0; i < time; i++)
{
__asm("nop");__asm("nop");__asm("nop");__asm("nop");
__asm("nop");__asm("nop");__asm("nop");__asm("nop");
}
}
void Flash_Init(void)
{
Flash_CLK = 0;
Flash_CS = 1;
SPI_Delay(1);
}
uchar Flash_GetByte(void) //从SPI总线上读入一个字节
{
uchar i, inData = 0;
Flash_CLK = 1;
SPI_Delay(1);
for(i = 0; i < 8; i++) // 移8次
{
Flash_CLK = 1;
inData <<= 1;
SPI_Delay(1);
Flash_CLK = 0;
SPI_Delay(1);
inData |= Flash_MISO;
SPI_Delay(1);
}
SPI_Delay(1);
return inData;
}
void Flash_SendByte(unsigned char outData) //输出一个字节到SPI总线上
{
uchar i = 0;
Flash_CLK = 0;
SPI_Delay(1);
for(i = 0; i < 8; i++)
{
if((outData&0x80) == 0x80) // check if MSB is high
Flash_MOSI = 1;
else
Flash_MOSI = 0;
outData = (outData << 1);// 移出一位,送出至SPI总线的数据输入线SI上
Flash_CLK = 1;
SPI_Delay(2);
Flash_CLK = 0;
SPI_Delay(2);
}
}
uchar Flash_ReadDeviceID(void)
{
uchar byte = 0;
Flash_CLK = 0;
SPI_Delay(1);
Flash_CS = 0;
Flash_SendByte(W25Q_DeviceID); // send read device ID command (ABh)
Flash_SendByte(0x00); // send 3 dummy address
Flash_SendByte(0x00);
Flash_SendByte(0x00);
byte = Flash_GetByte();
Flash_CLK = 0;
SPI_Delay(1);
Flash_CS = 1;
return byte;
}
uint Flash_ReadManufactDeviceID(uchar IdAddr) /* send W25Qxx selectable ID address 00H or 01H */
{
uint IdData16 = 0;
Flash_CLK = 0;
SPI_Delay(1);
Flash_CS = 0;
SPI_Delay(1);
Flash_SendByte(W25Q_ManufactDeviceID); // send read ID command (90h)
Flash_SendByte(0x00); // send 3 dummy address
Flash_SendByte(0x00);
Flash_SendByte(IdAddr);
IdData16 = Flash_GetByte();
IdData16 = (IdData16 << 8);
IdData16 |= Flash_GetByte();
Flash_CLK = 0;
SPI_Delay(1);
Flash_CS = 1;
return IdData16;
}
void Flash_IOInit(void)
{
PBDir3=1; // CS, (Dir:Attr:Data = 111 ) --> 设置IOB3为带数据缓存器的高电平输出
PBAttr3=1;
PB3=1;
PBDir4=0; // MISO, (Dir:Attr:Data = 001 ) --> 设置IOB4为带上拉输入
PBAttr4=0;
PB4=1;
PBDir5=1; // MOSI, (Dir:Attr:Data = 110 ) --> 设置IOB5为带数据缓存器的低电平输出
PBAttr5=1;
PB5=0;
PBDir6=1; // CLK, (Dir:Attr:Data = 110 ) --> 设置IOB6为带数据缓存器的低电平输出
PBAttr6=1;
PB6=0;
}
#include "spce061a.h"
#include "nbc61.h"
#define uchar unsigned char
#define uint unsigned int
#define W25Q_DeviceID 0xAB
#define W25Q_ManufactDeviceID 0x90
#define Flash_CS PB3 // SPI总线的片选信号线
#define Flash_CLK PB6 // SPI总线的钟信号线
#define Flash_MOSI PB5 // SPI总线的串行数据输入线
#define Flash_MISO PB4 // SPI总线的串行数据输出线
void SPI_Delay(uchar time)
{
uchar i;
for(i = 0; i < time; i++)
{
__asm("nop");__asm("nop");__asm("nop");__asm("nop");
__asm("nop");__asm("nop");__asm("nop");__asm("nop");
}
}
void Flash_Init(void)
{
Flash_CLK = 0;
Flash_CS = 1;
SPI_Delay(1);
}
uchar Flash_GetByte(void) //从SPI总线上读入一个字节
{
uchar i, inData = 0;
Flash_CLK = 1;
SPI_Delay(1);
for(i = 0; i < 8; i++) // 移8次
{
Flash_CLK = 1;
inData <<= 1;
SPI_Delay(1);
Flash_CLK = 0;
SPI_Delay(1);
inData |= Flash_MISO;
SPI_Delay(1);
}
SPI_Delay(1);
return inData;
}
void Flash_SendByte(unsigned char outData) //输出一个字节到SPI总线上
{
uchar i = 0;
Flash_CLK = 0;
SPI_Delay(1);
for(i = 0; i < 8; i++)
{
if((outData&0x80) == 0x80) // check if MSB is high
Flash_MOSI = 1;
else
Flash_MOSI = 0;
outData = (outData << 1);// 移出一位,送出至SPI总线的数据输入线SI上
Flash_CLK = 1;
SPI_Delay(2);
Flash_CLK = 0;
SPI_Delay(2);
}
}
uchar Flash_ReadDeviceID(void)
{
uchar byte = 0;
Flash_CLK = 0;
SPI_Delay(1);
Flash_CS = 0;
Flash_SendByte(W25Q_DeviceID); // send read device ID command (ABh)
Flash_SendByte(0x00); // send 3 dummy address
Flash_SendByte(0x00);
Flash_SendByte(0x00);
byte = Flash_GetByte();
Flash_CLK = 0;
SPI_Delay(1);
Flash_CS = 1;
return byte;
}
uint Flash_ReadManufactDeviceID(uchar IdAddr) /* send W25Qxx selectable ID address 00H or 01H */
{
uint IdData16 = 0;
Flash_CLK = 0;
SPI_Delay(1);
Flash_CS = 0;
SPI_Delay(1);
Flash_SendByte(W25Q_ManufactDeviceID); // send read ID command (90h)
Flash_SendByte(0x00); // send 3 dummy address
Flash_SendByte(0x00);
Flash_SendByte(IdAddr);
IdData16 = Flash_GetByte();
IdData16 = (IdData16 << 8);
IdData16 |= Flash_GetByte();
Flash_CLK = 0;
SPI_Delay(1);
Flash_CS = 1;
return IdData16;
}
void Flash_IOInit(void)
{
PBDir3=1; // CS, (Dir:Attr:Data = 111 ) --> 设置IOB3为带数据缓存器的高电平输出
PBAttr3=1;
PB3=1;
PBDir4=0; // MISO, (Dir:Attr:Data = 001 ) --> 设置IOB4为带上拉输入
PBAttr4=0;
PB4=1;
PBDir5=1; // MOSI, (Dir:Attr:Data = 110 ) --> 设置IOB5为带数据缓存器的低电平输出
PBAttr5=1;
PB5=0;
PBDir6=1; // CLK, (Dir:Attr:Data = 110 ) --> 设置IOB6为带数据缓存器的低电平输出
PBAttr6=1;
PB6=0;
}
