你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32读取两片74hc165d数据,总是读不对,求指教?

[复制链接]
月霜寒 提问时间:2017-3-17 09:16 /
unsigned char i;
  ADDR_SW_Data = 0;
  GPIO_ResetBits(GPIOC, 2);//clock_en ´ò¿ª165ѡͨ¶Ë
  GPIO_ResetBits(GPIOC, 1);//PL  //ÔËÐÐÊý¾Ý¼ÆÈë165
  delay_ms(1);
  GPIO_SetBits(GPIOC, 1);//PL //ÔÊÐíÊý¾ÝÒÆÎ»
  delay_ms(1);
  for(i=0;i<16;i++)  //¶Á16´ÎÊý¾Ý
  {
    GPIO_ResetBits(GPIOC, 0);//clock
    delay_ms(1);
   
    ADDR_SW_Data = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3) | (ADDR_SW_Data<<1);//¶ÁÊäÈëÊý¾Ýλ  
   
    GPIO_SetBits(GPIOC, 0);//clock
    delay_ms(1);
  }
  GPIO_SetBits(GPIOC, 2);//clock_en //¹Ø±Õ165ѡͨ¶Ë
  GPIO_ResetBits(GPIOC,1);//PL  //ÔËÐÐÊý¾Ý¼ÆÈë165
  
  ADDR_SW_Data  =  ~ADDR_SW_Data;      //²¦Â뿪¹ØÈ¡·´
收藏 3 评论21 发布时间:2017-3-17 09:16

举报

21个回答
月霜寒 回答时间:2017-3-17 09:17:18
这是初始化:
GPIO_InitTypeDef                 ADDR_SW_GPIO_InitStructure;
        /* GPIOD Periph clock enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);         //
        /* Configure zoom and focus pins in output pushpull mode */
        ADDR_SW_GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;//0:clock;1L;2:clock_en
        GPIO_SetBits(GPIOC, 0);//clock
        GPIO_SetBits(GPIOC, 1);//PL
        GPIO_SetBits(GPIOC, 2);//clock_en

        ADDR_SW_GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_50MHz;
        ADDR_SW_GPIO_InitStructure.GPIO_Mode                 = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö
        GPIO_Init(GPIOC, &ADDR_SW_GPIO_InitStructure);

        /* Configure SPI1 pins: MISO and MOSI */
        ADDR_SW_GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_3;//DATA_OUT       
        ADDR_SW_GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_IN_FLOATING;                //¸¡¿ÕÊäÈë
        GPIO_Init(GPIOC, &ADDR_SW_GPIO_InitStructure);       
wenyangzeng 回答时间:2017-4-5 07:32:17
本帖最后由 wenyangzeng 于 2017-4-5 10:10 编辑

这个74HC165是串行接收,每次只读入1Bit,,读出后要马上移一位
for(i=0;i<16;i++)
{
GPIO_ResetBits(GPIOC, 0);
if( GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3)
  GPIO_SetBits( ADDR_SW_Data, i);//先前变量弄错了
else
GPIO_ResetBits( ADDR_SW_Data, i);
GPIO_SetBits(GPIOC, 0);
}

补充一点:2只74HC165硬件还需要进行级连,否则只能8位8位的分别读其中1只。







评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

zhjb1 回答时间:2017-4-5 08:03:37
“板凳”那一页的代码缺少移位语句,数据只是LSB的1bit。看看是吗?
无薪税绵 回答时间:2017-4-5 08:23:36
检测口试试使用GPIO_Mode_IPU上拉输入,不要用浮空。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

ts2000 回答时间:2017-4-5 08:27:04
ADDR_SW_Data = 0;   没定义数据类型??   16位数据用 uchar 应该会出错吧。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

wenyangzeng 回答时间:2017-4-5 09:51:59
本帖最后由 wenyangzeng 于 2017-4-5 10:09 编辑
zhjb1 发表于 2017-4-5 08:03
“板凳”那一页的代码缺少移位语句,数据只是LSB的1bit。看看是吗?

GPIO_SetBits( ADDR_SW_Data, i);//先前变量弄错了
else
GPIO_ResetBits( ADDR_SW_Data, i);
i已经在移位了,74HC165自己已经根据时钟在移动其并行端口的数据到串行输出端了。

cldym 回答时间:2017-4-5 11:22:38
检测口试试使用GPIO_Mode_IPU上拉输入,不要用浮空

点评

少灌水  发表于 2017-4-11 10:55
donatello1996 回答时间:2017-4-5 13:19:05
先试试驱动一片165行不行,一片能行再驱动两片165

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

toofree 回答时间:2017-4-5 14:44:11
wenyangzeng 发表于 2017-4-5 07:32
这个74HC165是串行接收,每次只读入1Bit,,读出后要马上移一位
for(i=0;i

你这个应该用上升沿或下降沿读取吧,你用电平肯定不行呀,而且中间没有延时,循环太快太快了。你循环结束了,一个位还没完呢。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

123下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版