標(biāo)識(shí)設(shè)計(jì)廠家珠海百度搜索排名優(yōu)化
場(chǎng)景是用stm32與一款溫濕度傳感器通信,不過(guò)是基于SDI-12協(xié)議,SDI-12時(shí)序和UART類似,故采用UART傳輸,原理圖如下
其中DIR_OUT_SDI是一個(gè)IO引腳,控制UART_TX_SDI是否使能,U10是三態(tài)門IC,即拉低DIR_OUT_SDI使能stm32輸出,拉高DIR_OUT_SDI失能輸出,串口配置8位數(shù)據(jù)位,偶校驗(yàn),1位停止位,1200波特率。
下面給出發(fā)送一個(gè)激活命令的示例:
#define SDI_BREAK_TIME 13
#define SDI_BREAK_QUIET_TIME 20//@brief 發(fā)送確認(rèn)激活命令
//@param addr 傳感器地址 ascii碼 低7位有效
void sdi12SendAckActive(uint8_t addr)
{uint8_t cmd[]={'0'+addr,'!'};switchToIoConfig();HAL_GPIO_WritePin(SDI_DIR_GPIO_Port,SDI_DIR_Pin,GPIO_PIN_RESET); //使能 SDI_OUT_PIN 輸出sdi12SendBreak();switchToUartConfig();//HAL_UART_AbortReceive(&huart3);HAL_UART_Transmit(&huart3,cmd,2,0xFFFF);HAL_GPIO_WritePin(SDI_DIR_GPIO_Port,SDI_DIR_Pin,GPIO_PIN_SET); //失能 SDI_OUT_PIN 輸出g_SdiReceiveMessage.receiveFlag=0;g_SdiReceiveMessage.messageTop =0;HAL_UART_Receive_IT(&huart3, g_SdiReceiveMessage.message, 1);return;
}//@brief 將tx引腳配置為輸出模式,作輸出喚醒信號(hào)使用
void switchToIoConfig()
{GPIO_InitTypeDef GPIO_InitStruct={0};/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(SDI_OUT_PORT, SDI_OUT_PIN, GPIO_PIN_SET);/*Configure GPIO pin : SPI_DIR_Pin */GPIO_InitStruct.Pin = SDI_OUT_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(SDI_OUT_PORT, &GPIO_InitStruct);return;
}//@brief 發(fā)送喚醒信號(hào)
void sdi12SendBreak()
{HAL_GPIO_WritePin(SDI_OUT_PORT,SDI_OUT_PIN,GPIO_PIN_RESET);HAL_Delay(SDI_BREAK_TIME);HAL_GPIO_WritePin(SDI_OUT_PORT,SDI_OUT_PIN,GPIO_PIN_SET);HAL_Delay(SDI_BREAK_QUIET_TIME);
}//@brief 將tx引腳配置為復(fù)用模式,作串口輸出使用
void switchToUartConfig()
{GPIO_InitTypeDef GPIO_InitStruct={0};/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(SDI_OUT_PORT, SDI_OUT_PIN, GPIO_PIN_SET);GPIO_InitStruct.Pin = SDI_OUT_PIN;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF7_USART3;HAL_GPIO_Init(SDI_OUT_PORT, &GPIO_InitStruct);return;
}
示波器測(cè)試得到傳感器的應(yīng)答信號(hào)如下:第一個(gè)是喚醒信號(hào),拉高電平13毫秒,之后保持20毫秒低電平,第二個(gè)數(shù)據(jù)幀是激活信號(hào),即ascii碼:? "0!",第三個(gè)是傳感器的應(yīng)答信號(hào):"0\r\n"