打印
[STM32]

求教,HEF4094两片级联,发送数据时最后一位数据丢失!

[复制链接]
586|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
原理图如下:

ST_VAV,DIN_VAV,CLK_VAV,OE_VAV接单片机,ST_1,DIN_1,CLK_1,OE_1反逻辑输出。

问题:分两次发送8位数据,两次最后发送的那一位数据丢失。
例如:(1)发送高8位0xFF,低8位0时,HEF4094输出0x007F。
(2)发送高8位0,低8位0xFF时,HEF4094输出0x7F00。

代码如下:
#define ST_4094_1 PCout(12)  //PC12
#define OE_4094_1 PDout(2)  //PD2
#define DIN_4094_1 PCout(11)  //PC11
#define CLK_4094_1 PCout(10)  //PC10
void vavle_init(void)  //初始化
{
          //初始化IO
          RCC->APB2ENR|=1<<4;     //使能PORTC时钟         控制端口PC10-12
          RCC->APB2ENR|=1<<5;     //使能PORTD时钟         控制端口PD2
       
          GPIOD->CRL&=0XFFFFF0FF;//
          GPIOD->CRL|=0X00000300;//PD2 推挽输出            
   GPIOD->ODR|=1<<2;      //PD2 输出高
          GPIOC->CRH&=0XFFF000FF;//
          GPIOC->CRH|=0X00033300;//PC10-12 推挽输出            
   GPIOC->ODR|=7<<2;      //PC10-12 输出高
       
   OE_4094_1=0;          //反逻辑
}
void TransByteTo4094_ElecExpValve1(u8 dat16_09,u8 dat08_01) //2HEF4094锁存16位数据,并行输出,dat16_098位, dat08_018位。
{
  u8 j;
  u8 i,tt;
  CLK_4094_1=1;
  ST_4094_1 =1;
  tt=dat16_09;          //先送高8
  for(i=0;i<8;i++)
  {
   j= tt &(0x01);
          if(j==1)
            { DIN_4094_1=0;}
          else
             { DIN_4094_1=1;}
  
   CLK_4094_1=1;                        //CLK引脚的上升沿把数据送入寄存器
   delay_us(10);
   CLK_4094_1=0;       
   delay_us(10);         
   tt=tt>>1;
  }
  tt= dat08_01;          //再送低8
  for(i=0;i<8;i++)
  {
    j= tt &(0x01);
   if(j==1)
            { DIN_4094_1=0;}
          else
            { DIN_4094_1=1;}
  
   CLK_4094_1=1;                        //CLK引脚的上升沿把数据送入寄存器
   delay_us(10);
   CLK_4094_1=0;       
   delay_us(10);         
   tt=tt>>1;
  }
  ST_4094_1 =1;         //ST引脚把两个寄存器的数据更新输出到HEF4094的输出引脚上并且锁存起来
  delay_us(10);
  ST_4094_1 =0;
  delay_us(10);
  CLK_4094_1=1;   //CLK拉低,抗干扰就增强
  ST_4094_1 =1;
  DIN_4094_1=1;
}

1.png (79.28 KB )

1.png

相关帖子

沙发
airwill| | 2018-9-4 19:26 | 只看该作者
CLOCK 要上升沿进行移位,  特别关注一下你的时序. 程序就不帮你看了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

8

帖子

0

粉丝