您的位置:首页 > 热点 >

stm32驱动SST25VF程序

void SST25V_WriteBytes(u8 Byte, u32 WriteAddr,u32 ByteLength) //以WriteAddr为起始地址,写入ByteLength个数据Byte(写入的是同一个数据Byte){while(ByteLength--) //判断是否完成写入NumByteToRead个字节数据{SST25V_ByteWrite(Byte,WriteAddr); //向WriteAddr中写入数据字节ByteWriteAddr++; //写入地址自增1}}void SST25V_AAI_WriteBytes(u8 Byte, u32 Addr,u32 ByteLength)//以Addr为起始地址,用AAI模式,写入ByteLength个数据Byte(写入的是同一个数据Byte)ByteLength必须为偶数{u32 Length = 0;Length = (ByteLength/2)-1; //AAI模式每次写入两字节数据,因此ByteLength各字节,分成Length次写入SST25V_WriteEnable(); //允许写入操作SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(AAI_WordProgram); //发送AAI模式写入命令SPI_Flash_SendByte((Addr & 0xFF0000) >>16); //发送24位的写入数据地址SPI_Flash_SendByte((Addr & 0xFF00) >>8);SPI_Flash_SendByte(Addr & 0xFF);SPI_Flash_SendByte(Byte); //写入第一个字节数据SPI_Flash_SendByte(Byte); //写入第二个字节数据SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片SST25V_WaitForWriteEnd(); //等待写操作完成while(Length--) //判断是否完成Length次写入{SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(AAI_WordProgram); //发送AAI模式写入命令SPI_Flash_SendByte(Byte); //写入第一个字节数据SPI_Flash_SendByte(Byte); //写入第二个字节数据SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片SST25V_WaitForWriteEnd(); //等待写操作完成}SST25V_WriteDisable(); //写入完成,退出AAI模式}void SST25V_AAI_BufferProgram(u8 *pBuffer,u32 Addr,u16 BufferLength)//用AAI模式将pBuffer中的BufferLength个字节数据写入到以Addr为起始地址的区域,ByteLength必须为偶数{u16 Length = 0;Length = (BufferLength/2)-1; //AAI模式每次写入两字节数据,因此ByteLength各字节,分成Length次写入SST25V_WriteEnable(); //允许写入操作SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(AAI_WordProgram); //发送AAI模式写入数据命令SPI_Flash_SendByte((Addr & 0xFF0000) >>16); //发送24位的写入数据起始地址SPI_Flash_SendByte((Addr & 0xFF00) >>8);SPI_Flash_SendByte(Addr & 0xFF);SPI_Flash_SendByte(*pBuffer); //写入数据pBuffer++; //数据指针加1SPI_Flash_SendByte(*pBuffer); //写入数据pBuffer++; //数据指针加1SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片SST25V_WaitForWriteEnd(); //等待写操作完成while(Length--) //判断是否完成Length次写入{SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(AAI_WordProgram); //发送AAI模式写入数据命令SPI_Flash_SendByte(*pBuffer); //写入数据pBuffer++; //数据指针加1SPI_Flash_SendByte(*pBuffer); //写入数据pBuffer++; //数据指针加1SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片SST25V_WaitForWriteEnd(); //等待写操作完成}SST25V_WriteDisable(); //写入完成,退出AAI模式}void SST25V_AAI_WordProgram(u8 Byte1, u8 Byte2, u32 Addr)//在AAI模式下,以Addr为起始地址,分别写入Byte1和Byte2,必须和SST25V_AAI_WordsProgram()函数配套使用{SST25V_WriteEnable(); //允许写入操作SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(AAI_WordProgram); //发送AAI模式写入数据命令SPI_Flash_SendByte((Addr & 0xFF0000) >>16); //发送24位的写入数据起始地址SPI_Flash_SendByte((Addr & 0xFF00) >>8);SPI_Flash_SendByte(Addr & 0xFF);SPI_Flash_SendByte(Byte1); //写入数据Byte1SPI_Flash_SendByte(Byte2); //写入数据Byte2SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片SST25V_WaitForWriteEnd(); //等待写操作完成}void SST25V_AAI_WordsProgram(u8 state,u8 Byte1, u8 Byte2) //在AAI模式下,继续写入Byte1和Byte2,必须和SST25V_AAI_WordProgram()函数配套使用,state==1退出AAI模式{SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(AAI_WordProgram); //继续发送AAI模式写入数据命令SPI_Flash_SendByte(Byte1); //写入数据Byte1SPI_Flash_SendByte(Byte2); //写入数据Byte2SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片SST25V_WaitForWriteEnd(); //等待写操作完成if(state==1) //state==1时,退出AAI模式{SST25V_WriteDisable();}}void SST25V_SectorErase_4KByte(u32 Addr) //擦除4KB数据空间,Addr是擦除起始地址{SST25V_WriteEnable(); //允许写入操作SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(SectorErace_4KB); //发送擦除4KB数据空间命令SPI_Flash_SendByte((Addr & 0xFF0000) >>16); //发送24位的擦除起始地址SPI_Flash_SendByte((Addr & 0xFF00) >>8);SPI_Flash_SendByte(Addr & 0xFF);SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片SST25V_WaitForWriteEnd(); //等待擦除操作完成}void SST25V_BlockErase_32KByte(u32 Addr) //擦除32KB数据空间,Addr是擦除起始地址{SST25V_WriteEnable(); //允许写入操作SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(BlockErace_32KB); //发送擦除32KB数据空间命令SPI_Flash_SendByte((Addr & 0xFF0000) >>16); //发送24位的擦除起始地址SPI_Flash_SendByte((Addr & 0xFF00) >>8);SPI_Flash_SendByte(Addr & 0xFF);SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片SST25V_WaitForWriteEnd(); //等待擦除操作完成}void SST25V_BlockErase_64KByte(u32 Addr) //擦除64KB数据空间,Addr是擦除起始地址{SST25V_WriteEnable(); //允许写入操作SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(BlockErace_64KB); //发送擦除64KB数据空间命令SPI_Flash_SendByte((Addr & 0xFF0000) >>16); //发送24位的擦除起始地址SPI_Flash_SendByte((Addr & 0xFF00) >>8);SPI_Flash_SendByte(Addr & 0xFF);SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片SST25V_WaitForWriteEnd(); //等待擦除操作完成}void SST25V_ChipErase(void) //擦除整个芯片数据空间{SST25V_WriteEnable(); //允许写入操作SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(ChipErace); //发送擦除整个芯片空间命令SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片SST25V_WaitForWriteEnd(); //等待擦除操作完成}u8 SST25V_ReadStatusRegister(void) //读取状态寄存器{u8 StatusRegister = 0;SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(ReadStatusRegister); //发送读取状态寄存器命令StatusRegister = SPI_Flash_ReceiveByte(); //接收状态寄存器数据SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片return StatusRegister; //返回读取到的状态寄存器数据}void SST25V_WriteEnable(void) //允许对芯片写入操作{SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(WriteEnable); //发送允许写入操作命令SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片}void SST25V_WriteDisable(void) //禁止对芯片写入操作{SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(WriteDisable); //发送禁止写入操作命令SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片}void SST25V_EnableWriteStatusRegister(void) //允许改写状态寄存器{SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(EnableWriteStatusRegister); //发送允许改写状态寄存器命令SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片}void SST25V_WriteStatusRegister(u8 Byte) //改写状态寄存器,向状态寄存器写入数据Byte{SST25V_EnableWriteStatusRegister(); //允许改写状态寄存器SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(WriteStatusRegister); //发送改写状态寄存器命令SPI_Flash_SendByte(Byte); //向状态寄存器写入数据ByteSST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片}void SST25V_WaitForWriteEnd(void) //等待写入操作完成{u8 FLASH_Status = 0;SST25V_CS_LOW(); //片选端置低--选中芯片do{FLASH_Status = SST25V_ReadStatusRegister(); //获取状态寄存器值} while((FLASH_Status & 0x01) == SET); //判断芯片是否处于忙碌状态,忙则继续读取状态寄存器的值SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片}u32 SST25V_ReadJedecID(void) //读取JEDEC ID{u32 JEDECID = 0, Temp0 = 0, Temp1 = 0, Temp2 = 0;SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(ReadJedec_ID); //发送读取JEDEC ID命令Temp0 = SPI_Flash_ReceiveByte(); //接收第一字节数据Temp1 = SPI_Flash_ReceiveByte(); //接收第二字节数据Temp2 = SPI_Flash_ReceiveByte(); //接收第三字节数据SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片JEDECID = (Temp0 << 16) | (Temp1 << 8) | Temp2; //还原JEDEC IDreturn JEDECID; //返回JEDEC ID}u16 SST25V_ReadManuID_DeviceID(u32 ReadManu_DeviceID_Addr) //读取ManufacturerID和DeviceID,ReadManu_DeviceID_Addr的状态决定第一个字节是DeviceID还是ManufacturerID{u16 ManuID_DeviceID = 0; //存储16位的ID数据u8 ManufacturerID = 0, DeviceID = 0;SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(ReadDeviceID); //发送读取设备ID信息命令SPI_Flash_SendByte((ReadManu_DeviceID_Addr & 0xFF0000) >>16); //发送24位的地址字节,该地址为0和1,分别决定先输出的是ManufacturerID还是DeviceIDSPI_Flash_SendByte((ReadManu_DeviceID_Addr & 0xFF00) >>8);SPI_Flash_SendByte(ReadManu_DeviceID_Addr & 0xFF);if(ReadManu_DeviceID_Addr==1) //先输出DeviceID{DeviceID = SPI_Flash_ReceiveByte(); //接收DeviceIDManufacturerID = SPI_Flash_ReceiveByte(); //接收ManufacturerID}else //先输出ManufacturerID{ManufacturerID = SPI_Flash_ReceiveByte(); //接收ManufacturerIDDeviceID = SPI_Flash_ReceiveByte(); //接收DeviceID}ManuID_DeviceID = ((ManufacturerID<<8) | DeviceID); //保存为16位的数据,高字节为ManufacturerID,低字节为DeviceIDSST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片return ManuID_DeviceID; //返回16位的ManuID_DeviceID,高字节为ManufacturerID,低字节为DeviceID}void SST25V_EBSY() //允许AAI模式期间,SO脚输出忙状态{SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(EBSY); //发送允许AAI模式期间,SO脚输出忙状态命令SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片}void SST25V_DBSY() //禁止AAI模式期间,SO脚输出忙状态{SST25V_CS_LOW(); //片选端置低--选中芯片SPI_Flash_SendByte(DBSY); //发送禁止AAI模式期间,SO脚输出忙状态命令SST25V_CS_HIGH(); //片选CS#管脚置高--不选中芯片}

标签: stm32SST25V

相关阅读