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; //²¦Â뿪¹ØÈ¡·´
这是初始化:
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 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只。
“板凳”那一页的代码缺少移位语句,数据只是LSB的1bit。看看是吗? 检测口试试使用GPIO_Mode_IPU上拉输入,不要用浮空。 ADDR_SW_Data = 0; 没定义数据类型?? 16位数据用 uchar 应该会出错吧。 本帖最后由 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自己已经根据时钟在移动其并行端口的数据到串行输出端了。
检测口试试使用GPIO_Mode_IPU上拉输入,不要用浮空 先试试驱动一片165行不行,一片能行再驱动两片165 wenyangzeng 发表于 2017-4-5 07:32
这个74HC165是串行接收,每次只读入1Bit,,读出后要马上移一位
for(i=0;i
你这个应该用上升沿或下降沿读取吧,你用电平肯定不行呀,而且中间没有延时,循环太快太快了。你循环结束了,一个位还没完呢。