1. 程式人生 > >zynq 7000下讀寫qspi 及flash 唯一id

zynq 7000下讀寫qspi 及flash 唯一id

本文主要演示zynq 7000下對Qspi 的讀寫操作,以及讀取8位元組唯一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 等其他方式。