.硬件环境:基于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;
}