基於STM32F103的 AD模組HX710A除錯日誌
阿新 • • 發佈:2018-11-15
.硬體環境:基於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; }