1

我正在尝试通过 CD4094B 的公共总线将数据发送到并行(非级联)74hc595。我正在发送 16 位以将前 8 位放置在 74hc595(1) 中,将第二位放置在 74hc595(2) 中。但是我在两个 74hc595 设备上都得到了相同的 8 位(10101010)。

如何发送 16 位,以便前 8 位应放在第一个 74hc595 中,第二个 8 位应放在第二个 74hc595 中?

代码:


uint8_t test[16] = {1,1,1,1,0,0,0,0,1,0,1,0,1,0,1,0};

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET); // CD4094 OE

for (int bit=0; bit<16; bit++)
{

   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);  //CD4094 STROBE

   output = test[bit] & 1;

   if (output) {

       HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET); //CD4094 DATA

   } else {

       HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); //CD4094 DATA 
   }

   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); //CD4094 CLOCK

   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);  

   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); // CD4094 STROBE

   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); // 74hc595 CLOCK

   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);  

}

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // 74hc595 OE

HAL_Delay(3000);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);

HAL_Delay(3000);

PCB原理图

4

1 回答 1

0

我认为问题可能是由应用于 CD4094 IC 的时钟周期引起的。时间t 1可能等于处理器的时钟频率。时间 t 2等于 for 循环中的迭代但不受控制的时间。检查 CD4094 的数据表以查看在数据交换期间是否保持适当的时钟周期。如果处理器时钟频率很高,请在我在下面指定的行之间等待测试时间。

在此处输入图像描述

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // CD4094:CLOCK > LOW
/* appropriate delay time should be added to this line */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);   // CD4094:CLOCK > HIGH

注意:数据表中的第三个表格描述了时钟特性。

参考
于 2022-01-01T22:59:38.340 回答