This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] SN74HC165:从移位寄存器 IC 读取串行输出

Guru**** 1688460 points
Other Parts Discussed in Thread: SN74LV8154, SN74HC165
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/logic-group/logic/f/logic-forum/824383/sn74hc165-reading-serial-output-from-a-shift-register-ic

器件型号:SN74HC165
主题中讨论的其他器件:SN74LV8154

大家好!

我使用 SN74HC165移位寄存器 IC 从二进制计数器 IC (SN74LV8154)读取并行输出数据。 如何从该 IC 读取串行数据输出? 是通过 RX 引脚实现的吗?

谢谢、此致<
Apurv

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嘿、Apurv、

    它的串行数据也可以由 GPIO 读取、而不需要通过 RX 引脚读取数据。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、感谢您的回复。

    我们如何从 GPIO 读取串行数据?

    此致、
    Apurv

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您有足够的可用 GPIO 用于8个数据位和控制信号、则可以将'8154直接连接到您的微控制器。

    如果您想使用'165、您可以将其连接到微控制器的任何 SPI 外设(将其配置为模式1)。 您仍然需要两个 GPIO 来控制 SH/LD 和 CLK INH 引脚。 也可以手动执行、但您必须自己实施 SPI 协议。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我已经为 SN74LV8154二进制计数器 IC 编写了此代码、但它不会连续计数、它会复位为7、有时仅复位为较低的值。

    //包含文件
    #include "hL_sys_common.h"
    #include "HL_Gio.h"
    #include "hL_sci.h"
    #include "hL_het.h"
    #include

    #define GAL 2.
    #define Gau 18.
    #define GBL 16.
    #define GBU 30
    #define RCLK 14.
    #define CCLR 12.
    #define CLK 22.

    字符计数[20];

    void main()

    unsigned long freq = 0;
    uint8 b0、b1、b2、b3、b4、b5、b6、b7、b8、b9、b10、b11、b12、b13、b14、b15、b16、b17、b18、b19、b20、b21、b22、b23、b24、b25、b26、b27、b29、b29、b29、b29、b30;

    //初始化 GIO 驱动程序
    gioInit();

    //初始化 SCI 驱动程序
    sciInit();

    //初始化 HET 驱动程序
    hetInit();

    //将 HET1驱动器引脚设置为输出
    gioSetDirection (hetPORT1、0xFFFFFFFF);

    //将 GIOA 和 GIOB 驱动器引脚设置为输入
    gioSetDirection (gioPORTA、0x00000000);
    gioSetDirection (gioPORTB、0x00000000);

    //初始化寄存器
    gioSetBit (hetPORT1、GAL、1);
    gioSetBit (hetPORT1、CCLR、0);
    gioSetBit (hetPORT1、Gau、1);
    gioSetBit (hetPORT1、GBL、1);
    gioSetBit (hetPORT1、GBU、1);
    gioSetBit (hetPORT1、RCLK、0);
    gioSetBit (hetPORT1、CCLR、1);
    gioSetBit (hetPORT1、CLK、0);

    while (1)

    频率= 0;

    //设置时钟脉冲
    gioSetBit (hetPORT1、CLK、1);
    gioSetBit (hetPORT1、CLK、0);

    //设置 RCLK 脉冲
    gioSetBit (hetPORT1、RCLK、1);
    gioSetBit (hetPORT1、RCLK、0);

    //读取 GBU 字节
    gioSetBit (hetPORT1、GBU、0);

    //读取位
    B31 = gioGetBit (gioPORTB、3);
    FREQ = FREQ|B31;
    频率<=1;
    B30 = gioGetBit (gioPORTB、2);
    FREQ = FREQ|B30;
    频率<=1;
    B29 = gioGetBit (gioPORTA、7);
    FREQ = FREQ|B29;
    频率<=1;
    B28 = gioGetBit (gioPORTA、6);
    FREQ = FREQ|B28;
    频率<=1;
    B27 = gioGetBit (gioPORTA、5);
    FREQ = FREQ|B27;
    频率<=1;
    B26 = gioGetBit (gioPORTA、2);
    FREQ = FREQ|B26;
    频率<=1;
    B25 = gioGetBit (gioPORTA、1);
    FREQ = FREQ|B25;
    频率<=1;
    B24 = gioGetBit (gioPORTA、0);
    FREQ = FREQ|B24;
    频率<=1;

    //再次将 GBU 设置为高电平
    gioSetBit (hetPORT1、GBU、1);


    //读取 GBL 字节
    gioSetBit (hetPORT1、GBL、0);

    //读取位
    B23 = gioGetBit (gioPORTB、3);
    FREQ = FREQ|B23;
    频率<=1;
    B22 = gioGetBit (gioPORTB、2);
    FREQ = FREQ|B22;
    频率<=1;
    B21 = gioGetBit (gioPORTA、7);
    FREQ = FREQ|B21;
    频率<=1;
    B20 = gioGetBit (gioPORTA、6);
    FREQ = FREQ|B20;
    频率<=1;
    B19 = gioGetBit (gioPORTA、5);
    FREQ = FREQ|B19;
    频率<=1;
    B18 = gioGetBit (gioPORTA、2);
    FREQ = FREQ|B18;
    频率<=1;
    B17 = gioGetBit (gioPORTA、1);
    FREQ = FREQ|B17;
    频率<=1;
    B16 = gioGetBit (gioPORTA、0);
    FREQ = FREQ|B16;
    频率<=1;

    //再次将 GBL 设置为高电平
    gioSetBit (hetPORT1、GBL、1);


    //读取 Gau 字节
    gioSetBit (hetPORT1、Gau、0);

    //读取位
    B15 = gioGetBit (gioPORTB、3);
    FREQ = FREQ|B15;
    频率<=1;
    b14 = gioGetBit (gioPORTB、2);
    FREQ = FREQ|B14;
    频率<=1;
    B13 = gioGetBit (gioPORTA、7);
    FREQ = FREQ|B13;
    频率<=1;
    B12 = gioGetBit (gioPORTA、6);
    FREQ = FREQ|B12;
    频率<=1;
    B11 = gioGetBit (gioPORTA、5);
    FREQ = FREQ|B11;
    频率<=1;
    B10 = gioGetBit (gioPORTA、2);
    FREQ = FREQ|B10;
    频率<=1;
    B9 = gioGetBit (gioPORTA、1);
    FREQ = freq|b9;
    频率<=1;
    B8 = gioGetBit (gioPORTA、0);
    FREQ = FREQ|B8;
    频率<=1;

    //再次将 Gau 设置为高电平
    gioSetBit (hetPORT1、Gau、1);


    //读取 GAL 字节
    gioSetBit (hetPORT1、GAL、0);

    //读取位
    b7 = gioGetBit (gioPORTB、3);
    FREQ = FREQ|B7;
    频率<=1;
    B6 = gioGetBit (gioPORTB、2);
    FREQ = FREQ|B6;
    频率<=1;
    B5 = gioGetBit (gioPORTA、7);
    频率= freq|B5;
    频率<=1;
    B4 = gioGetBit (gioPORTA、6);
    FREQ = freq|b4;
    频率<=1;
    B3 = gioGetBit (gioPORTA、5);
    FREQ = FREQ|B3;
    频率<=1;
    B2 = gioGetBit (gioPORTA、2);
    FREQ = FREQ|B2;
    频率<=1;
    B1 = gioGetBit (gioPORTA、1);
    频率= freq|b1;
    频率<=1;
    B0 = gioGetBit (gioPORTA、0);
    FREQ = freq|b0;

    //再次将 GAL 设置为高电平
    gioSetBit (hetPORT1、GAL、1);

    printf ("%d\r\n"、freq);

     

    我哪里出错了?

    此致、
    Apurv

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Apurv、

    遗憾的是、我们不会在此论坛中调试代码。 如果 Clemens 可用于此目的、则没关系、但我需要原理图和示波器截图、以显示器件未按您预期的方式工作。 这将提供更多信息、以查看器件是否已损坏或实施是否存在问题。 如果您能够提供这些内容、我将能够为您提供进一步的支持。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我对您使用的微控制器一无所知、因此我不能对您的代码说任何话。

    但是、您的描述("重置为7或有时重置为较低的值")听起来好像时钟或清除输入有问题。 为此、需要提供原理图和示波器/逻辑分析仪快照。