記住把地址0x67800030第17位置1。目的是開啟spi1的所在的那一組GPIO(資料線,時鐘線以及片選線對應的GPIO供電)的晶片內部供電,這一路供電叫vdd_nfs。要注意在v2的DVB板上這一路供電可以通過跳線JP12直接提供,所以如果直接通過跳線由外部提供一個1v8的電壓後spi1也是可以使用的。
以上問題的發現是因為測試中總是發現spi1沒有clk輸出,對應的其他資料線也沒有訊號。而當修改spi1控制器對應的寄存器後發現寄存器的值都是正常變化的,由此斷定spi1控制器本身已經在正常工作了,只是其對應的gpio沒有拉動。那麼可是gpio功能配置錯誤,但是檢查了gpio功能配置的相關寄存器後發現這幾個gpio功能選擇都是正常的。繼而想辦法確定這幾個gpio的硬體是否正常,方法是將這幾個gpio的功能配置為功能1,即普通的gpio,然後再配置其為輸出方向,然後設定相關寄存器讓它拉高拉低,發現竟然不動。如此看來真有點兒懷疑是gpio的硬體出了問題。但是專門針對gpio的測試時卻發現這幾個gpio都是正常的。因此推斷肯定是我對gpio的配置有些問題。另外一個同事是專門做gpio測試的,和他溝通後,他指出可能是spi1所用的哪一組gpio沒有被供電。解決問題!
順便說下gpio的功能選擇和配置。
每16個gpio分為一組。假設你要配置gpio_70,那麼用70除以16,商4餘6.所以這個gpio在第四組,在組內的寄存器位移量是6,也就是第6位。
每一組gpio涉及80個32bit的寄存器。假設gpio對應的寄存器開始於寄存器0x6E000000,也就是第0組始於0x6E000000,那麼第一組始於0x6E000080,第二組始於0x6E000100,第三組始於0x6E000180,第四組始於0x6E000200.以此類推。
首先在0x6F000000位置選擇gpio的功能(見GPD選項卡)。絕大多數gpio都各自有4中功能可以配置。
對於gpio_70的具體功能選擇在0x6F000084寄存器的[ 27:26 ] 兩個位。
功能選擇完成後(這裡我們選擇的是第一功能,即gpio功能,這樣我們才需要第二步)
第二步是配置gpio的
方向: 設定寄存器0x6E000200的第6位為1表示輸出
掩碼:設定寄存器0x6E000204的第6位為1,這是掩碼,就不說了。
拉高拉低; 設定寄存器0x6E000208的第6位為1,這個表示拉高。
完了。
0x67800040的 [5:6] 都設定為1可以配置晶片的VIO電壓為3.3V