月霜寒 发表于 2017-3-17 09:16:48

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

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;      //²¦Â뿪¹ØÈ¡·´

月霜寒 发表于 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;1:PL;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只。







zhjb1 发表于 2017-4-5 08:03:37

“板凳”那一页的代码缺少移位语句,数据只是LSB的1bit。看看是吗?

无薪税绵 发表于 2017-4-5 08:23:36

检测口试试使用GPIO_Mode_IPU上拉输入,不要用浮空。

ts2000 发表于 2017-4-5 08:27:04

ADDR_SW_Data = 0;   没定义数据类型??   16位数据用 uchar 应该会出错吧。

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上拉输入,不要用浮空

donatello1996 发表于 2017-4-5 13:19:05

先试试驱动一片165行不行,一片能行再驱动两片165

toofree 发表于 2017-4-5 14:44:11

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

你这个应该用上升沿或下降沿读取吧,你用电平肯定不行呀,而且中间没有延时,循环太快太快了。你循环结束了,一个位还没完呢。
页: [1] 2 3
查看完整版本: stm32读取两片74hc165d数据,总是读不对,求指教?