STM32学习笔记---SST25VF016BSPI实验

发布者:shtlsw最新更新时间:2017-11-08 来源: eefocus关键字:STM32  SST25VF016B  SPI实验 手机看文章 扫描二维码
随时随地手机看文章

继做了CAN实验后,继续进行第16个实验-SST25VF016BSPI实验,此实验利用SPI1来调试2M的FLASH-SST25VF016B,通过向SST写入特定的一个字符串后,然后再读出来,最后一一判断,如果没有差错的话,就证明是正确的了,否则就写入出现错误了。正确了就在串口终端上显示字符串信息,还有板子上LED3亮。
//++++++++++++写使能 +++++++++++++++++
void wen(void)
{
 Select_Flash();
 SPI_Flash_SendByte(0x06);
 NotSelect_Flash();
}

//+++++ +++++++ 写禁止 ++++++++++++++++++
void wdis(void)
{

 Select_Flash();
 SPI_Flash_SendByte(0x04);
 NotSelect_Flash();
 wip();
 

//+++++++++++++++++++++++++++++++
void wsr(void)

 Select_Flash();
 SPI_Flash_SendByte(0x50);
 NotSelect_Flash();
 //Delay(0xff);
 Select_Flash();
 SPI_Flash_SendByte(0x01);
 SPI_Flash_SendByte(0x00);
 NotSelect_Flash();
    wip();
 
}

//++++++++++ 忙检测 +++++++++
void wip(void)
{
 unsigned char a=1;
 while((a&0x01)==1) a=rdsr(); 

}
//++++++++++++++++++++++++++++++++
unsigned char rdsr(void)
{
 unsigned char busy;
 Select_Flash();
 SPI_Flash_SendByte(0x05);
 busy = SPI_Flash_ReadByte();
 NotSelect_Flash();
 return(busy);
 
}
           
//+++++++++++++字节写入+++++++++++++++++++++++
void bw1(unsigned long a1,unsigned char a2)
{
 wsr();  
    wen(); 
 Select_Flash();  
 SPI_Flash_SendByte(0x02);
 SPI_Flash_SendByte((a1&0xffffff)>>16);
 SPI_Flash_SendByte((a1&0xffff)>>8);
 SPI_Flash_SendByte(a1&0xff);
 SPI_Flash_SendByte(a2); 
 NotSelect_Flash();
 wip();        
 wdis();
 
}

//+++++++++字节读++++++++++++++++++++++++++++
unsigned char br1(unsigned long a1)
{
 unsigned char i;
 Select_Flash();
    SPI_Flash_SendByte(0x03);
 SPI_Flash_SendByte((a1&0xffffff)>>16);
 SPI_Flash_SendByte((a1&0xffff)>>8);
 SPI_Flash_SendByte(a1&0xff);
 i=SPI_Flash_ReadByte(); 
 NotSelect_Flash();
 return(i);
}


//++++++++++连续读++++++++++++++++++++++++++++
void r_sect(unsigned long a)
{
 unsigned int i;
 Select_Flash();
 SPI_Flash_SendByte(0x03);
 SPI_Flash_SendByte((a&0xffffff)>>16);
 SPI_Flash_SendByte((a&0xffff)>>8);
 SPI_Flash_SendByte(a&0xff);
 for(i=0; i<816; i++){ 
  SST25_buffer[i]=SPI_Flash_ReadByte();
 }
 NotSelect_Flash();
}

