723|21

58

帖子

0

资源

一粒金砂(中级)

小白求问:MAX7317如何读取P9~p0的电平 [复制链接]

 

    或许有人接触过MAX7317?

    这些天我在试着给MAX7317的某一引脚输出高电平,欧很不幸它们好像只能开漏输出,不知道有没有办法输出弱电流。在探究过程中,想要用DOUT输出P9~p0的电平,但是我们怎么设,用万用表测出来的电平和DOUT输出的数据都不等

    我也逐字逐句看了数据手册,就是搞不懂怎么正确读取电平,希望能有前辈指点迷津,非常感谢

 

image.png


回复

1万

帖子

143

资源

版主

开漏输出型IO需要对电源加上拉电阻,这么设计的目的是为了长线传输和实现多种电平的匹配。

点评

感谢回复 主要是现在几块板子都已经定型了,想要用的引脚没有加上拉电阻,如果要改版的话工作量会比较大(不过我现在也差不多认了),就想解决一下读取电平的问题  详情 回复 发表于 2020-10-23 16:30
个人签名上传了一些书籍资料,也许有你想要的:http://download.eeworld.com.cn/user/chunyang

回复

58

帖子

0

资源

一粒金砂(中级)

本帖最后由 luaffy 于 2020-10-23 16:40 编辑

我可能是哪里理解错了

读取函数如下——

 

uint8_t MAX7317RxData[16];
void MAX7317_Read( unsigned char code, unsigned int data )        //形参data不用在意
{
  unsigned char temp = code;
  
  MAX7317_CLK_LOW();
  MAX7317_CS_LOW();
  
//send A15                                ->拉高 读取模式
  MAX7317_TX_HIGH();
  MAX7317_CLK_HIGH();
  MAX7317_CLK_LOW();
  //send A14~A8
  for ( unsigned char i = 0; i < 7; i++ ) 
  {
    if ( (code & 0x40) == 0 ) 
    {
      MAX7317_TX_LOW();
    }
    else 
    {
      MAX7317_TX_HIGH();
    }
    MAX7317_CLK_HIGH();
    MAX7317_CLK_LOW();
    code = (code << 1);
  }
  //send D7~D0
  for ( unsigned char i = 0; i < 8; i++ ) 
  {
    if ( (data & 0x80) == 0 )
    {
      MAX7317_TX_LOW();
    }
    else
    {
      MAX7317_TX_HIGH();
    }
    MAX7317_CLK_HIGH();
    MAX7317_CLK_LOW();
    data = (data << 1);
  }

  MAX7317_CS_HIGH();
  MAX7317_CLK_LOW();  
  MAX7317_CS_LOW();


  for ( unsigned char i = 0; i < 16; i++ ) 
  {

    __delay_cycles(16);
    MAX7317_CLK_HIGH();
    MAX7317_CLK_LOW();
    MAX7317RxData = MAX7317_RX1();
  }
  
  //---------检查DOUT比特流--------------
//  MAX7317_CLK_LOW();
//  MAX7317_CS_LOW();
//  
////send A15                                ->拉高 读取模式
//  MAX7317_TX_HIGH();
//  MAX7317_CLK_HIGH();
//  MAX7317_CLK_LOW();
//  //send A14~A8
//  for ( unsigned char i = 0; i < 7; i++ ) 
//  {
//    if ( (temp & 0x40) == 0 ) 
//    {
//      MAX7317_TX_LOW();
//    }
//    else 
//    {
//      MAX7317_TX_HIGH();
//    }
//    MAX7317_CLK_HIGH();
//    MAX7317_CLK_LOW();
//    temp = (temp << 1);
//  }
//  //send D7~D0
//  for ( unsigned char i = 0; i < 8; i++ ) 
//  {
//    if ( (data & 0x80) == 0 )
//    {
//      MAX7317_TX_LOW();
//    }
//    else
//    {
//      MAX7317_TX_HIGH();
//    }
//    MAX7317_CLK_HIGH();
//    MAX7317_CLK_LOW();
//    data = (data << 1);
//  }
//   MAX7317_CS_HIGH();
//  MAX7317_CLK_LOW();  
//  MAX7317_CS_LOW();


//  for ( unsigned char i = 0; i < 16; i++ ) 
//  {

//   __delay_cycles(16);

//   MAX7317_CLK_HIGH();
//    MAX7317_CLK_LOW();
//    MAX7317RxData = MAX7317_RX1();
//  }

}


回复

58

帖子

0

资源

一粒金砂(中级)

chunyang 发表于 2020-10-23 16:21 开漏输出型IO需要对电源加上拉电阻,这么设计的目的是为了长线传输和实现多种电平的匹配。

感谢回复

主要是现在几块板子都已经定型了,想要用的引脚没有加上拉电阻,如果要改版的话工作量会比较大(不过我现在也差不多认了),就想解决一下读取电平的问题

点评

自己在板子上用有脚电阻加就是,没什么难度,且未必需要加在芯片旁边,找方便的地方下手就是。  详情 回复 发表于 2020-10-23 16:51

