|
求大家帮忙找一下原因,辉芒微FT64F0A5单片机的SPI模块与W25Q32不能正常通信问题点:IO模拟SPI与W25Q32通信正常,但是用单片机SPI模块无法正常通信.
W25Q32模块是网上买的.
例程 是官方DEMO试了一下无效.
- //---------单片机与W25Q32 的电压是,3.3V供电
- #define SPI_DIO PA0 // 只作输入 (单片机 TO 芯片) W25Q32 DI
- #define SPI_DO PA1 // 输出 (芯片 TO 单片机) W25Q32 D0
- #define SPI_CLK PB0 // 时钟 W25Q32 CLK
- #define CS PB5 // 片选 W25Q32 CS
- 附上修改后的源码
- //Project: FT64F0A5_SPI_TEST_000.prj
- // Device: FT64F0AX
- // Memory: Flash 10KX14b, EEPROM 128X8b, SRAM 1KX8b
- // Author:
- //Company:
- //Version:
- // Date:
- //===========================================================
- //===========================================================
- /* ---------------------------------------------------------
- //--- FT61F0A5/FT64F0A5_TRB TSSOP20 IC引脚位图
- 1- LVDOUT/TIM2_CH1/USART1_CK/OP0+/PA5
- 2- USART1_TX/OP0-/AN3/PA6
- 3- [CLKO]/OP0OUT/[TIM1_CH4]/[USART2_TX]/USART1_RX/ELVD0/AN4/PA7
- 4- MCLRB/TIM1_CH1N/ELVD1/AN5/PC0
- 5- OSC1/[SPI_MISO]/ELVD2/PC1
- 6- OSC2/[SPI_MOSI]ELVD3/PB7
- 7- GND
- 8- ISPDAT/[USART1_TX]/[I2C_SDA]/AN6/PB6
- 9- VDD
- 10- [LVDOUT]/TIM2_CH3/USART2_RX/SPI_NSS/PB5
- 11- PB4/TIM1_BKIN/I2C_SDA/USART2_TX/[LVDOUT]
- 12- PB3/[ADC_ETR]/TIM1_ETR/I2C_SCL/USART2_CK/[LVDOUT]
- 13- PB2/[SPI_SCK]/[TIM1_CH1N]/TIM1_CH3
- 14- PB1/AN0/TIM1_CH2N/TIM1_CH4/CLKO
- 15- PB0/SPI_SCK/[TIM1_CH2]/TIM1_CH3N/[TIM2_CH1]
- 16- PA0/VREFN/SPI_MOSI/TIM1_CH1
- 17- PA1/VREFP/SPI_MISO/TIM1_CH2
- 18- PA2/[I2C_SCL]/[USART1_RX]/[TIM1_CH4]/ISPCLK
- 19- PA3/AN1/[USART2_TX]/[TIM2_CH3]
- 20- PA4/AN2/ADC_ETR/[USART2_RX]/TIM2_CH2
- ------------------------------------------------------- */
- /* ---------------------------------------------------------
- FT61F0A5/FT64F0A5_TRB TSSOP20
- NC--------|1(PA5) (PA4)20|--------NC
- NC--------|2(PA6) (PA3)19|--------NC
- NC--------|3(PA7) (PA2)18|--------NC
- NC--------|4(PC0) (PA1)17|--------NC
- NC--------|5(PC1) (PA0)16|--------NC
- NC--------|6(PB7) (PB0)15|--------NC
- NC--------|7(GND) (PB1)14|--------NC
- NC--------|8(PB6) (PB2)13|--------NC
- NC--------|9(VDD) (PB3)12|--------NC
- NC--------|10(PB5) (PB4)11|--------NC
- ------------------------------------------------------- */
- /* ---------------------------------------------------------
- URAT 9600波特率 发送 字符型 数据
- -第NNN个数值: 0xNN
- 测试模块W25Q32
- #define MOSI PA0
- #define MISO PA1
- #define SCK PB0
- #define NSS PB5
- #define LED_ON() {PB1 = 1;}
- #define LED_OFF() {PB1 = 0;}
- MCU的SPI模块或IO模拟SPI 测试OK.
- 功能说明: W25Q32 写一个数组,读一个数组,
- 对比数组正确 2HZ 闪烁,错误 长亮.
- ------------------------------------------------------ */
- #include "SYSCFG.h" //
- //***********************宏定义*****************************
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- #define MOSI PA0
- #define MISO PA1
- #define SCK PB0
- #define NSS PB5
- #define LED_ON() {PB1 = 1;}
- #define LED_OFF() {PB1 = 0;}
- unsigned char errorFlag = 0; //
- void Fun_PowerInitial(void); //上电初始化
- void Fun_Uart1_Initial(void); //串口初始化
- void SendString(unsigned char *pu8String);
- void PrintOutput(unsigned char u8Number,unsigned char u8Data); //-第NNN个数值: 0xNN
- void SPI_INITIAL(void); //SPI 模块初始化
- void DelayUs(uchar Time); //
- void DelayMs(uchar Time); //
- void DelayS(uchar Time); //
- uchar SPI_RW(uchar data); //
- void WriteEnable(void); //
- void WriteDisable(void); //
- uchar SPI_ReadStatus(void); //
- void SPI_WriteStatus(uchar Status); //
- //uchar SPI_Read(uint addr); //
- //void SPI_Write(uint addr , uchar dat); //
- void SPI_Flash_Read(uchar *pbuf,ulong addr,uint Len); //
- void W25X_Flash_Write_Page(uchar *pbuf,ulong addr,uint Len); //
- void SPI_Flash_Write_NoCheck(uchar *pbuf,ulong addr,uint Len); //
- void W25X_SectorErase(ulong Addr24); //擦除资料图示的4KB空?
- void W25X_BlockErase(ulong Addr24); //擦除资料图示的64KB空间
- void W25X_ChipErase(void);
- void init_25c64_io(void); //
- /* -----------------------------------------------------
- ------------------------------------------------------ */
- void interrupt ISR(void)
- {
- }
- /* -----------------------------------------------------
- * 函数名: main
- * 功能: 主函数
- * 输入: 无
- * 输出: 无
- ------------------------------------------------------ */
- void main()
- {
- unsigned char a; //定义一个变量a。
- unsigned char i; //
- unsigned char Send_DATA[16]; // 要发送的数据
- unsigned char Rec_DATA[16]; // 已接收的数据
- Fun_PowerInitial(); //上电初始化
- Fun_Uart1_Initial(); //串口初始化
- SPI_INITIAL(); //SPI初始化
- DelayMs(250); //
- DelayMs(250); //
- init_25c64_io(); //
- for(i=0;i<16;i++)
- {
- Send_DATA[i]=i;
- Rec_DATA[i]=0;
- }
- a=100; //给变量a 赋值。
- PrintOutput(255,a); // //-第NNN个数值: 0xNN
- W25X_SectorErase(0x000000); //
- SPI_Flash_Write_NoCheck(Send_DATA,0x000000,16); //写N个数
- SPI_Flash_Read(Rec_DATA,0x000000,16); //读N个数
- for(i=0;i<16;i++)
- {
- PrintOutput(i,Rec_DATA[i]); // //-第NNN个数值: 0xNN
- }
- for(i=0;i<16;i++)
- {
- if(Send_DATA[i] != Rec_DATA[i])
- {
- errorFlag = 1; //
- break; //
- }
- else
- {
- errorFlag = 0; //
- }
- }
- while(1)
- {
- NOP(); //
- if(errorFlag == 0)
- {
- LED_ON();
- DelayMs(250);
- LED_OFF();
- DelayMs(250);
- }
- else
- {
- LED_ON();
- }
- }
- }
- /* --------------------------------------------------
- 函数名: Fun_PowerInitial
- 功能: 上电初始化
- 输入:
- 输出:
- 说明:
- --------------------------------------------------- */
- void Fun_PowerInitial(void) //上电初始化
- {
- OSCCON=0B01110001; //系统时钟选择为内部振荡器16MHz,分频比为1:1
- INTCON=0; //禁止所有中断
- PORTA=0B00000000;
- PORTB=0B00000000;
- PORTC=0B00000000;
- WPUA=0B00000010; //弱上拉的开关,0-关,1-开
- WPUB=0B00000000;
- WPUC=0B00000000;
- WPDA=0B00000000; //弱下拉的开关,0-关,1-开
- WPDB=0B00000000;
- WPDC=0B00000000;
-
- TRISA=0B11111110; //输入输出设置,0-输出,1-输入,SPI_MISO,SPI_MOSI
- TRISB=0B11011100; //SPI_NSS,SPI_SCK
- TRISC=0B00000011;
- PSRC0=0B11111111; //源电流设置最大
- PSRC1=0B11111111;
- PSRC2=0B00001111;
- PSINK0=0B11111111; //灌电流设置最大
- PSINK1=0B11111111;
- PSINK2=0B00000011;
- ANSELA=0B00000000; //设置对应的IO为数字IO
- }
- /* --------------------------------------------------
- 函数名: Fun_Uart1_Initial
- 功能: 串口初始化
- 输入:
- 输出:
- 说明:
- --------------------------------------------------- */
- void Fun_Uart1_Initial(void) //串口初始化
- {
- PCKEN|=0B00100000; //使能UART1模块时钟
- //----默认----
- // AFP0 &= 0X3F; //USART1_TX BIT7-BIT6: 00-PA6 01-PA7 10-PB6 11-PA2
- // AFP1 &= 0X3F; //USART1_RX BIT7-BIT6: 00-PA7 01-PA6 10-PA2 11-PB6
- TRISA7=1; //UART_RX
- TRISA6 =0; //UART_TX
- //UR1IER=0B00100001; //使能发送完成中断,使能接收数据中断
- UR1IER=0B00000000; //除能发送完成中断,除能接收数据中断
- UR1LCR=0B00000001; //8位数据长度,1位停止位,无奇偶校验位
- UR1MCR=0B00011000; //使能发送和接收接口
- UR1DLL=104; //波特率=Fmaster/(16*{URxDLH,URxDLL})=9600
- UR1DLH=0;
- UR1TCF=1;
- ODCON0 | = 0x01;
- INTCON=0B11000000;
- }
- void SendString(unsigned char *pu8String)
- {
- static unsigned int Su16SendCnt;
- static unsigned int Su16Delay;
- for(Su16SendCnt=0;Su16SendCnt<43;Su16SendCnt++)
- {
- if(0==pu8String[Su16SendCnt])
- {
- break;
- }
- else
- {
- //---FT64F0A5----
- UR1DATAL = pu8String[Su16SendCnt];
- //---//----延时等待或等待发送标志位
- //for(Su16Delay=0;Su16Delay<800;Su16Delay++); //延时等待发送完成
- while(!UR1TCF); // //1 为完成; 0 未完成 //等待发送标志位
- UR1TCF = 1; //
- }
- }
- }
- /*----------第NNN个数值: 0xNN---*/
- void PrintOutput(unsigned char u8Number,unsigned char u8Data) //第NNN个数值: 0xNN
- {
- static unsigned char Su8ViewBuffer1[20];
- //--1~255--
- //-----第NNN个数值:
- const unsigned char Cu8Array1[]={0xB5,0xDA,0x4E,0x4E,0x4E,0xB8,0xF6,0xCA,0xFD,0xD6,0xB5,0x3A,0x00};
- const unsigned char Cu8_0D_0A[]={0x0d,0x0a,0x00};
- static unsigned int Su8NumBuff[3]; //
- static unsigned int Su8DataBuff[2]; //
- static unsigned int Su8BufferCnt;
- //---- 0~255 转换成10进制数----
- Su8NumBuff[0] = u8Number/100; //
- Su8NumBuff[1] = (u8Number%100)/10; //
- Su8NumBuff[2] = u8Number%10; //
- //--将个位数转换 数字字符
- Su8NumBuff[2] = Su8NumBuff[2] + '0'; // 将数字转换成字符码
- //--将十位数转换 空字符或数字字符
- if(Su8NumBuff[1] == 0 && Su8NumBuff[0] == 0) //十位数
- {
- Su8NumBuff[1] = 0x20; // 即为空字符代码
- }
- else
- {
- Su8NumBuff[1] = Su8NumBuff[1] + '0'; // 将数字转换成字符码
- }
- //--将百位数转换 空字符或数字字符
- if(Su8NumBuff[0] == 0) //百位数
- {
- Su8NumBuff[0] = 0x20; // 即为空字符代码
- }
- else
- {
- Su8NumBuff[0] = Su8NumBuff[0] + '0'; // 将数字转换成字符码
- }
- //-----十六进制转化 字符显示-----
- Su8DataBuff[0] = u8Data >> 4; //
- Su8DataBuff[1] = u8Data & 0x0f; //
- //--高8位--
- if(Su8DataBuff[0] < 10) //
- {
- Su8DataBuff[0] = Su8DataBuff[0] + '0'; //小于10的数,转换成 字符(0~9) 显示
- }
- else
- {
- Su8DataBuff[0] = Su8DataBuff[0] + '7'; //大于或等于10的数,转换成 字符(A~F) 显示
- }
- //--低8位--
- if(Su8DataBuff[1] < 10) //
- {
- Su8DataBuff[1] = Su8DataBuff[1] + '0'; //
- }
- else
- {
- Su8DataBuff[1] = Su8DataBuff[1] + '7'; //
- }
- for(Su8BufferCnt=0;Su8BufferCnt<12;Su8BufferCnt++)
- {
- Su8ViewBuffer1[Su8BufferCnt]=Cu8Array1[Su8BufferCnt];
- }
- Su8ViewBuffer1[2]=Su8NumBuff[0];
- Su8ViewBuffer1[3]=Su8NumBuff[1];
- Su8ViewBuffer1[4]=Su8NumBuff[2];
- Su8ViewBuffer1[Su8BufferCnt]='0';
- Su8ViewBuffer1[Su8BufferCnt+1]='x';
- Su8ViewBuffer1[Su8BufferCnt+2]=Su8DataBuff[0];
- Su8ViewBuffer1[Su8BufferCnt+3]=Su8DataBuff[1];
- Su8ViewBuffer1[Su8BufferCnt+4]=0x0d;
- Su8ViewBuffer1[Su8BufferCnt+5]=0x0a;
- Su8ViewBuffer1[Su8BufferCnt+6]=0;
- SendString(Su8ViewBuffer1);
- SendString(Cu8_0D_0A);
- }
- /*-------------------------------------------------
- * 函数名:SPI_INITIAL
- * 功能: 初始化SPI
- * 输入: 无
- * 输出: 无
- --------------------------------------------------*/
- void SPI_INITIAL(void)
- {
- PCKEN|=0B00010000; //使能SPI模块时钟
- SPICTRL=0B00000000; //禁用NSS引脚
- SPICFG=0B01000000; //设置为主机模式,第一个时钟转换的沿是数据采样点,SPI空闲时,SCK的时钟是处于低电平状态
- //SPICFG=0B01110000; //设置为主机模式,第二个时钟转换的沿是数据采样点,SPI空闲时,SCK的时钟是处于高电平状态
-
- SPISCR=0B00000000; //波特率设置为8M,Fmaster/(2*(SPISCR+1)),Fmaster=16M
- //SPISCR=0B00000111; //波特率设置为1M,Fmaster/(2*(SPISCR+1)),Fmaster=16M
- //SPISCR=0B01001111; //波特率设置为100KHZ,Fmaster/(2*(SPISCR+1)),Fmaster=16M
- //SPISCR=0B00000000; //波特率设置为8M,Fmaster/(2*(SPISCR+1)),Fmaster=16M
- SPIRXCRC=0B00000000; //接收数据的CRC计算结果
- SPITXCRC=0B00000000; //发送数据的CRC计算结果
- SPIIER=0B00000000; //禁止所有中断
- SPICTRL2=0B00000000; //全双工允许发送和接收,禁用CRC校验模块,高比特位优先发送
- SPISTAT=0B00000000;
- SPIEN=1; //启用SPI
- }
- /*-------------------------------------------------
- * 函数名: DelayUs
- * 功能: 短延时函数
- * 输入参数:Time延时时间长度 延时时长Time Us
- * 返回参数: 无
- --------------------------------------------------*/
- void DelayUs(uchar Time)
- {
- uchar a;
- for(a=0;a<Time;a++)
- {
- NOP();
- }
- }
- /*-------------------------------------------------
- * 函数名: DelayMs
- * 功能: 短延时函数
- * 输入参数:Time延时时间长度 延时时长Time ms
- * 返回参数: 无
- --------------------------------------------------*/
- void DelayMs(uchar Time)
- {
- uchar a,b;
- for(a=0;a<Time;a++)
- {
- for(b=0;b<5;b++)
- {
- DelayUs(197);
- }
- }
- }
- /*-------------------------------------------------
- * 函数名: DelayS
- * 功能: 短延时函数
- * 输入参数:Time延时时间长度 延时时长Time S
- * 返回参数: 无
- --------------------------------------------------*/
- void DelayS(uchar Time)
- {
- uchar a,b;
- for(a=0;a<Time;a++)
- {
- for(b=0;b<10;b++)
- {
- DelayMs(100);
- }
- }
- }
- /*====================================================
- *函数名:init_25c64_io
- *功能:25C64初始化
- *输入:无
- *输出:无
- ====================================================*/
- void init_25c64_io(void)
- {
- NSS = 1;
- SCK = 0;
- MOSI = 0;
- }
- // //--- IO口 模拟SPI --
- ///*====================================================
- //*函数名:SPI_RW
- //*功能:主机输出以及输入一个字节
- //*输入:data
- //*输出:根据接收的data输出给从机一个字节
- //* ------ IO口 模拟SPI -------
- //====================================================*/
- //uchar SPI_RW(uchar data)
- //{
- // uchar i;
- // for(i=0;i<8;i++)
- // {
- // if(data&0x80) MOSI = 1; //output 'uchar',MSB to MOSI
- // else MOSI = 0;
- // NOP();
- // data <<= 1; //shift next bit into MSB
- // SCK = 1; //Set SCK high...
- // NOP();
- // if(MISO) data |= 0x01;
- // else data &= 0xFE;
- // NOP();
- // SCK = 0;
- // }
- // return data;
- //}
- //---- MCU的 SPI 模块----
- /*-------------------------------------------------
- * 函数名SPI_RW
- * 功能: 主机输出以及输入一个字节
- * 输入: data
- * 输出: 根据接收的data输出给从机一个字节
- * ---- MCU的 SPI模块 ----
- --------------------------------------------------*/
- uchar SPI_RW(uchar data)
- {
- uchar spiData;
-
- while(SBUSY); //等待SPI模块空闲
- SPIDATA=data;
- while(SBUSY||!SPIF);
- SPIF=0;
- spiData=SPIDATA;
- return spiData;
- }
- /*-------------------------------------------------
- * 函数名WriteEnable
- * 功能: 写允许(将WEN置位)
- --------------------------------------------------*/
- void WriteEnable(void)
- {
- NSS=0;
- SPI_RW(0X06);
- NSS=1;
- }
- /*-------------------------------------------------
- * 函数名WriteDisable
- * 功能: 写禁止(将WEN复位)
- --------------------------------------------------*/
- void WriteDisable(void)
- {
- NSS=0;
- SPI_RW(0X04);
- NSS=1;
- }
- /*-------------------------------------------------
- * 函数名:SPI_ReadStatus
- * 功能: 读取25C64芯片的状态
- * 返回值:状态寄存器数据字节
- * 注: 25C64内部状态寄存器第0位=0表示空闲,0位=1表示忙。
- --------------------------------------------------*/
- uchar SPI_ReadStatus(void)
- {
- uchar status=0;
- NSS=0;
- SPI_RW(0X05); //0x05读取状态的命令字
- status=SPI_RW(0X00);
- NSS=1; //关闭片选
- return status;
- }
- /*-------------------------------------------------
- * 函数名:SPI_WriteStatus
- * 功能: 写25C64芯片的状态寄存器
- * 注: 只有BP1、BP0(bit7、3、2)可以写
- 25C64内部状态寄存器第0位=0表示空闲,0位=1表示忙。
- --------------------------------------------------*/
- void SPI_WriteStatus(uchar Status)
- {
- NSS=0;
- SPI_RW(0X01); //0X01写入状态的命令字
- SPI_RW(Status); //写入一个字节
- NSS=1; //关闭片选
- }
- // /*-------------------------------------------------
- // * 函数名SPI_Read
- // * 输入: 16位的地址
- // * 返回: 读取的数据
- // * 说明: 从25C64指定的地址读取一个字节
- // --------------------------------------------------*/
- // uchar SPI_Read(uint addr)
- // {
- // uchar spidata;
- // while(SPI_ReadStatus()&0x01); //判断是否忙
- // NSS=0; //使能器件
- // SPI_RW(0X03); //发送读取命令
- // SPI_RW((uchar)((addr)>>8));
- // SPI_RW((uchar)addr);
- // spidata=SPI_RW(0X00); //读出数据
- // NSS=1;
- // return spidata;
- // }
- // /*-------------------------------------------------
- // * 函数名SPI_Write
- // * 输入: 地址,字节数据
- // * 说明: 将一个字节写入指定的地址
- // --------------------------------------------------*/
- //void SPI_Write(uint addr , uchar dat)
- // {
- // while(SPI_ReadStatus()&0x01); //判断是否忙
- // WriteEnable(); //SET WEN
- // NSS=0; //使能器件
- // SPI_RW(0X02); //发送写命令
- // SPI_RW((uchar)((addr)>>8));
- // SPI_RW((uchar)addr);
- //
- // SPI_RW(dat);
- // WriteDisable();
- // NSS=1; //关闭片选
- // while(SPI_ReadStatus()&0x01);
- // }
- /*-------------------------------------------------
- //读取SPI FLASH
- //在指定地址开始读取指定长度的数据
- //pbuf:数据存储区
- //addr:开始读取的地址(24bit)
- //Len:要读取的字节数(最大65535) * 函数名SPI_Read
- * 输入: 16位的地址
- * 返回: 读取的数据
- * 说明: W25Q32指定的地址读取一个字节
- --------------------------------------------------*/
- void SPI_Flash_Read(uchar *pbuf,ulong addr,uint Len)
- {
- uint i;
- while(SPI_ReadStatus()&0x01); //判断是否忙
- NSS=0; //使能器件
- SPI_RW(0X03); //发送读取命令
- SPI_RW((uchar)((addr)>>16)); //
- SPI_RW((uchar)((addr)>>8));
- SPI_RW((uchar)addr);
- for(i=0;i<Len;i++)
- {
- *pbuf++ = SPI_RW(0X00);
- }
- NSS=1;
- }
- //SPI在一页(0~65535)内写入少于256个字节的数据
- //在指定地址开始写入最大256字节的数据
- //pbuf:数据存储区
- //addr:开始写入的地址(24bit)
- //Len:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!!
- void W25X_Flash_Write_Page(uchar *pbuf,ulong addr,uint Len)
- {
- uint i;
- while(SPI_ReadStatus()&0x01); //判断是否?
- WriteEnable(); //SET WEL
- NSS=0; //使能器件
- SPI_RW(0x02); //发送写页命令
- SPI_RW((uchar)((addr)>>16)); //发送24bit地址
- SPI_RW((uchar)((addr)>>8));
- SPI_RW((uchar)addr);
- for(i=0;i<Len;i++) //循环写数
- {
- SPI_RW(*pbuf++);
- }
- NSS=1; //取消片选
- while(SPI_ReadStatus()&0x01); //等待写入结束
- }
- //无检验写SPI FLASH
- //必须确保所写的地址范围内的数据全部为0XFF,否则在非0XFF处写入的数据将失败!
- //具有自动换页功能
- //在指定地址开始写入指定长度的数据
- //pbuf:数据存储区
- //addr:开始写入的地址(24bit)
- //Len:要写入的字节数(最大65535)
- void SPI_Flash_Write_NoCheck(uchar *pbuf,ulong addr,uint Len)
- {
- uint PageLen; // 页内写入字节长度
- PageLen=256-addr%256; // 单页剩余的字节数 (单页剩余空间)
- if(Len <= PageLen) PageLen=Len; // 不大于256 个字节
- while(1)
- {
- W25X_Flash_Write_Page(pbuf,addr,PageLen);
- if(PageLen == Len) break; // 写入结束了
- else
- {
- pbuf += PageLen;
- addr += PageLen;
- Len -= PageLen; // 减去已经写入了的字节数
- if(Len>256) PageLen = 256; // 一次可以写入256 个字节
- else PageLen = Len; // 不够256 个字节了
- }
- }
- }
- //*************** 4K扇擦除************************OK
- //擦除一个扇区
- //Dst_Addr:扇区地址 0~511 for w25x16
- //擦除一个扇区的最少时间:150ms
- void W25X_SectorErase(ulong Addr24) //擦除资料图示的4KB空间
- {
- uchar Addr1; // 最低地址字节
- uchar Addr2; // 中间地址字节
- uchar Addr3; // 最高地址字节
- Addr1=Addr24;
- Addr24=Addr24>>8;
- Addr2=Addr24;
- Addr24=Addr24>>8;
- Addr3=Addr24; // 把地址拆开来
- while(SPI_ReadStatus()&0x01); // 判断是否忙
- WriteEnable(); // 写允许
- NSS=0;
- SPI_RW(0x20); // 整扇擦除命令
- SPI_RW(Addr3);
- SPI_RW(Addr2);
- SPI_RW(Addr1);
- NSS=1;
- while(SPI_ReadStatus()&0x01); // 等待擦除完成
- }
- //*************** 块擦除/64K页************************* OK
- void W25X_BlockErase(ulong Addr24) //擦除资料图示的64KB空间
- {
- uchar Addr1; // 最低地址字节
- uchar Addr2; // 中间地址字节
- uchar Addr3; // 最高地址字节
- Addr1=Addr24;
- Addr24=Addr24>>8;
- Addr2=Addr24;
- Addr24=Addr24>>8;
- Addr3=Addr24; // 把地址拆开来
- while(SPI_ReadStatus()&0x01); // 判断是否忙
- WriteEnable(); // 写允许
- NSS=0;
- SPI_RW(0xD8); // 整扇擦除命令
- SPI_RW(Addr3);
- SPI_RW(Addr2);
- SPI_RW(Addr1);
- NSS=1;
- while(SPI_ReadStatus()&0x01); // 等待擦除完成
- }
- //**************片擦除 ****************** OK
- // W25X16:25S W25X32:40S W25X64:40S
- void W25X_ChipErase(void)
- {
- while(SPI_ReadStatus()&0x01); // 判断是否忙
- WriteEnable(); // 写允许
- NSS=0;
- SPI_RW(0xC7); // 整片擦除命令
- NSS=1; // 从CS=1时开始执行擦除
- while(SPI_ReadStatus()&0x01); // 等待擦除完成
- }
复制代码
|
|