你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用Stm32 Cubemx的SPI操作SST25VF016B,读写数据有问题;读取ID...

[复制链接]
chenyu360583472 提问时间:2016-6-28 15:34 /
#include "SST25VF016B.h"
#include "spi.h"




//¶Áȡ״̬¼Ä´æÆ÷
uint8_t SST25VF016B_RDSR(void)
{
        uint8_t Read_RDSR[1];
        uint8_t cmd[1];
        cmd[0]=0x05;
       
        SPI_CS_L;
        HAL_SPI_Transmit(&hspi1,cmd,1,1000);
        HAL_SPI_Receive(&hspi1,&Read_RDSR[0],1,1000);
        SPI_CS_H;
       
        return Read_RDSR[0];
}
//æ¼ì²â
void SST25VF016B_BUSY(void)
{
        uint8_t state=1;
        do
        {
                state=SST25VF016B_RDSR();
        }
        while((state&0x01)==0x01);   //״̬¼Ä´æÆ÷×îµÍλΪæ¼ì²âλ
}
//дʹÄÜ
void SST25VF016B_WREN(void)
{
        uint8_t cmd[1];
        cmd[0]=0x06;
       
        SST25VF016B_BUSY();
       
        SPI_CS_L;       
        HAL_SPI_Transmit(&hspi1,cmd,1,1000);
        SPI_CS_H;
}
//д½ûÖ¹
void SST25VF016B_WRDI(void)
{
        uint8_t cmd[1];
        cmd[0]=0x04;
       
        SST25VF016B_BUSY();
       
        SPI_CS_L;       
        HAL_SPI_Transmit(&hspi1,cmd,1,1000);
        SPI_CS_H;
}
//ʹÄÜд״̬¼Ä´æÆ÷£¨EWSR£©;д״̬¼Ä´æÆ÷£¨WRSR£©
void SST25VF016B_EWSR_WRSR(void)
{
        uint8_t cmd[2];
        cmd[0]=0x50;
        cmd[1]=0x01;
       
        SST25VF016B_BUSY();
       
        SPI_CS_L;       
        HAL_SPI_Transmit(&hspi1,&cmd[0],1,1000);
        SPI_CS_H;
        HAL_Delay(2);
       
        SPI_CS_L;       
        HAL_SPI_Transmit(&hspi1,&cmd[1],1,1000);
        HAL_SPI_Transmit(&hspi1,0,1,1000);       //״̬¼Ä´æÆ÷ÇåÁã
        SPI_CS_H;
        SST25VF016B_BUSY();
}
//¶ÁÈ¡ID
void SST25VF016B_READ_ID(uint8_t *ID)
{
        uint8_t cmd[4]={0x90,0x00,0x00,0x00};
//        uint8_t data[2]={0x00,0x00};
        //¼ì²âæ״̬
        SST25VF016B_BUSY();
       
        SST25VF016B_EWSR_WRSR();
        SST25VF016B_WREN();
       
        SPI_CS_L;
        HAL_SPI_Transmit(&hspi1,cmd,4,1000);//·¢ËͶÁÈ¡IDÃüÁî¡£ÁíÍâ·¢ËÍ3¸ö×Ö½ÚµØÖ·Î»
//        HAL_SPI_TransmitReceive(&hspi1,data,ID,2,1000);
        HAL_SPI_Receive(&hspi1,ID,2,1000);    //¶ÁÈ¡ID
        SPI_CS_H;       
        SST25VF016B_BUSY();
}
//4K²Á³ý
void  SST25VF016B_4K_Sector(uint32_t addr)
{
        uint8_t cmd[4];
        cmd[0]=0x20;
        cmd[1]=(addr&0xFFFFFF)>>16;
        cmd[2]=(addr&0xFFFF)>>8;
        cmd[3]=addr&0xFF;
       
        SST25VF016B_BUSY();
        SST25VF016B_EWSR_WRSR();
        SST25VF016B_WREN();
       
        SPI_CS_L;
        HAL_SPI_Transmit(&hspi1,cmd,4,1000);
        SPI_CS_H;
        SST25VF016B_BUSY();
}
//ȫƬ²Á³ý
void  SST25VF016B_All_Sector(void)
{
        uint8_t cmd[1];
        cmd[0]=0xc7;
       
        SST25VF016B_BUSY();
        SST25VF016B_EWSR_WRSR();
        SST25VF016B_WREN();
       
        SPI_CS_L;
        HAL_SPI_Transmit(&hspi1,cmd,1,1000);
        SPI_CS_H;
       
        HAL_Delay(25);
        SST25VF016B_BUSY();
}
//дÉÈÇø
//ʹÓÃÈí¼þд²Ù×÷½áÊø¼ì²éʱµÄ×Ô¶¯µÝÔö(AAI)×Ö±à³ÌÐòÁÐ
void SST25VF016B_Write_Sector(uint32_t addr,uint8_t *buffer,uint16_t length)
{
        SPI_CS_L;       
        uint8_t cmd[4];
        uint16_t i=2;
        uint8_t x;
        cmd[0]=0xAD;
        cmd[1]=(addr&0xFFFFFF)>>16;
        cmd[2]=(addr&0xFFFF)>>8;
        cmd[3]=addr&0xFF;
       
        SST25VF016B_BUSY();
       
        SST25VF016B_4K_Sector(addr);
       
        SST25VF016B_EWSR_WRSR();
        SST25VF016B_WREN();       
       
        SPI_CS_L;
        HAL_SPI_Transmit(&hspi1,cmd,4,1000);
        HAL_SPI_Transmit(&hspi1,buffer,2,1000);    //дÁ½Î»Êý¾Ý
        SPI_CS_H;
               
        for(i=2;i<length;i++)
        {
                SST25VF016B_BUSY();
                SST25VF016B_EWSR_WRSR();
                SST25VF016B_WREN();       
               
                HAL_Delay(1);
                SPI_CS_L;
                HAL_SPI_Transmit(&hspi1,&cmd[0],1,1000);
                HAL_SPI_Transmit(&hspi1,&buffer[i++],1,1000);
                HAL_SPI_Transmit(&hspi1,&buffer,1,1000);
                SPI_CS_H;
        }
        HAL_Delay(1);
       
        x=SST25VF016B_RDSR();
        printf(" ´«ËÍÍêÊý¾ÝÒÔºó״̬¼Ä´æÆ÷״̬Æ÷µÄֵΪ:0x%02x \r\n",x);
        SST25VF016B_WRDI();    //д½ûÖ¹
        SST25VF016B_BUSY();
}
//¶ÁÉÈÇø
void SST25VF016B_Read_Sector(uint32_t addr,uint8_t *buffer,uint16_t length)
{
        uint8_t cmd[5];
        uint16_t i;
        cmd[0]=0x0B;             //¸ßËÙ¶ÁÖ¸Áî
        cmd[1]=(addr&0xFFFFFF)>>16;
        cmd[2]=(addr&0xFFFF)>>8;
        cmd[3]=addr&0xFF;
        cmd[4]=0;                     //·¢ËÍÒ»¸ö¿Õ×Ö½Ú
       
        SST25VF016B_BUSY();
        SST25VF016B_WREN();       
       
        SPI_CS_L;
        HAL_SPI_Transmit(&hspi1,cmd,5,1000);
//        HAL_SPI_Receive(&hspi1,buffer,length,1000);
        for(i=0;i<length;i++)
        {
                HAL_SPI_Receive(&hspi1,&buffer,1,1000);
        }
        SPI_CS_H;
}