回复

3346

帖子

1

资源

版主

本帖最后由 damiaa 于 2020-10-23 23:38 编辑

延时好像不需要。资料上都是纳秒级的。A15  其实可以合并一起发的。没必要单独。

 

  

点评

谢谢指导,我下周一跑跑看  详情 回复 发表于 2020-10-23 19:15

回复

1万

帖子

143

资源

版主

luaffy 发表于 2020-10-23 16:30 感谢回复 主要是现在几块板子都已经定型了,想要用的引脚没有加上拉电阻,如果要改版的话工作量会比较 ...

自己在板子上用有脚电阻加就是,没什么难度,且未必需要加在芯片旁边,找方便的地方下手就是。

点评

啊...是商业用的板子  详情 回复 发表于 2020-10-23 17:01
个人签名上传了一些书籍资料,也许有你想要的:http://download.eeworld.com.cn/user/chunyang

回复

58

帖子

0

资源

一粒金砂(中级)

chunyang 发表于 2020-10-23 16:51 自己在板子上用有脚电阻加就是,没什么难度,且未必需要加在芯片旁边,找方便的地方下手就是。

啊...是商业用的板子

点评

任何板子都可以临时加元件。  详情 回复 发表于 2020-10-23 17:03

回复

1万

帖子

143

资源

版主

luaffy 发表于 2020-10-23 17:01 啊...是商业用的板子

任何板子都可以临时加元件。

点评

确实,可惜这么多板子加元件的话还是会令硬件部老大哥头疼的  详情 回复 发表于 2020-10-23 17:26
个人签名上传了一些书籍资料,也许有你想要的:http://download.eeworld.com.cn/user/chunyang

回复

58

帖子

0

资源

一粒金砂(中级)

刚刚有位前辈提了修改意见并附上了程序代码,由于和师傅在调试另一块板子耽搁了回复...没记住ID,我非常抱歉

谢谢前辈的意见,我没有加延时没有考虑到SPI时钟是我的失误,后面我加上了,还是没有读到正确的电平


回复

1万

帖子

143

资源

版主

另外注意,输入、输出是两个概念。7317是IO扩展片,做输出时必须加上拉电阻,或者将负载接在输出与电源间。做输入时,输入端则必须接入确定电平,不可悬空读取。芯片的操作就是SPI接口,按SPI的规范操作就是,应没什么难度。

点评

谢谢前辈的耐心指导。- () 刚刚我又确认了一下,我们都认了要加电阻了,但是我必须搞出读取电平  详情 回复 发表于 2020-10-23 17:33
个人签名上传了一些书籍资料,也许有你想要的:http://download.eeworld.com.cn/user/chunyang

回复

58

帖子

0

资源

一粒金砂(中级)

chunyang 发表于 2020-10-23 17:03 任何板子都可以临时加元件。

确实,可惜这么多板子加元件的话还是会令硬件部老大哥头疼的

点评

你应先调通一块板子再说其它。  详情 回复 发表于 2020-10-23 17:27

回复

1万

帖子

143

资源

版主

luaffy 发表于 2020-10-23 17:26 确实,可惜这么多板子加元件的话还是会令硬件部老大哥头疼的

你应先调通一块板子再说其它。

个人签名上传了一些书籍资料,也许有你想要的:http://download.eeworld.com.cn/user/chunyang

回复

58

帖子

0

资源

一粒金砂(中级)

chunyang 发表于 2020-10-23 17:25 另外注意,输入、输出是两个概念。7317是IO扩展片,做输出时必须加上拉电阻,或者将负载接在输出与电源间。 ...

谢谢前辈的耐心指导。- () 刚刚我又确认了一下,我们都认了要加电阻了,但是我必须搞出读取电平

点评

读取首先要搞清楚SPI接口的时序,然后就是对读出位的处理了,是纯粹的软件问题,与加上拉电阻无关。  详情 回复 发表于 2020-10-23 23:49

回复

58

帖子

0

资源

一粒金砂(中级)

damiaa 发表于 2020-10-23 16:33 前面发了读写位哦。要不要考虑一下每发一位后延时  芯片SPI时钟不一定有你单片机发的快。A15  其 ...

谢谢指导,我下周一跑跑看


回复

1万

帖子

143

资源

版主

luaffy 发表于 2020-10-23 17:33 谢谢前辈的耐心指导。- () 刚刚我又确认了一下,我们都认了要加电阻了,但是我必须搞出读取电平

读取首先要搞清楚SPI接口的时序,然后就是对读出位的处理了,是纯粹的软件问题,与加上拉电阻无关。

点评

我好像遗漏了什么重要信息 我要读的IO是已经设置成输出状态了,网上查了一下,有这种解答“在设置成输出的状态下,“每个APB2时钟IO引脚上的数据都会被采集到输入寄存器中”这话没错。但要想有效  详情 回复 发表于 2020-10-26 10:38
个人签名上传了一些书籍资料,也许有你想要的:http://download.eeworld.com.cn/user/chunyang

回复

58

帖子

0

资源

一粒金砂(中级)

本帖最后由 luaffy 于 2020-10-26 10:49 编辑
chunyang 发表于 2020-10-23 23:49 读取首先要搞清楚SPI接口的时序,然后就是对读出位的处理了,是纯粹的软件问题,与加上拉电阻无关。

我好像遗漏了什么重要信息

我要读的IO是已经设置成输出状态了,网上查了一下,有这种解答“在设置成输出的状态下,“每个APB2时钟IO引脚上的数据都会被采集到输入寄存器中”这话没错。但要想有效读取IO口状态,只有在开漏输出状态(并且要保证上次输出是1,有点“欲读先写”之意,以保证IO口能反映外部电路电平变化),这样读到的才是外部IO状态。

是不是MAX7317读取输出IO,需要“保证上次输出是1”,但推挽输出要输出1,还是要加上拉电阻才能读取?而且浮空引脚不能读取?恒输出0的引脚不能读取?

image.png

(简单画了一下示意图)

点评

MAX7317的输出是带锁存的,这当然要求IO在输入输出复用时必须先写入逻辑1,否则锁存会导致输出为0时的读取恒为0。这里不存在什么推挽输出的情形,7317是开漏输出的。对于你的电路示意,无需加额外的上拉电阻,因为IO  详情 回复 发表于 2020-10-26 11:42

回复

1万

帖子

143

资源

版主

luaffy 发表于 2020-10-26 10:38 chunyang 发表于 2020-10-23 23:49 读取首先要搞清楚SPI接口的时序,然后就是对读出位的处理了,是纯粹的 ...

MAX7317的输出是带锁存的,这当然要求IO在输入输出复用时必须先写入逻辑1,否则锁存会导致输出为0时的读取恒为0。这里不存在什么推挽输出的情形,7317是开漏输出的。对于你的电路示意,无需加额外的上拉电阻,因为IO接的是LED,而要让LED能够工作,必须接在IO与电源之间,故而LED及其限流电阻将构成上拉。不过显然,你的电路是单输出用的,为何还要读入?读入的数据不管是否正确都无意义。如果只是读取P9,那你根本不用管P0-P8,P9接入前级输出使其有个确定电平即可。

点评

谢谢大佬那我试试看 (“推挽输出”是我手快打错了 那几个引脚一部分接到了DAC,一部分是蜂鸣器和LED,为了表示输出方向我简单地表示为LED)  详情 回复 发表于 2020-10-26 12:11
个人签名上传了一些书籍资料,也许有你想要的:http://download.eeworld.com.cn/user/chunyang

回复

58

帖子

0

资源

一粒金砂(中级)

啊...我有点乱

又查了一下,开漏输出的没有内部上拉电阻,但准双向口和真双向口的区别是有无内部上拉,那只能开漏输出的IO是真双向口

image.png 而真双向IO可直接读入读出

image.png image.png

 

所以“在设置成输出的状态下,“每个APB2时钟IO引脚上的数据都会被采集到输入寄存器中”这话没错。但要想有效读取IO口状态,只有在开漏输出状态(并且要保证上次输出是1,有点“欲读先写”之意,以保证IO口能反映外部电路电平变化),这样读到的才是外部IO状态。”是指准IO口设置成开漏输出的时候,保证上次输出是1才能读取准IO状态?

那真双向IO即使在开漏输出时,可任意读取外部IO状态?

image.png
image.png

点评

理解错误,没有什么真不真的双向口,只有哪个更方便。最方便的是弱上拉型IO,所以也是通常MCU上电后默认的IO模式。  详情 回复 发表于 2020-10-26 13:27

回复

58

帖子

0

资源

一粒金砂(中级)

chunyang 发表于 2020-10-26 11:42 MAX7317的输出是带锁存的,这当然要求IO在输入输出复用时必须先写入逻辑1,否则锁存会导致输出为0时的读 ...

谢谢大佬那我试试看

(“推挽输出”是我手快打错了

那几个引脚一部分接到了DAC,一部分是蜂鸣器和LED,为了表示输出方向我简单地表示为LED)

点评

你应该给出详细的电路图。  详情 回复 发表于 2020-10-26 13:24

回复

1万

帖子

143

资源

版主

luaffy 发表于 2020-10-26 12:11 谢谢大佬那我试试看 (“推挽输出”是我手快打错了 那几个引脚一部分接到了DAC,一部分 ...

你应该给出详细的电路图。

点评

前辈,我来交作业啦 下面是我“差一步美满”的波形图 [attachimg]509913[/attachimg] 造成我前期没读到正确的IO电平的原因有两个: 1、系统初始化后没有先写IO电平就读了。 需要先写引脚,  详情 回复 发表于 2020-11-9 14:31
个人签名上传了一些书籍资料,也许有你想要的:http://download.eeworld.com.cn/user/chunyang

回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/5 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表