//+++++++++++++连续写入+++++++++++++++++++++++
void w_sect(unsigned long a1)
{
 unsigned int i=0,a2;
 
 wsr();
   wen();
 Select_Flash();   
 SPI_Flash_SendByte(0xad);
 SPI_Flash_SendByte((a1&0xffffff)>>16);
 SPI_Flash_SendByte((a1&0xffff)>>8);
 SPI_Flash_SendByte(a1&0xff);
   SPI_Flash_SendByte(SST25_buffer[0]);
 SPI_Flash_SendByte(SST25_buffer[1]);
 NotSelect_Flash();
 i=2;
 while(i<4096){
  a2=130;
  while(a2>0) a2--;
  Select_Flash();
  SPI_Flash_SendByte(0xad);
  SPI_Flash_SendByte(SST25_buffer[i++]);
  SPI_Flash_SendByte(SST25_buffer[i++]);
  NotSelect_Flash();
 }
 
 a2=130;
 while(a2>0) a2--;
 wdis(); 
 Select_Flash(); 
 wip(); 
 
}
//++++++++++块读++++++++++++++++++++++++++++
void SST25_R_BLOCK(uint32_t addr, u8 *readbuff, uint16_t BlockSize)
{
 unsigned int i=0;
 Select_Flash();
 SPI_Flash_SendByte(0x03);
 SPI_Flash_SendByte((addr&0xffffff)>>16);
 SPI_Flash_SendByte((addr&0xffff)>>8);
 SPI_Flash_SendByte(addr&0xff);
 while(i  readbuff[i++]=SPI_Flash_ReadByte();
 }
 NotSelect_Flash();
}
//+++++++++++++块写入+++++++++++++++++++++++
void SST25_W_BLOCK(uint32_t addr, u8 *readbuff, uint16_t BlockSize)
{
 unsigned int i=0,a2;
 sect_clr(addr);    //清除addr开始的4096个字节的块
 wsr();
   wen();
 Select_Flash();   
 SPI_Flash_SendByte(0xad);
 SPI_Flash_SendByte((addr&0xffffff)>>16);
 SPI_Flash_SendByte((addr&0xffff)>>8);
 SPI_Flash_SendByte(addr&0xff);
   SPI_Flash_SendByte(readbuff[0]);
 SPI_Flash_SendByte(readbuff[1]);
 NotSelect_Flash();
 i=2;
 while(i  a2=130;
  while(a2>0) a2--;
  Select_Flash();
  SPI_Flash_SendByte(0xad);
  SPI_Flash_SendByte(readbuff[i++]);
  SPI_Flash_SendByte(readbuff[i++]);
  NotSelect_Flash();
 }
 
 a2=130;
 while(a2>0) a2--;
 wdis(); 
 Select_Flash(); 
 wip(); 
 
}
//++++++++++++++++++++++++++++++++
void sect_clr(unsigned long a1)
{
 //wen();
 
 wsr();
 wen();    
 Select_Flash();

 SPI_Flash_SendByte(0x20);
 SPI_Flash_SendByte((a1&0xffffff)>>16);          //addh
 SPI_Flash_SendByte((a1&0xffff)>>8);          //addl
 SPI_Flash_SendByte(a1&0xff);          //wtt
 NotSelect_Flash();
 wip();
 
}

//========读器件厂家信息
void FlashReadID(void)
{

 Select_Flash(); 
   SPI_Flash_SendByte(0x90);
 SPI_Flash_SendByte(0x00);
 SPI_Flash_SendByte(0x00);
 SPI_Flash_SendByte(0x00);
   fac_id= SPI_Flash_ReadByte();   //BFH: SST
 dev_id= SPI_Flash_ReadByte();      //41H:SST25VF016B
 
   NotSelect_Flash(); 
}

**************************

