求教!将一组pin,配置成特定功能时(如I2C)时,pin的电气特性是在哪里配置的?

caoai3033 2017-07-19 02:20:20
将一组pin,配置成特定功能时(如I2C)时,pin的电气特性是在哪里配置的?
根据Document中的pinctrl.txt中所说:
Rather hardware engineers think that "GPIO mode" means that you can software-control a few electrical properties of the pin that you would not be able to control if the pin was in some other mode, such as muxed in for a device.
是否是指:只有在将一个pin指定为gpio-mode时才能使用软件控制其电气特性。那么如果将pin的功能指定为I2C、UART或者I2S的话,pin的电气特性是在何时何处配置的呢?
另外,请教一下,I2S使能时,它所使用的数据引脚的电气特性是怎样的(输入/输出/拉高/拉低)。还有,如果是使用一个6mic的麦克风阵列,使用I2S时,I2S的pin状态又是怎样的呢?
请各位大神赐教!
...全文
1844 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
caoai3033 2017-07-20
  • 打赏
  • 举报
回复
引用 14 楼 of123 的回复:
究竟是 I2C 还是 I2S?这可是两种不同的总线哦。
额额,是I2S,只是想拿I2C作例子。 抱歉写的有点乱
of123 2017-07-20
  • 打赏
  • 举报
回复
究竟是 I2C 还是 I2S?这可是两种不同的总线哦。
fly 100% 2017-07-20
  • 打赏
  • 举报
回复
现在芯片做法内部就算做上下拉也是弱上下拉,外围还是需要进行处理,上下拉和驱动能力寄存器一般和管脚服用在一起,
caoai3033 2017-07-19
  • 打赏
  • 举报
回复
引用 11 楼 jklinux 的回复:
[quote=引用 10 楼 caoai3033 的回复:] [quote=引用 9 楼 jklinux 的回复:] [quote=引用 8 楼 caoai3033 的回复:] [quote=引用 2 楼 jklinux 的回复:] 里面的io口如配置成i2c接口,这些io口就会被i2c控制器接管。当通过控制器发数据时,控制器会自动控制io口的电平,当接收数据时,控制器会自动判断电平
我现在遇到了一个具体的问题: 使用的I2S接口的PCM功能。 使用I2S接口外接6mic的阵列,目标是获得6路mic数据,6个mic两两一组连接在i2s的sdi、sdio1、sdio2三个pin上。 在调试后,但是最后只能得到 sdi 这一个pin上的两路mic数据。 调查时使用示波器测量sdio1、sdio2上的波形,发现被拉低了,而sdi上有正常的声音信号。另外再读取I2S的控制寄存器,发现配置成 8ch 输入也成功了。时钟也确认过是正确的。 怀疑是否是pin的配置不对。pin状态被拉低又可能是什么造成的呢?pin接了地或者下拉电阻? 还有就是I2S控制器对pin的配置是否可以通过设备树或者其他方式进行修改?[/quote] 这引脚的名字“sdio”一般是sd/mmc控制器的引脚似的,是否复用了?[/quote] 这个引脚的全称是i2s1_sdio1,下边是它的设备树节点
   
    i2s1_sdio1: i2s1-sdio1{
        rockchip,pins = <2 GPIO_C4 RK_FUNC_1 &pcfg_pull_none>
    };
去pinctrl中加log,该pin(GPIO_C4)已经被i2s1请求到了。 请教一下,能不能获取到这个pin当前的状态呢?或者能够获取到pin的当前配置信息呢?[/quote] 最简单粗暴的方法就是把配置寄存器的内容读出来看看。先用ioremap把寄存器的物理地址映射到一个虚拟地址,然后从映射得到的虚拟地址上取值就可以了。就是需要查看下手册里的内容。[/quote] 多谢,我先读取一下看一看
jklinux 2017-07-19
  • 打赏
  • 举报
