SPI接口的FLASH


SPI flash W25Qxx:

W25Q系列的spiflash。每頁(Page)256B,每16個page為一個sector(扇區=4KB),每16個扇區為一個block(塊=64KB)

 W25Q16=16Mb=2MB=2048KB=32block=512sector=8192page;

操作:SPI flash寫操作必須確保為0XFF才能寫入,否則需要檫除操作,檫除的最小單位為Sector即4KB,所以有的會在單片機內部開一個4K的緩存(有點奢侈),寫之前先讀出來,檫除數據,合並數據(在檫除數據的同時進行操作,合並完了在檢查檫除是否完成,不閑着;操作系統級的 將因此進入掛起。要么設定一個合適的超時時間,要么有一個專門的輪訓這些標志完成則發信號量),再寫入。

驅動程序:https://blog.csdn.net/weixin_42381351/article/details/80813104

SPI SPI flash驅動規范:

1 硬件SPI/軟件SPI涉及的MOSI/MISO/SCK的IO設置、SPI設置讀寫一個字節。

2 存儲器件IC涉及的片選、調用SPI讀寫一個字節操作在某個指定地址讀寫一個字節/多個字節,檫除等操作。

3業務層次的讀寫記錄,APP升級等。

 

一主多從可以通過不同片選來發送(都片選則都會收到),但對接收,如果關閉某個片選則可能得不到及時相應;如果都打開則同時來時的處理。IO模擬SPI一主多從如右圖,先操作譯碼器(速度要快)再操作SPI的其它三根口線即可。

GPIO模擬的SPI操作靈活,但效率不高。同時這種方法不適用於SPI的DMA傳輸,僅適合數據量少、對傳輸速度要求不同的場合。

硬件SPI的片選可以軟件控制也能硬件控制(DMA傳輸時必須)

關於IO模擬SPI驅動的另一種編程方法:SCLK用PWM輸出方波(脈寬周期按手冊),其它的4線配置SCLK進行操作,通過讀SCLK引腳

 GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)來配合時序,不滿足就等,滿足就進行其它IO的置高置低(配置SYSTICK或NOP進行延時)

關於如何根據時序圖用IO模擬寫驅動/上升沿采樣下降沿發送數據的含義,哪TM7705為例:

上圖表示對主機MCU而言:

寫的時候:MOSI上上升沿采樣,上升沿前低電平時就要發送bit數據即:SCLK=0延時一小段時間就將send_data的MSB發出,然后SCLK=1再延時一段時間,接着進行下一個bit的操作。

讀的時候:再MISO上也是上升沿采樣,高電平期間讀bit.SCLK=0;delay(4),SCLK=1,delay(2),讀MISO引腳電平,delay(1),接着進行下一個bit的操作。

 1 /*
 2 *********************************************************************************************************
 3 *    函 數 名: TM7705_Send8Bit
 4 *    功能說明: 向SPI總線發送8個bit數據。 不帶CS控制。
 5 *    形 參: _data : 數據
 6 *    返 回 值: 無
 7 *********************************************************************************************************
 8 */
 9 static void TM7705_Send8Bit(uint8_t _data)
10 {
11     uint8_t i;
12 
13     for(i = 0; i < 8; i++)
14     {    
15         SCK_0();
16         TM7705_Delay();
17         if (_data & 0x80)
18         {
19             DI_1();
20         }
21         else
22         {
23             DI_0();
24         }
25         SCK_1();
26         TM7705_Delay();
27         _data <<= 1;
28         TM7705_Delay();    
29     }
30 }
31 /*
32 *********************************************************************************************************
33 *    函 數 名: TM7705_Recive8Bit
34 *    功能說明: 從SPI總線接收8個bit數據。 不帶CS控制。
35 *    形 參: 無
36 *    返 回 值: 無
37 *********************************************************************************************************
38 */
39 static uint8_t TM7705_Recive8Bit(void)
40 {
41 uint8_t i;
42 uint8_t read = 0;
43 
44 SCK_0();
45 TM7705_Delay();
46 for (i = 0; i < 8; i++)
47 {
48   SCK_0();
49   TM7705_Delay();    
50 
51   SCK_1();
52   TM7705_Delay();
53   TM7705_Delay();
54   if (DO_IS_HIGH())
55   {
56     read++;
57   }
58   read = read<<1;
59 }
60 return read;
61 }                                                
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM