基于STM32F103的 AD模块HX710A调试日志

.硬件环境:基于STM32F103RET6高精度电子秤

通过HX710A获取称重传感器的码值:


void Ad_SCK_Set(uint8_t sel,  uint8_t st)
{
    if(st == HIGH)
    {
        GPIO_SetBits(Ad_Cfg[sel].SCK.Port, Ad_Cfg[sel].SCK.Pin);
    }
    else
    {
        GPIO_ResetBits(Ad_Cfg[sel].SCK.Port, Ad_Cfg[sel].SCK.Pin);
    }
}


uint8_t Ad_SDO_Get(uint8_t sel)
{
    return GPIO_ReadInputDataBit(Ad_Cfg[sel].SDO.Port, Ad_Cfg[sel].SDO.Pin);
}


uint8_t  Ad_Chip_Init(uint8_t  *err)
{
    uint8_t  i, j;
    GPIO_InitTypeDef GPIO_InitStructure;

    /*SCK*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /*SDO*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);



    Ad_Cfg[AD1].SCK.Port = GPIOA;
    Ad_Cfg[AD1].SCK.Pin = GPIO_Pin_12;
    Ad_Cfg[AD1].SDO.Port = GPIOA;
    Ad_Cfg[AD1].SDO.Pin = GPIO_Pin_11;

    *err = 0;
    for(i = 0; i < 1; i++)
    {
        GPIO_SetBits(Ad_Cfg[i].SDO.Port, Ad_Cfg[i].SDO.Pin);  //将sdo拉高,检测芯片是否工作
        Ad_SCK_Set(i, LOW);

        for(j = 0; j < 10; j++)
        {
            if(Ad_SDO_Get(i) == LOW)
                break;
            DelayUs(100 * 1000);
        }

        if(j >= 10)
        {
            //Ad_PWR_Set(i, OFF);
            *err |= 1 << i;
        }

    }
    if(*err == 0)
        return TRUE;
    else
        return FALSE;
}


/*****************************************************************************
函数名称: Ad_Data_Read
函数功能: 获取内码
入口参数: 无
出口参数: 内码值
备注:
 *******************************************************************************/
uint32_t  Ad_Data_Read(uint8_t sel)
{
    uint8_t  i;
    uint32_t  u32AdValue = 0;
    sel = 0;

    GPIO_SetBits(Ad_Cfg[sel].SDO.Port, Ad_Cfg[sel].SDO.Pin);
    Ad_SCK_Set(sel, LOW);

    while (Ad_SDO_Get(sel));
    DelayUs(1);
    for (i = 0; i < 24; i++)
    {
        Ad_SCK_Set(sel, HIGH);
        DelayUs(2);
        u32AdValue <<= 1;
        Ad_SCK_Set(sel, LOW);
        DelayUs(2);
        if(Ad_SDO_Get(sel))
        {
            u32AdValue++;
        }
    }

    Ad_SCK_Set(sel, HIGH);
    DelayUs(2);
    u32AdValue ^= 0x800000;
    Ad_SCK_Set(sel, LOW);
    DelayUs(2);

    Ad_SCK_Set(sel, HIGH);
    DelayUs(2);
    Ad_SCK_Set(sel, LOW);
    DelayUs(2);

    Ad_SCK_Set(sel, HIGH);
    DelayUs(2);
    Ad_SCK_Set(sel, LOW);
    DelayUs(2);

    u32AdValue >>= 4;
    u32AdValue &= 0xFFFFF; //有效位为20
    return u32AdValue;
}

猜你喜欢

转载自blog.csdn.net/ggggyj/article/details/84069552