//测试SST25VF016B-SPI
void TEST_SST25VF016BSPI(void)

   uint8_t a=0;
   uint16_t i=0;

  for(i=0; i 
  SST25_W_BLOCK(0, SST25_buffer,4096);    //写入0页的数据
  Delay(0xffff);
  SST25_R_BLOCK(0, SST25_buffer,4096);    //读出0页的数据
  a=0;
  for(i=0; i  {
   if(SST25_buffer[i]==TxBuffer1[i]) a=1;   //和原始数据进行比较, 以判别是否读写正常
 else {a=0; i=TxBufferSize1;}
  }
 
  if(a==1) {
   GPIO_SetBits(GPIOD, GPIO_Pin_3);           //读写正确LED1 亮
   USART_TX(USART1,&SST25_buffer[0]);  
  }

}

以下为结果演示:

[转载]STM32学习笔记---SST25VF016BSPI实验


关键字:STM32  SST25VF016B  SPI实验 引用地址:STM32学习笔记---SST25VF016BSPI实验

上一篇:使用STM32CubeMX开发三:按键中断实验
下一篇:stm32发送中断编程思路

推荐阅读最新更新时间:2024-03-16 15:43

STM32 CAN过滤器的学习心得
关于STM32的CAN的过滤器 STM32普通型芯片的CAN有14组过滤器组(互联型有28组过滤器组),用以对接收到的帧进行过滤。每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。对于过滤器组,可以将其配置成屏蔽位模式,这样CAN_FxR0中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码,即CAN_FxR1中如果某一位为1,则CAN_FxR0中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器;CAN_FxR1中为0的位表示CAN_FxR0中的相应位可不必与收到的帧进行匹配。过滤器组还可以被配置成标识符列表模式,此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的
[单片机]
stm32笔记2-3 GPIO操作(库函数)
GPIO操作的几个重要函数: 初始化函数(1个): void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 读取输入电平函数(2个): uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 读取输出电平函数(2个): uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_P
[单片机]
关于stm32串口不定长数据接收(hal库)的若干问题
使用串口空闲中断和DMA配合时出现的问题: 问题1.串口接收一旦溢出就会丢数据。 例如串口接收满了,稍等几秒再启动新的DMA接收函数HAL_UART_Receive_DMA时,就丢失数据了,而且是再也收不到串口数据。如果接满后马上启动就没这个问题。 看官方示例代码,停止DMA接收后似乎要DeInit后重新初始化Init和启动DMA接收 解答: 当接收DMA关闭后,此时串口还是激活的,若此时串口来数据,无法触发DMA传输,此时产生上溢错误(ORE),由于串口数据寄存器里的数据不能及时转移走,后面来的数据就进不来。一旦出现这种错误后,就不会再触发DMA请求,即使再开启DMA也不行。要恢复正常的话就只有Deinit后再重
[单片机]
关于<font color='red'>stm32</font>串口不定长数据接收(hal库)的若干问题
stm32 NRF24L01
include 24l01.h #include lcd.h #include delay.h #include spi.h #include usart.h const u8 TX_ADDRESS ={0x34,0x43,0x10,0x10,0x01}; //发送地址 const u8 RX_ADDRESS ={0x34,0x43,0x10,0x10,0x01}; //初始化24L01的IO口 void NRF24L01_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; R
[单片机]
STM32内部温度传感器的使用与计算
Temperature (in ℃) = {(V - V) / Avg_Slope} + 25 公式中的V就是在ADC_IN16读到的数值。Avg_Slope就是温度与ADC数值转换的斜率。 设想一个XY坐标,X轴为ADC的电压读数,Y轴为温度,两轴之间有一条直线代表了温度与转换电压的关系;在这条直线上如果X轴电压为V时,Y轴即为25℃;当读出的电压是其它数值时,即读出的电压是V时,使用这个公式就可以得到温度的数值。 在STM32F103xx的数据手册中分别给出了V和Avg_Slope的值: V 最小=1.34V 典型=1.43V 最大=1.52V Avg_Slope 最小=4.0 典型=4.3 最大
[单片机]
STM32单片机的外部时钟晶振该如何选择频率
芯片的主晶振频率范围一般来说在数据手册(Datasheet)和技术参考手册(Technical Reference Manual)中都有介绍。 你提到的时钟先分频再倍频,这个需要深入到STM32的内部去一探究竟了,在其技术参考手册的第7.2节Clocks的一开始有一个表格,时钟树(Figure 8. Clock tree),它完全地列出来STM32这个芯片内部各个模块的时钟来源以及相关的从属关系。 在这个图的正中央,有一个核心时钟:SYSCLK,它最大频率是72MHz,它的时钟信号通过选择器SW可以由PLLCLK提供(也可由HIS、HSE提供)。 PLL,毫无疑问,它是用来倍频的,可以*2,*3,*4……*16,它的时
[单片机]
<font color='red'>STM32</font>单片机的外部时钟晶振该如何选择频率
STM32的ADC输入通道配置
STM32中最多有3个ADC模块,每个模块对应的通道不完全重叠。 下图是STM32F103CDE数据手册中的总框图的左下角,图中可以看出有8个外部ADC管脚分别接到了3个ADC模块,有8个外部ADC管脚只分别接到了2个ADC模块,还有5个外部ADC管脚只接到了ADC3模块,这样总共是21个通道。 下表是这些ADC管脚与每个ADC模块的对应关系,表中可以看出ADC1还有2个内部通道,分别接到内部的温度传感器和内部的参照电压:
[单片机]
<font color='red'>STM32</font>的ADC输入通道配置
使用STM32点亮一颗LED实验
本次实验系统环境 Matlab版本: 2021b 系统环境 :Win10专业版 模型与原理图 simulink模型如图5.1所示,实验现象PB8以0.5S周期反转,PB9以1S周期翻转闪烁,本次实验电路原理如图5.2所示,实验所使用的下载器为STLINK 2V1版本,下载器自带一个串口,完整实验电路板如图5.3所示 图5.1 两颗LED闪烁simulink模型 图5.2 LED闪烁电路图 图5.3 实验开发板 基础模型介绍与分析 “Digital Write”模型用于控制I/O口作为普通输出用,双击模型可更改引脚编号,如图5.4所示其引脚对应STM32的PB8端口,例如想使用PA5引脚时,可通过将其改为“PA_
[单片机]
使用<font color='red'>STM32</font>点亮一颗LED<font color='red'>实验</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved