的确把SPI用作GIO时候稍微有点复杂。
这个我觉得是因为SPI的引脚类型比较多,比如SIMO[x],SOMI[x], ENA, SCS, CLK等等。
不如NHET的引脚名称容易识别,NHET[00],NHET[01]…
但是实现起来大同小异。
我们需要清楚的是每个GIO引脚一般都需要如下寄存器位来实现对应的功能:
1. DIR 控制引脚输入输出方向(SPIPC1)
2. DIN 用来读取引脚输入值(SPIPC2)
3. DOUT用来设置引脚输出电平(SPIPC3)
4. DSET 用来实现”单操作输出高”(SPIPC4)
5. DCLR用来实现”单操作输出低”(SPIPC5)
6. PDR 用来控制引脚是否开漏输出(SPIPC6)
7. DIS 用来控制引脚是否有内部上拉或下拉电阻(SPIPC7)
8. PSEL 用来选择具体是上拉还是下拉(SPIPC8)
这不仅针对SPI,NHET,所有能够做GIO的引脚,都需要这么多寄存器位来做控制。
但是SPI的GIO功能还需要一个特别的寄存器,那就是FUN寄存器(SPIPC0)
0. FUN 控制引脚是作为GIO使用还是作为SPI引脚使用的。
这样,您就可以清楚知道为什么会有这么多寄存器来控制SPI的GIO了。
每个SPIPCx寄存器内部的结构也够类似。
因为的芯片会有最多8组SOMI或SIMO或SCS引脚,所以这些引脚在寄存器中占有8个bit,手册也提到,如果芯片没有那么多这种引脚,那么就从低位开始算起,高位无效。
举个例子,如果把一个芯片的MibSPI1的SOMI[3]这个引脚作为开漏输出,内部上拉,并输出高, 那么:
0. FUN (SPIPC0)寄存器的SOMIFUN.3应该为0
1. DIR (SPIPC1)的SOMIFUN.3应该为1
2. DIN (SPIPC2)不用配置
3. DOUT(SPIPC3)的SOMIFUN.3应该为1. (或者不配置这个寄存器而配置 DSET寄存器)
4. DSET (SPIPC4)的SOMIFUN.3应该为1. (建议用DSET来实现输出1的操作)
5. DCLR (SPIPC5)不用配置
6. PDR (SPIPC6)的SOMIFUN.3应该为1.
7. DIS (SPIPC7)的SOMIFUN.3应该为0.
8. PSEL (SPIPC8)的SOMIFUN.3应该为1.
这些寄存器都是针对一组MibSPI的,每个SPI都会有这么多的寄存器来控制。
最后还有需要注意的,就是PINMUX功能了,因为有些功能和其他功能复用了同一个引脚,这时,究竟这个引脚是哪个功能,就要通过PINMUX寄存器来决定。
用户手册中有关于PINMUX的具体说明,请参考。
[ 本帖最后由 renton 于 2012-12-31 10:32 编辑 ] |