/**
  ******************************************************************************
  * File Name          : main.c
  * Description        : Main program body
  ******************************************************************************
  *
  * COPYRIGHT(c) 2016 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "stm32f2xx_hal.h"
#include "i2c.h"
#include "spi.h"
#include "usart.h"
#include "gpio.h"


/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "string.h"
#include "SST25VF016B.h"


/* USER CODE END Includes */


/* Private variables ---------------------------------------------------------*/


/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/


/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void Error_Handler(void);


/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/


/* USER CODE END PFP */


/* USER CODE BEGIN 0 */

//SPI¹¦ÄܵIJÎÊý
uint8_t ID_Data[2];


#define Sector_Size 100
uint8_t Tx_Buffer[]="123456789";
uint8_t Rx_Buffer[Sector_Size];
uint16_t Tx_size;




/* USER CODE END 0 */


int main(void)
{


  /* USER CODE BEGIN 1 */
         
  /* USER CODE END 1 */


  /* MCU Configuration----------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();


  /* Configure the system clock */
  SystemClock_Config();


  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_SPI1_Init();
  MX_USART1_UART_Init();
  MX_USART3_UART_Init();


  /* USER CODE BEGIN 2 */
#if 1
        printf("\r\n /***SPI Falsh ID Test***/ \r\n");
        i=SST25VF016B_RDSR();
        printf(" ״̬¼Ä´æÆ÷״̬: 0x%02x \r\n",i);
       
        i=HAL_SPI_GetState(&hspi1);
        printf(" SPI state is: %d \r\n",i);
       
        SST25VF016B_READ_ID(ID_Data);
        printf(" READ_ID is : 0x%02X 0x%02X \r\n\r\n",ID_Data[0],ID_Data[1]);
       
        printf(" /***SPI R/W Data TEST***/ \r\n");
       
        i=SST25VF016B_RDSR();
        printf(" ״̬¼Ä´æÆ÷״̬: 0x%02x \r\n",i);
       
        Tx_size=(uint16_t)(sizeof(Tx_Buffer)/sizeof(Tx_Buffer[0]));
        printf(" ´ýдÈëµÄÊý¾Ý1: %s\r\n",Tx_Buffer);
        printf(" ´ýдÈëµÄÊý¾ÝµÄ³¤¶È: %d\r\n",Tx_size);
        for(i=0;i<Tx_size;i++)
        {
                Rx_Buffer=Tx_Buffer;
        }
       
        printf(" ´«µÝµÄÊý¾Ý: %s \r\n",Rx_Buffer);
       
        //ÏòÉÈÇøÐ´ÈëÊý¾Ý
        SST25VF016B_Write_Sector(0,Tx_Buffer,Sector_Size);
        //¶Áȡ״̬¼Ä´æÆ÷µÄ״ֵ̬
        i=SST25VF016B_RDSR();
        printf(" дÍêÊý¾ÝÒÔºó½ûֹд,״̬¼Ä´æÆ÷״̬Æ÷µÄֵΪ:0x%02x \r\n",i);
        //ÇåÁã½ÓÊÕBuffer
        memset(Rx_Buffer,0,Sector_Size);
        printf(" ½ÓÊÕBufferÇåÁãºóRx_BufferµÄÖµ:%s\r\n",Rx_Buffer);
       
        HAL_Delay(100);
        //´ÓÉÈÇø¶ÁÈ¡Êý¾Ý
        SST25VF016B_Read_Sector(0,Rx_Buffer,Sector_Size);
        printf(" ½ÓÊÕµ½µÄÊý¾Ý: %s \r\n",Rx_Buffer);
       
//        memset(Rx_Buffer,0,Sector_Size);
//        printf(" ½ÓÊÕBufferÇåÁãºóRx_BufferµÄÖµ: %s\r\n",Rx_Buffer);
////        SST25VF016B_4K_Sector(0);    //²Á³ý4K¿Õ¼äÊý¾Ý
////        SST25VF016B_All_Sector();    //²Á³ýÈ«²¿¿Õ¼äÊý¾Ý
//        SST25VF016B_Read_Sector(0,Rx_Buffer,Sector_Size);
//        printf(" ²Á³ýÍê³Éºó£¬½ÓÊÕµ½µÄÊý¾Ý: %s \r\n",Rx_Buffer);
#endif       






  /* USER CODE END 2 */


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */


  /* USER CODE BEGIN 3 */
//        printf("\r\nchenyu");
        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,GPIO_PIN_RESET);
        HAL_Delay(500);
        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,GPIO_PIN_SET);
        HAL_Delay(500);
  }
  /* USER CODE END 3 */


}


/** System Clock Configuration
*/
void SystemClock_Config(void)
{


  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;


  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 240;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }


  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
  {
    Error_Handler();
  }


  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);


  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);


  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}


/* USER CODE BEGIN 4 */


/* USER CODE END 4 */


/**
  * @brief  This function is executed in case of error occurrence.
  * @param  None
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler */
  /* User can add his own implementation to report the HAL error return state */
  while(1)
  {
  }
  /* USER CODE END Error_Handler */
}




#endif






收藏 评论2 发布时间:2016-6-28 15:34

举报

2个回答
chenyu360583472 回答时间:2016-6-28 15:34:59
各路大神  跪求指导
vitence 回答时间:2016-6-30 13:39:29
不懂   等高手来解答

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版