微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求凌阳61单片机SPCE061A读写W25Q16的程序,我写的读到ID总是FF

求凌阳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;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top