回复
引用 10 楼 caoai3033 的回复:
[quote=引用 9 楼 jklinux 的回复:] [quote=引用 8 楼 caoai3033 的回复:] [quote=引用 2 楼 jklinux 的回复:] 里面的io口如配置成i2c接口,这些io口就会被i2c控制器接管。当通过控制器发数据时,控制器会自动控制io口的电平,当接收数据时,控制器会自动判断电平
我现在遇到了一个具体的问题: 使用的I2S接口的PCM功能。 使用I2S接口外接6mic的阵列,目标是获得6路mic数据,6个mic两两一组连接在i2s的sdi、sdio1、sdio2三个pin上。 在调试后,但是最后只能得到 sdi 这一个pin上的两路mic数据。 调查时使用示波器测量sdio1、sdio2上的波形,发现被拉低了,而sdi上有正常的声音信号。另外再读取I2S的控制寄存器,发现配置成 8ch 输入也成功了。时钟也确认过是正确的。 怀疑是否是pin的配置不对。pin状态被拉低又可能是什么造成的呢?pin接了地或者下拉电阻? 还有就是I2S控制器对pin的配置是否可以通过设备树或者其他方式进行修改?[/quote] 这引脚的名字“sdio”一般是sd/mmc控制器的引脚似的,是否复用了?[/quote] 这个引脚的全称是i2s1_sdio1,下边是它的设备树节点
   
    i2s1_sdio1: i2s1-sdio1{
        rockchip,pins = <2 GPIO_C4 RK_FUNC_1 &pcfg_pull_none>
    };
去pinctrl中加log,该pin(GPIO_C4)已经被i2s1请求到了。 请教一下,能不能获取到这个pin当前的状态呢?或者能够获取到pin的当前配置信息呢?[/quote] 最简单粗暴的方法就是把配置寄存器的内容读出来看看。先用ioremap把寄存器的物理地址映射到一个虚拟地址,然后从映射得到的虚拟地址上取值就可以了。就是需要查看下手册里的内容。
caoai3033 2017-07-19
  • 打赏
  • 举报
回复
引用 9 楼 jklinux 的回复:
[quote=引用 8 楼 caoai3033 的回复:] [quote=引用 2 楼 jklinux 的回复:] 里面的io口如配置成i2c接口,这些io口就会被i2c控制器接管。当通过控制器发数据时,控制器会自动控制io口的电平,当接收数据时,控制器会自动判断电平
我现在遇到了一个具体的问题: 使用的I2S接口的PCM功能。 使用I2S接口外接6mic的阵列,目标是获得6路mic数据,6个mic两两一组连接在i2s的sdi、sdio1、sdio2三个pin上。 在调试后,但是最后只能得到 sdi 这一个pin上的两路mic数据。 调查时使用示波器测量sdio1、sdio2上的波形,发现被拉低了,而sdi上有正常的声音信号。另外再读取I2S的控制寄存器,发现配置成 8ch 输入也成功了。时钟也确认过是正确的。 怀疑是否是pin的配置不对。pin状态被拉低又可能是什么造成的呢?pin接了地或者下拉电阻? 还有就是I2S控制器对pin的配置是否可以通过设备树或者其他方式进行修改?[/quote] 这引脚的名字“sdio”一般是sd/mmc控制器的引脚似的,是否复用了?[/quote] 这个引脚的全称是i2s1_sdio1,下边是它的设备树节点
   
    i2s1_sdio1: i2s1-sdio1{
        rockchip,pins = <2 GPIO_C4 RK_FUNC_1 &pcfg_pull_none>
    };
去pinctrl中加log,该pin(GPIO_C4)已经被i2s1请求到了。 请教一下,能不能获取到这个pin当前的状态呢?或者能够获取到pin的当前配置信息呢?
jklinux 2017-07-19
  • 打赏
  • 举报
