
新唐M0读写W25Q16存储器的程序.pdf
4页D:\LYN_工程\NUC1xx\PRJ\Nmj_0814\Soc\W25Q16.c#include "Slave.h"//*****************************************************************************//功能:初始化外设SPI0.//*****************************************************************************void SPI0_start(void){/* GPIO为SPI0所用 */DrvGPIO_InitFunction( E_FUNC_SPI0);/* SPI0为主模式, 传输类型=1, 32位传输 */ DrvSPI_Open( eDRVSPI_PORT0, eDRVSPI_MASTER, eDRVSPI_TYPE1, 8);/* MSB优先 */ DrvSPI_SetEndian( eDRVSPI_PORT0, eDRVSPI_MSB_FIRST);/* 禁止自动从选择 */ DrvSPI_DisableAutoSS( eDRVSPI_PORT0);/* 从选择引脚低电平激活 */ DrvSPI_SetSlaveSelectActiveLevel( eDRVSPI_PORT0, eDRVSPI_ACTIVE_LOW_FALLING);/* 禁止2比特传输模式 */DrvSPI_Set2BitTransferMode( eDRVSPI_PORT0, FALSE);/* SPI0的时钟频率为:1MHz */ DrvSPI_SetClockFreq( eDRVSPI_PORT0,6000000,0); }//*****************************************************************************//功能:核对制造商编号: 0xEF;器件编号:ID: 0x14.//输入://输出://*****************************************************************************void W25Q16_RMidDid(void){uint32_t x[1]; /* 发送位宽为:8 bits */ DrvSPI_SetBitLength( eDRVSPI_PORT0, 8); /* 设置从选择引脚:SS0 */ DrvSPI_SetSS( eDRVSPI_PORT0, eDRVSPI_SS0); /* 发指令: 0x90, 读取MID/DID. */ x[0] = 0x90;DrvSPI_SingleWrite( eDRVSPI_PORT0, x);/* 等待空闲 */ while ( DrvSPI_IsBusy( eDRVSPI_PORT0));/* 发送位宽为:24 bits */ DrvSPI_SetBitLength( eDRVSPI_PORT0, 24);/* 发送:24字节0 */x[0] = 0x0;DrvSPI_SingleWrite( eDRVSPI_PORT0, x);/* 等待空闲 */ while ( DrvSPI_IsBusy( eDRVSPI_PORT0)); /* 发送位宽为:16 bits */ DrvSPI_SetBitLength( eDRVSPI_PORT0, 16);/* 接收 */ x[0] = 0x0;DrvSPI_SingleWrite( eDRVSPI_PORT0, x);/* 等待空闲 */ while ( DrvSPI_IsBusy( eDRVSPI_PORT0));/* 禁止从选择引脚:SS0 */ DrvSPI_ClrSS( eDRVSPI_PORT0, eDRVSPI_SS0); /* 从:Rx寄存器读回数据 */ DrvSPI_DumpRxRegister( eDRVSPI_PORT0, x, 1);/* 核对:MID and DID */x[0] &= 0xFFFF;if (x[0]!= 0xEF14)while (1); }//*****************************************************************************//功能:读取W25Q16的状态寄存器1.//输出:y[0]&0xFF;//*****************************************************************************uint32_t W25Q16_RSReg1(void){uint32_t x[1],y[1]; Page: 1 D:\LYN_工程\NUC1xx\PRJ\Nmj_0814\Soc\W25Q16.c/* 发送位宽为:16 bits */ DrvSPI_SetBitLength( eDRVSPI_PORT0, 16); /* 设置从选择引脚:SS0 */ DrvSPI_SetSS( eDRVSPI_PORT0, eDRVSPI_SS0); /* 发指令: 0x05,读状态寄存器1 */ x[0] = 0x0500;DrvSPI_SingleWrite( eDRVSPI_PORT0, x); /* 等待空闲 */ while ( DrvSPI_IsBusy( eDRVSPI_PORT0));/* 禁止从选择引脚:SS0 */ DrvSPI_ClrSS( eDRVSPI_PORT0, eDRVSPI_SS0); /* 从:Rx寄存器读回数据 */ DrvSPI_DumpRxRegister( eDRVSPI_PORT0, y, 1); return(y[0]& 0xFF);}//*****************************************************************************//功能:检查SPI flash的BUSY位. 等待W25Q16空闲。
//*****************************************************************************void W25Q16_WaitReady(void) { uint32_t x; do{x= W25Q16_RSReg1();x &= 0x01;} while (x!=0);} //*****************************************************************************//功能:擦除W25Q16整片(10S)//*****************************************************************************void W25Q16_CErase(void){uint32_t x[1];/* 等待空闲 */W25Q16_WaitReady();/* 发送位宽为:8 bits */ DrvSPI_SetBitLength( eDRVSPI_PORT0, 8); /* 设置从选择引脚:SS0 */ DrvSPI_SetSS( eDRVSPI_PORT0, eDRVSPI_SS0); /* 发指令: 0x06, 写使能 */ x[0] = 0x06;DrvSPI_SingleWrite( eDRVSPI_PORT0, x); /* 等待空闲 */ while ( DrvSPI_IsBusy( eDRVSPI_PORT0));/* 禁止从选择引脚:SS0 */ DrvSPI_ClrSS( eDRVSPI_PORT0, eDRVSPI_SS0);ms(2); /* 设置从选择引脚:SS0 */ DrvSPI_SetSS( eDRVSPI_PORT0, eDRVSPI_SS0);/* 发指令: 0xC7, 片擦除 */ x[0] = 0xC7;DrvSPI_SingleWrite( eDRVSPI_PORT0, x); /* 等待空闲 */ while ( DrvSPI_IsBusy( eDRVSPI_PORT0));/* 禁止从选择引脚:SS0 */ DrvSPI_ClrSS( eDRVSPI_PORT0, eDRVSPI_SS0); }//*****************************************************************************//功能:W25Q16:扇区擦除。
(400mS)//输入:Add:扇区起始地址//*****************************************************************************void W25Q16_SErase( uint32_t Add){uint32_t x[1];/* 等待空闲 */W25Q16_WaitReady();/* 发送位宽为:8 bits */ DrvSPI_SetBitLength( eDRVSPI_PORT0, 8); Page: 2 D:\LYN_工程\NUC1xx\PRJ\Nmj_0814\Soc\W25Q16.c/* 设置从选择引脚:SS0 */ DrvSPI_SetSS( eDRVSPI_PORT0, eDRVSPI_SS0); /* 发指令: 0x06, 写使能 */ x[0] = 0x06;DrvSPI_SingleWrite( eDRVSPI_PORT0, x); /* 等待空闲 */ while ( DrvSPI_IsBusy( eDRVSPI_PORT0));/* 禁止从选择引脚:SS0 */ DrvSPI_ClrSS( eDRVSPI_PORT0, eDRVSPI_SS0);ms(2); /* 设置从选择引脚:SS0 */ DrvSPI_SetSS( eDRVSPI_PORT0, eDRVSPI_SS0);/* 发指令: 0x20,扇区擦除*/x[0]= 0x20;DrvSPI_SingleWrite( eDRVSPI_PORT0, x);/* 发送位宽为:24bits */ DrvSPI_SetBitLength( eDRVSPI_PORT0, 24);/* 发送:24-bit起始地址 */Add &= 0xFFFFF000; x[0] = Add;DrvSPI_SingleWrite( eDRVSPI_PORT0, x); /* 等待空闲 */ while ( DrvSPI_IsBusy( eDRVSPI_PORT0));/* 禁止从选择引脚:SS0 */ DrvSPI_ClrSS( eDRVSPI_PORT0, eDRVSPI_SS0); }//*****************************************************************************//功能:W25Q16页读取(和SPI0连接)。
//输入:uint32_t Add.//输出:uint8_t *DBuf.//*****************************************************************************void W25Q16_PR( uint8_t *DBuf, uint32_t Add) {uint32_t x[1],i;/* 等待空闲 */W25Q16_WaitReady(); /* 发送位宽为:8 bits */ DrvSPI_Se。
