stm32读取两片74hc165d数据不正确

2019-07-14 14: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;      //²¦Â뿪¹ØÈ¡·´
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
18条回答
lunkcer
2019-07-16 01:22
#include "74HC165D.h"
#include "delay.h"
#include "485test.h"

unsigned int ADDR_SW_Data,HC=0;

void ADDR_SW_Init(void)//74HC165D各引脚初始化
{
        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, GPIO_Pin_0);//clock
        GPIO_SetBits(GPIOC, GPIO_Pin_1);//PL
        GPIO_SetBits(GPIOC, GPIO_Pin_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);       
}

void read_ADDR_SW(void)//读取74HC165D函数值
{
                unsigned char i;
                ADDR_SW_Data        =        0;

                GPIO_ResetBits(GPIOC, GPIO_Pin_2);//clock_en                //打开165选通端
                GPIO_ResetBits(GPIOC, GPIO_Pin_1);        //运行数据计入165
                delay_ms(1);
                GPIO_SetBits(GPIOC, GPIO_Pin_1);        //允许数据移位
       
                for(i=0;i<16;i++)                //读16次数据
                {
                                GPIO_ResetBits(GPIOC, GPIO_Pin_0);
                                delay_ms(1);
                                ADDR_SW_Data        =        GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3)        | (ADDR_SW_Data<<1);                       
                                GPIO_SetBits(GPIOC, GPIO_Pin_0);
                                delay_ms(1);
                }

                GPIO_SetBits(GPIOC, GPIO_Pin_2);        //关闭165选通端
                GPIO_ResetBits(GPIOC, GPIO_Pin_1);        //运行数据计入165
               
                ADDR_SW_Data                =                ~ADDR_SW_Data;                                                //拨码开关取反
                //PT_currentaddr        =                ADDR_SW_Data        &        0x00ff;                //拨码开关低8位为地址
               
                switch((ADDR_SW_Data        >>        8)        &        0x0003)                                //拨码开关高8位为波特率设置,低2位为波特率设置位
    {
        case 0x0000 :
        {
                                                //current_BautRate                         = 2400;
                                                USART_SendData(USART1, 1);
                                                while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//检测发送状态寄存器
                                                break ;
                                }
        case 0x0001 :
        {
                                                //current_BautRate                         = 4800;
                                                USART_SendData(USART1, 2);
                                                while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//检测发送状态寄存器
                                                break ;
                                }
        case 0x0002 :
        {
                                                //current_BautRate                         = 9600;
                                                USART_SendData(USART1,3);
                                                while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//检测发送状态寄存器
                                                break ;
                                }
        case 0x0003 :
        {
                                                //current_BautRate                         = 19200;
                                                USART_SendData(USART1, 4);
                                                while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//检测发送状态寄存器
                                                break ;
                                }
        default :       
                                                //current_BautRate                         = 2400;       
                                        {USART_SendData(USART1, 1);
                                        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//检测发送状态寄存器
                                        }
        break ;
                }
               
}

一周热门 更多>