回复
引用 8 楼 caoai3033 的回复:
[quote=引用 2 楼 jklinux 的回复:] 里面的io口如配置成i2c接口,这些io口就会被i2c控制器接管。当通过控制器发数据时,控制器会自动控制io口的电平,当接收数据时,控制器会自动判断电平
我现在遇到了一个具体的问题: 使用的I2S接口的PCM功能。 使用I2S接口外接6mic的阵列,目标是获得6路mic数据,6个mic两两一组连接在i2s的sdi、sdio1、sdio2三个pin上。 在调试后,但是最后只能得到 sdi 这一个pin上的两路mic数据。 调查时使用示波器测量sdio1、sdio2上的波形,发现被拉低了,而sdi上有正常的声音信号。另外再读取I2S的控制寄存器,发现配置成 8ch 输入也成功了。时钟也确认过是正确的。 怀疑是否是pin的配置不对。pin状态被拉低又可能是什么造成的呢?pin接了地或者下拉电阻? 还有就是I2S控制器对pin的配置是否可以通过设备树或者其他方式进行修改?[/quote] 这引脚的名字“sdio”一般是sd/mmc控制器的引脚似的,是否复用了?
caoai3033 2017-07-19
  • 打赏
  • 举报
回复
引用 2 楼 jklinux 的回复:
里面的io口如配置成i2c接口,这些io口就会被i2c控制器接管。当通过控制器发数据时,控制器会自动控制io口的电平,当接收数据时,控制器会自动判断电平
我现在遇到了一个具体的问题: 使用的I2S接口的PCM功能。 使用I2S接口外接6mic的阵列,目标是获得6路mic数据,6个mic两两一组连接在i2s的sdi、sdio1、sdio2三个pin上。 在调试后,但是最后只能得到 sdi 这一个pin上的两路mic数据。 调查时使用示波器测量sdio1、sdio2上的波形,发现被拉低了,而sdi上有正常的声音信号。另外再读取I2S的控制寄存器,发现配置成 8ch 输入也成功了。时钟也确认过是正确的。 怀疑是否是pin的配置不对。pin状态被拉低又可能是什么造成的呢?pin接了地或者下拉电阻? 还有就是I2S控制器对pin的配置是否可以通过设备树或者其他方式进行修改?
caoai3033 2017-07-19
  • 打赏
  • 举报
回复
引用 6 楼 of123 的回复:
将 Pin 配置成 I2C 主模式还是相对简单的。有几点要考虑: I2C 的引脚被认为是“开漏”输出并加上拉电阻的。如果你实现的不是 Ultra Fast-mode 单向传输,那么至少要求 SDA 是可以被从机拉低的;如果你还支持时钟延展,那么,SCL 也必须是开漏模式。 多数单片机的 Pin 脚,虽然可以配置上拉电阻(内置或外接),但多数是推拉驱动的。因此,软模拟时必须在 ACK 时钟时,将 SDA 变为高阻状态的输入模式。 如果要支持时钟延展,在可能出现延展的地方,也必须变为输入模式,通过上拉电阻维持高电平。同时,判断它是否被拉低。如果是,就要一直等待它释放为高。
我现在遇到了一个具体的问题: 使用I2S接口外接6mic的阵列,目标是获得6路mic数据,6个mic两两一组连接在i2s的sdi、sdio1、sdio2三个pin上。 在调试后,但是最后只能得到 sdi 这一个pin上的两路mic数据。使用示波器测量sdio1、sdio2上的信号波形,发现被拉低了。 怀疑是否是pin的配置不对。
of123 2017-07-19
  • 打赏
  • 举报
回复
将 Pin 配置成 I2C 主模式还是相对简单的。有几点要考虑: I2C 的引脚被认为是“开漏”输出并加上拉电阻的。如果你实现的不是 Ultra Fast-mode 单向传输,那么至少要求 SDA 是可以被从机拉低的;如果你还支持时钟延展,那么,SCL 也必须是开漏模式。 多数单片机的 Pin 脚,虽然可以配置上拉电阻(内置或外接),但多数是推拉驱动的。因此,软模拟时必须在 ACK 时钟时,将 SDA 变为高阻状态的输入模式。 如果要支持时钟延展,在可能出现延展的地方,也必须变为输入模式,通过上拉电阻维持高电平。同时,判断它是否被拉低。如果是,就要一直等待它释放为高。
caoai3033 2017-07-19
  • 打赏
  • 举报
