用SPI协议与外设进行通信(W25Q128)

 SPI明明是MISO,主机作为输入,为什么配置的时候配置的是输出模式?

 

 

从参考手册中可以看到,当我们配置为复用功能输出的时候是同时具有输入功能的,故只用配置成输出就行。

使用SPI协议与外设W25Q128进行通信:

 

1.初始化GPIO

2.配置SPI工作模式

3.接收以及发送数据(数据要先发送,再接收)

//4.获取FLASH ID

发送0X9F,由于SPI时序是发送完一个字节,再发送第二个字节的时候接收第一个字节的数据,所以这儿在接第一个数据的同时,再继续发三个DUMMY。才能收到返回的地址。

5.写使能(数据擦除也是一种写数据(写1)),所以在进行数据擦除之前首先要写使能。

6.擦除FLASH

7.读取数据

8.获取寄存器的状态

9.读取数据 最多写256个数据

main函数实现:

/**
  ******************************************************************************

#include "stm32f4xx.h"
#include "./usart/bsp_debug_usart.h"
#include "./flash/bsp_spi_flash.h"

uint8_t readBuffer[4096] = {0X0};
uint8_t writeBuff[4096] = {0x0};

/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{    
    uint32_t device_id = 0;
    uint32_t i = 0;
    
  /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  Debug_USART_Config();
    
    FLASH_SPI_Config();
    
    /* 发送一个字符串 */
    Usart_SendString( DEBUG_USART,"这是一个FLASH实验\n");
    printf("这是一个FLASH实验\n");
    
    device_id = Read_Device_ID();
    
    printf("device_id = 0x%x\n", device_id);
    
    erace_secter(0X00);
    
    Read_buffer(readBuffer, 0X00, 4096);
    
    printf("***********************\n");
    
    for(i = 0; i<= 4096 ;i++)
        printf("0x%x ", readBuffer[i]);
          
  for(i=0;i<256;i++)
      writeBuff[i] = i;
   
  Write_buffer(writeBuff,0x00,256);
    
    //读出写入后的数据
  Read_buffer(readBuffer,0x00,256);  
    
  printf("\r\n*************读出写入后的数据**********\r\n");

  for(i=0;i<256;i++)
      printf("0x%x ",readBuffer[i]);
      
  while(1)
    {    
        
    }    
}

/*********************************************END OF FILE**********************/

tip:每个命令一定要对着手册输入正确。一步一步调试。

 

posted @ 2017-07-05 11:27  Liu_Jing  Views(2923)  Comments(0Edit  收藏  举报