把SST25VF016的驱动完善了一下
头文件 flash.h
#ifndef WW_25VF06
#define WW_25VF06
// flash.h
// ww 25VF016 v1.0 提供了简化的驱动版本
// 后继应该继续添加写入flash之前的读取判断是否被擦除的工作 以及4k 32k 64k的分块
// 适用于SSTVF25016
#include "CG_macrodriver.h"
// 定义CS口
#define FLASH_CS P0_bit.no0
// 定义MCU输入端口 SI
#define FLASH_SI P1_bit.no1
#define FLASH_ID 0XBF41
//指令表
#define T25VF_WriteEnable 0x06
#define T25VF_WriteDisable 0x04
#define T25VF_ReadStatusReg 0x05
#define T25VF_WriteStatusReg 0x01
#define T25VF_WriteStatusRegEnable 0x50;
#define T25VF_ReadData 0x03
#define T25VF_FastReadData 0x0B
#define T25VF_ByteProgram 0x02
#define T25VF_BlockErase32k 0x52
#define T25VF_BlockErase64k 0xD8
#define T25VF_SectorErase4k 0x20
#define T25VF_ChipErase 0xC7
//#define T25VF_DeviceID 0xAB
//#define T25VF_ManufactDeviceID 0xAB
#define T25VF_ReadID 0x90
#define T25VF_JedecDeviceID 0x9F
#define T25VF_Enable_Output_BY 0x70
#define T25VF_Disable_Output_BY 0x80
#define T25VF_AAI_WordProgram 0xAD
UINT SPI_Flash_ReadID(void); //读取FLASH ID
// 分成两部分 读取FLASH ID
UCHAR SPI_Flash_ReadFactoryID(void); //读取厂商ID
UCHAR SPI_Flash_ReadDeviceID(void); //读取 设备ID
ULONG SPI_Flash_ReadJedecID(void); // 读取Jedec ID
UCHAR SPI_Flash_ReadSR(void); //读取状态寄存器
void SPI_Flash_Wait_Busy(void); //等待空闲
void SPI_FLASH_Write_SR(UCHAR sr); //写状态寄存器
void SPI_FLASH_Write_Enable(void); //写使能
void SPI_FLASH_Write_Disable(void); //写保护
void SPI_FLASH_Write_SR_Enable(void); // 使使能改写状态寄存器操作void SPI_Flash_Erase_Chip(void); //整片擦除
void SPI_Flash_Erase_Sector4k(ULONG Dst_Addr_Index);//扇区擦除
void SPI_Flash_Erase_Block_32k(ULONG Dst_Addr_Index);//block32k
void SPI_Flash_Erase_Block_64k(ULONG Dst_Addr_Index);//block64k
//检测是否可以执行写入操作
void SPI_Flash_Write_Enable_Check(void);
//读取flash单个字节
UCHAR SPI_Flash_Read(ULONG ReadAddr);
//连续读取flash
void SPI_Flash_Read_Continue(UCHAR* pBuffer,ULONG ReadAddr,UINT NumByteToRead);
//高速读取flash单个字节
UCHAR SPI_Flash_HighRead(ULONG ReadAddr);
//连高速续读取flash
void SPI_Flash_HighRead_Continue(UCHAR* pBuffer,ULONG ReadAddr,UINT NumByteToRead);
// 写入flash
void SPI_Flash_ByteWrite(UCHAR Data ,ULONG WriteAddr);
// 第一次调用AAI 记得之前写使能
void SPI_Flash_AAI_WordProgramA(UCHAR *Data, ULONG WriteAddr);
// 第二次调用AAI 之前不必写使能
void SPI_Flash_AAI_WordProgramB(UCHAR *Data);
// 整体的AAI 操作 // 需要停止AAI 时候 检测到芯片不忙 发送写禁止命令即可
void SPI_Flash_AAI_WordProgram(UCHAR *Data, UINT NumByteToWrite, ULONG WriteAddr);
// 在AAI模式下监测MISO线是否变为1,用以显示AAI操作模式完成
void SPI_Flash_Poll_SO() ;
// 整体的AAI 操作 使用SO判断忙标志
void SPI_Flash_AAI_WordProgramSO(UCHAR *Data, UINT NumByteToWrite, ULONG WriteAddr);
// 允许MISO在AAI模式期间输出RY/BY# 状态
void SPI_Flash_Enable_Output_BY();
// 功能: 禁止MISO在AAI模式下作为输出RY/BY#状态的信号*/
void SPI_Flash_Disable_Output_BY();
#endif
主函数main.c 测试
*/
void main(void)
{
/* Start user code. Do not edit comment generated here */
// 初始化 接收和发送缓冲
InitComTxBuff();
InitComRxBuff();
// 验证SPI操作
/* Start CSI00 operations */
CSI00_Start();
// 测试读取ID
// ID = SPI_Flash_ReadID();
// FactoryID = SPI_Flash_ReadFactoryID();
// DeviceID = SPI_Flash_ReadDeviceID();
// 测试读取Jedec ID
// Jedec_ID = SPI_Flash_ReadJedecID();
// 测试读取状态寄存器
// 芯片上电读取出来的状态寄存器上电初始化为 0b00011100 全部芯片受保护
REG = SPI_Flash_ReadSR();
// 测试写入寄存器保护位
// 首先使能写寄存器
REG &= 0;
SPI_FLASH_Write_SR(REG); //写状态寄存器
REG = SPI_Flash_ReadSR();
// 测试擦除32k 索引1
// SPI_Flash_Erase_Block_32k(1);
// 测试擦除64k 索引2
// SPI_Flash_Erase_Block_64k(2);
// 测试整片擦除
// SPI_Flash_Erase_Chip();
// 测试擦除4k 索引0
// SPI_Flash_Erase_Sector4k(0);
// 测试写入操作
intTestWriteData();
// 单个字节的写入
/*
SPI_Flash_ByteWrite(testWriteData[0], 0x00);//写入flash
SPI_Flash_ByteWrite(testWriteData[1], 0x01);//写入flash
SPI_Flash_ByteWrite(testWriteData[2], 0x02);//写入flash
SPI_Flash_ByteWrite(testWriteData[3], 0x03);//写入flash
SPI_Flash_ByteWrite(testWriteData[4], 0x04);//写入flash
SPI_Flash_ByteWrite(testWriteData[5], 0x05);//写入flash
*/
// 测试读取单个字节
/*
testReadData[0] = SPI_Flash_Read(0x00);
testReadData[1] = SPI_Flash_Read(0x01);
testReadData[2] = SPI_Flash_Read(0x02);
testReadData[3] = SPI_Flash_Read(0x03);
testReadData[4] = SPI_Flash_Read(0x04);
testReadData[5] = SPI_Flash_Read(0x05);
*/
// 多个字节写入 方式1
/*
SPI_Flash_Erase_Sector4k(0);
SPI_Flash_AAI_WordProgram(testWriteData, 32, 0x00);
testReadData[6] = SPI_Flash_HighRead(0x06);
testReadData[7] = SPI_Flash_HighRead(0x07);
testReadData[8] = SPI_Flash_HighRead(0x08);
testReadData[9] = SPI_Flash_HighRead(0x09);
testReadData[10] = SPI_Flash_HighRead(0x10);
testReadData[11] = SPI_Flash_HighRead(0x11);
*/
// 多个字节写入 方式2
SPI_Flash_Erase_Sector4k(0);
SPI_Flash_AAI_WordProgramSO(testWriteData, 32, 0x00);
// 测试读取多个字节
SPI_Flash_Read_Continue(testReadData,0,16);
// 第二次从第16个字节地址开始读
SPI_Flash_HighRead_Continue(testReadData+16,16,16);
// 串口发送
UART2_Start();
// UART2_SendData(Com, 16);
while (1U)
{
;
}
/* End user code. Do not edit comment generated here */
}
需要注意的是 芯片第一次上电读取出来的状态寄存器上电初始化为 0b00011100 即全部芯片受保护 因此为了能够写入芯片 必须修改状态寄存器中的写保护位
调试截图
目前基本上还剩下下面几个内容
PWM模块实现H桥直流马达驱动
ADPCM库
DMA
还有个问题 定时器输入捕获,输出比较是什么意思?