回复
引用 3 楼 jklinux 的回复:
[quote=引用 1 楼 caoai3033 的回复:] 目前,I2S1在设备树中使用的pin group如以下格式: i2s1{ ...... i2s1_sdi: i2s1-sdi{ rockchip,pins = <2 GPIO_C3 RK_FUNC_1 &pcfg_pull_none> }; i2s1_sdio1: i2s1-sdio1{ rockchip,pins = <2 GPIO_C4 RK_FUNC_1 &pcfg_pull_none> }; ...... }; pcfg_pull_none:pcfg-pull-none{ bias-disable; }; 其中<>中的内容,知道了第一个“2”代表gpio2, GPIO_C4表示20,两者合起来代表gpio2-20,是gpio号。 那么RK_FUNC_1表示的是这个pin配置成 I2S 功能? pcfg_pull_none的设备树节点上边也给出了,对于I2S来说,pin的状态是bias-disable吗?
RK_FUNC_1可能具体查看SOC关于GPIO的配置寄存器说明才可以得知。 bias-disable应是关闭上下拉功能 [/quote] 那么是 I2S 控制器会根据pcfg_pull_none去对io口的状态进行配置的吗?
caoai3033 2017-07-19
  • 打赏
  • 举报
回复
谢谢您的回复。如果io口配置成i2c之后,io口的输入输出等电气特性就有i2c控制器去控制了吗? 设备树中有这样一个节点: › › i2c1 { › › › i2c1_xfer: i2c1-xfer { › › › › rockchip,pins = › › › › › <2 GPIO_A4 RK_FUNC_2 &pcfg_pull_none_smt>, › › › › › <2 GPIO_A5 RK_FUNC_2 &pcfg_pull_none_smt>; › › › }; › › }; 其中: › › pcfg_pull_none_smt: pcfg-pull-none-smt { › › › bias-disable; › › › input-schmitt-enable; › › }; pcfg_pull_none_smt是做什么的呢,是I2C控制器会根据这个去配置这个io口吗?
jklinux 2017-07-19
  • 打赏
  • 举报
回复
引用 1 楼 caoai3033 的回复:
目前,I2S1在设备树中使用的pin group如以下格式: i2s1{ ...... i2s1_sdi: i2s1-sdi{ rockchip,pins = <2 GPIO_C3 RK_FUNC_1 &pcfg_pull_none> }; i2s1_sdio1: i2s1-sdio1{ rockchip,pins = <2 GPIO_C4 RK_FUNC_1 &pcfg_pull_none> }; ...... }; pcfg_pull_none:pcfg-pull-none{ bias-disable; }; 其中<>中的内容,知道了第一个“2”代表gpio2, GPIO_C4表示20,两者合起来代表gpio2-20,是gpio号。 那么RK_FUNC_1表示的是这个pin配置成 I2S 功能? pcfg_pull_none的设备树节点上边也给出了,对于I2S来说,pin的状态是bias-disable吗?
RK_FUNC_1可能具体查看SOC关于GPIO的配置寄存器说明才可以得知。 bias-disable应是关闭上下拉功能
jklinux 2017-07-19
  • 打赏
  • 举报
回复
里面的io口如配置成i2c接口,这些io口就会被i2c控制器接管。当通过控制器发数据时,控制器会自动控制io口的电平,当接收数据时,控制器会自动判断电平
caoai3033 2017-07-19
  • 打赏
  • 举报
回复
目前,I2S1在设备树中使用的pin group如以下格式: i2s1{ ...... i2s1_sdi: i2s1-sdi{ rockchip,pins = <2 GPIO_C3 RK_FUNC_1 &pcfg_pull_none> }; i2s1_sdio1: i2s1-sdio1{ rockchip,pins = <2 GPIO_C4 RK_FUNC_1 &pcfg_pull_none> }; ...... }; pcfg_pull_none:pcfg-pull-none{ bias-disable; }; 其中<>中的内容,知道了第一个“2”代表gpio2, GPIO_C4表示20,两者合起来代表gpio2-20,是gpio号。 那么RK_FUNC_1表示的是这个pin配置成 I2S 功能? pcfg_pull_none的设备树节点上边也给出了,对于I2S来说,pin的状态是bias-disable吗?

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