GPIO一共有8种输入输出模式。可参考:
GPIO内部结构和各种模式_cy413026的博客-CSDN博客读了该篇文章可以知道:1.gpio可以直接用cpu通过寄存器控制读写2.可以直接与片内外设连接 受外设控制(I2C)3.gpio的push-pull和OD/OC结构4.上下拉在输入输出的使用5.斯密特触发器的作用:去信号抖动6.gpio的4种输入和4种输出模式GPIO输入输出各种模式(推挽、开漏、准双向端口)详解_cy413026的博客-CSDN博客据说能将处理器的GPIO(General Purpose Input and Output)内部结构和各种模式彻底弄清楚的人并不多?https://blog.csdn.net/cy413026/article/details/128424266?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22128424266%22%2C%22source%22%3A%22cy413026%22%7D
典型的pad及其接口如下图所示:
一般情况下IE信号直接tie 1.因为大部分都不会做输入控制。
输入数据什么时候读取的数据是有效 这个由cpu或者芯片内的外设决定。
换个说法输入是任何时候都是可以读取到数据的,因为读取并不会影响外部电路的正确性,但是读取的数据是否有效,实际什么时候读取是由cpu和片内外设决定的。
另外为了读取的数据不受输出的影响,在作为输入时,输出是需要为高阻态的,所以cpu或片内外设在实际读取数据时,将OEN置1
1.I2C 接口
I2C接口只有2条双向串行线,一条数据线SDA,一条时钟线SCL
input sda_i;
input scl_i
output sda_o;
output scl_o;
可以发现I2C没有oen信号,此时该如何连接信号呢?我们就以sda信号为例:
assign sda_i = FromPad;
assign ToPad = 1'd0;
assign OEN = sda_o;
这里面有一个前提条件是PAD内部是带上拉电阻的OD结构,这样情况下当sda_o=1时,OE=0,此时T0输出高阻态,由于PAD时带上拉电阻的OD结构,此时PAD输出为1.当sda_0=0时,OE=1,此时T0输出为ToPad=0,所以输出和sda_o取值一致。
根据I2C的时序,第九个SCL高电平期间要读取总线,为了保证在读取的时候输出不影响输入,在第8拍SCL的低电平期间将sda_o置1,输出为高阻态.第九拍如果没有slave响应,由于OD+上拉电阻的作用,此时IO口上是高电平; 如果有slave拉低了总线,master就认为收到ACK。
2.I2S接口
I2S主要有三根信号:分别是SCK(sclk/bclk), WS[word select](lrclk), SD(serial data).
这里以master模式的I2S为例,且为半双工的情况下接线。
因为是半双工,会多一根sd_oen。
所以信号有
output sck;
output ws;
output sd_oen;
output sd_o;
input sd_i;
则其连接方式如下:
assign ToPad[0] = 1'd0;
assign OEN[0] = sck;
assign ToPad[1] = 1'd0;
assign OEN[1] = ws;
assign OEN[2] = sd_oen;
assign ToPad[2] = sd_o;
assign sd_i = FromPad[2];
I2S使用GPIO时,选择的GPIO是何种输入模式?又是何种输出模式?