记住把地址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