zynq 7000下讀寫qspi 及flash 唯一id
我在使用altera 的時候,寫了一篇讀寫flash 及其ID的文章。
在我轉入zynq 7000的時候,自然也要有讀寫QSPI FLASH, 以及讀取其ID。
本文分為四部分:硬體設計,軟體設計,測試驗證,期待
本文的前提條件是讀者會helloworld 實驗,也就是會zynq 7000的SDK開發過程,如果不會,那先去看我的zynq 7000下的helloworld 實驗,或者開發板提供的helloworld 實驗教程。
我實驗平臺是黑金的核心板AC7010, 其板上的QSPI晶片是W25Q256FV
工程下載連結:http://pan.baidu.com/s/1qYxAnFI 密碼:p2c6
單一原始碼下載連結 http://pan.baidu.com/s/1dFcsf3F
1 硬體設計
硬體設計基本和helloworld 一樣,不同的是要選擇QSPI, 否則怎麼做實驗呢。還有工程名字取為qspi。
在zynq配置的peripheral I/O Pins 裡選擇Quad SPI Flash, 如圖:
在zynq配置的MIO configuration 裡選擇Quad SPI Flash的每個腳為 fast, 如圖:
出此以外,都和hello world 實驗的硬體設計一樣。
2: 軟體設計
在SDK裡 新建工程,取名為qspi_t , 在Next 裡可以選擇hello world 或者empty project。下載我提供的xqspips_flash_polled_example.c 檔案, 放入.src ,就是hellowrld.c 的地方。 刪除helloworld.c 。
為什麼取這樣一個名字呢? 這是Xilinx提供的樣例程式,你可以在你的xilinx 目錄下搜尋到這個檔案。我提供的程式是在其上修改得到的。
FlashWrite, FlashRead, FlashErase, FlashReadID 都是樣例程式裡包含的。我做的工作只是修改了main函式,還有仿照FlashReadID, 編寫了一個FlashReadUID函式。
FlashWrite, 寫Flash, 其引數是QSPI驅動指標, FLash寫的起始地址, 寫入位元組數, 寫命令
FlashRead, 讀Flash, 其引數是QSPI驅動指標, FLash讀的起始地址, 讀取位元組數, 讀命令
FlashWrite, 擦出Flash, 其引數是QSPI驅動指標, FLash擦除起始地址, 擦除位元組數。
寫命令其實只有一個WRITE_CMD, 但讀命令有4個選擇:READ_CMD, FAST_READ_CMD, DUAL_READ_CMD, QUAD_READ_CMD
FlashReadID 就是讀取JEDEC ID
FlashReadUID 是我仿照上面函式寫的, 我查看了W25Q256FV的手冊,讀取唯一ID的cmd 是0x4B, 我不確定其他晶片是否一樣,你需要自己檢視。
主程式的流程是:基本初始化,獲取Flash 的驅動指標,給WriteBuffer 陣列賦值,就是打算 寫什麼東西進去,呼叫2個id 讀取, 擦除,讀取,顯示內容,寫入, 讀取,顯示內容,呼叫2個id 讀取並顯示。
3:程式執行
以下是程式執行在串列埠監視終端上的顯示內容
4 期待
按資料介紹,唯一id 每個晶片都是不一樣的,可不可以把你 的id 告訴我,看看是不是都不一樣。
如果這樣的話,我們就可以用這個id 加密,就是用一個演算法,比如des,des3,得到一個結果,而這個結果只有知道演算法的人才知道。把這個結果填入一個地方,那就是程式設計師認可了。這樣如果簡單複製程式,那就不行的,防止盜版。
其實xilinx 也有一套加密的演算法,估計他那更科學。我還沒有學會,知道了和大家分享。
xilinx 的加密方法相關文件是:https://www.xilinx.com/support/documentation/user_guides/ug1025-zynq-secure-boot-gsg.pdf
和 xapp1175_zynq_secure_boot.pdf 正在學習中。
告訴我id 的方法可以是留言,大家都可以看到,或者qq 等其他方式。