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:每個命令一定要對着手冊輸入正確。一步一步調試。