Re: 請教操作QSPI Flash的觀念(讀寫資料用)
|
||||
---|---|---|---|---|
管理員
|
先回應幾個方向一起研究一下, 因為目前Harmony的範例code沒有實現, 還在想辦法看看是否可以把Example code完成
1. SAMx5x QSPI physical memory mapping 只有24 bits沒錯, 因此如果以公板上的美光N25Q256A來講, 只能存取到128Mbit一半而已 2. 但是SAMx5x QSPI可以使用 INSTRFRAME 暫存器中的 OPTCODEEN與OPTCODELEN, 來決定是否啟用OPTION bits, 然後多的8 bits addressing是在INSTRCTRL暫存器中的OPTCODE這8bit來指定的, 因此可以使用32bit定址, 來存取大於128Mbit的QSPI Flash 紅框的部分 3. 除了MCU這邊要設定外, 美光N25Q256A初始也是3-Byte(24bit) Addressing Mode, 也需要依照他的DataSheet, 傳送相對的命令來啟動它的4-Byte address模式, 這部分在目前的Harmony範例code當然也是沒有. https://www.micron.com/-/media/client/ ... or/n25q/n25q_256mb_3v.pdf 4. OPTCODEEN需要依照傳送的模式來決定不能亂給(我畫個範例)
發表於: 2021/6/28 17:57
Edited by Libra on 2021年06月28日 18:27:12
Edited by Libra on 2021年06月28日 18:28:09 Edited by Libra on 2021年06月28日 18:29:13 |
|||
|
Re: 請教操作QSPI Flash的觀念(讀寫資料用)
|
||||
---|---|---|---|---|
資深會員
|
那我這樣問好了
從DataSheet上看到的Product Memory Mapping Overview,可以看到QSPI的位址範圍 參考畫面 從MPLAB X中測試QSPI的static void qspi_memcpy_32bit(uint32_t* dst, uint32_t* src, uint32_t count) 可發現它寫入時是用0x04000000加入Offset來操作的,下圖是我設成從128Mb的位址開始寫入 參考執行畫面 從上面的圖看到當操作128Mb以上時,addr會大於0x05000000,已經大於第一張圖的QSPI定址範圍了,如果它可以支援4-Byte address mode的話,是怎麼做的? 下面的QSPI_MemoryWrite中,QSPI_ADDR 的定義是_UL_(0x04000000)
bool QSPI_MemoryWrite( qspi_memory_xfer_t *qspi_memory_xfer, uint32_t *tx_data, uint32_t tx_data_length, uint32_t address )
發表於: 2021/6/25 14:53
|
|||
|
Re: 請教操作QSPI Flash的觀念(讀寫資料用)
|
||||
---|---|---|---|---|
管理員
|
SAME54 default是24bits定址最大到 128Mbits,
如果要支援到大於128MBits時, 需要使用32bits 定址
發表於: 2021/6/25 12:11
|
|||
|
Re: 請教操作QSPI Flash的觀念(讀寫資料用)
|
||||
---|---|---|---|---|
資深會員
|
關於操作256Mb的部份,我在SAME54的DataSheet中的Product Memory Mapping Overview看到,
QSPI的Addr範圍是:0x04000000 -> 0x05000000 即可操作的範圍只有0x01000000 = 16MB = 128Mb 我找了SAM E70系列來比對,它們的QSPI範圍是:0x80000000 -> 0xA0000000 且官網上寫著: Quad I/O Serial Peripheral Interface (QSPI) interfacing up to 256 MB Flash and with eXecute-In-Place and on-the-fly scrambling 這顆的QSPI操作範圍是0X20000000 = 512MB,我不太確定它是跑XIP時只能到256MB還是當Data Flash也只能到256MB,我沒要用這顆就不太關心了 版大可以幫忙確認一下,SAME54這個說明就是只支援到128Mb的意思? 因為我在讀寫時,把INSTRFRAME的ADDRLEN設成1也是沒用,一樣跳到HardFault
發表於: 2021/6/25 10:44
|
|||
|
Re: 請教操作QSPI Flash的觀念(讀寫資料用)
|
||||
---|---|---|---|---|
資深會員
|
感謝回覆,
您使用18F來操作,3秒寫入一次33Bytes 這33Bytes是佔用一個Page的空間?不然索引值可能不太好算,跨sector時會有點麻煩 Flash每次寫入時應該要備份一次sector的內容,erase後再寫回去,不然每寫一次該sector的其它資料就不見了… PIC18能開出4096的buffer?一次用掉16個bank只為了當備份sector的buffer,感覺有點心痛啊 所以您的流程是:複製sector到buffer --> erase --> 將修改的buffer寫入Flash嗎?
發表於: 2021/6/24 12:46
|
|||
|
Re: 請教操作QSPI Flash的觀念(讀寫資料用)
|
||||
---|---|---|---|---|
資深會員
|
你好 :
1.我是用18F使用SPI讀寫SST26V32B. 2.要用之前要先解鎖. 3.要寫之前先清除,一個Sector(4096). 4.我是一筆資料33Bytes, 3秒存一筆, 存好存滿及重頭存, 目前都還OK. 5.有使用QSPI的先進, 請分享... 謝謝.
發表於: 2021/6/24 10:13
Edited by jlian on 2021年06月24日 10:32:28
|
|||
|
請教操作QSPI Flash的觀念(讀寫資料用)
|
||||
---|---|---|---|---|
資深會員
|
我想用Flash操作Page的讀寫來存取資料
以前用的都是SPI的NAND Flash,操作時page的寫入命令會自動執行erase再寫進去,看起來比較單純 QSPI的NOR Flash看起來操作差異比較大,我找了一陣子資料,整理一下它的特色: - earse最小單位為4k (有的叫subsector,有的叫sector) - 讀取時可隨意指定addr(因它有x decoder, y decoder,可將輸入的addr轉為page index,及page內的位置) - 模組直接mapping到MCU的address,以SAME54為例是QSPI_ADDR (0x04000000) 我看了一下範例(Harmony\V3\csp_apps_sam_d5x_e5x\apps\qspi\qspi_read_write) 裡面不管是SST26或N25Q256A,都是初始化後先erase 1個sector,然後在這個sector裡寫點資料再讀出來。 對QSPI Nor Flash有些問題:(操作使用MHC產生的plib_qspi.c) - 在寫入Flash時,plib中提供
bool QSPI_MemoryWrite( qspi_memory_xfer_t *qspi_memory_xfer, uint32_t *tx_data, uint32_t tx_data_length, uint32_t address )
csp網頁中的說明: This function can be used to write maximum of one page of data to the specified address of the serial flash device connected as a QSPI slave. 裡面addr並沒有做限制,function的實作是設定命令為CMD_PAGE_PROGRAM之後就開始複製資料,沒有執行erase的動作,請問 - 想要寫入資料時,只要執行QSPI_MemoryWrite,還是必須先執行erase? - addr是以page size為單位,即 (size%256)來當作addr? 我的應用裡,須要寫入的資料有好幾類,會把Flash分成幾段,每段寫入不同種類的資料。 資料都不大,但會不斷連續寫入(至少一分鐘寫入一次),若每次寫入都須要先erase 4k,頻繁的清除/寫入對NOR Flash好像不太好?NOR Flash好像是較適合不常寫入,常讀出的應用? 會想用NOR Flash (256Mb)一方面是開發板(SAME54)上有,想說有範例code較容易上手,但這個範例的用法過於簡略,看不出若是要反覆讀寫時應該怎麼做。(是否須要每次先Erase?) (範例甚至無法讀寫整顆Flash,因size大於128Mb,預設的addr只有3byte) 另一方面QSPI不包含在sercom裡,用這顆的話可以省一組Sercom,就多了一組通訊介面可用 請問若應用是像這樣至少每分鐘會寫入(加上其它不定時其它類型事件),是否不適合使用NOR Flash?(我擔心頻繁的小資料寫入會讓flash很快就掛掉) 麻煩有用過的先進給些建議,謝謝 Plib中的實作
bool QSPI_MemoryWrite( qspi_memory_xfer_t *qspi_memory_xfer, uint32_t *tx_data, uint32_t tx_data_length, uint32_t address )
發表於: 2021/6/23 9:45
|
|||
|