场景是用stm32与一款温湿度传感器通信,不过是基于SDI-12协议,SDI-12时序和UART类似,故采用UART传输,原理图如下
其中DIR_OUT_SDI是一个IO引脚,控制UART_TX_SDI是否使能,U10是三态门IC,即拉低DIR_OUT_SDI使能stm32输出,拉高DIR_OUT_SDI失能输出,串口配置8位数据位,偶校验,1位停止位,1200波特率。
下面给出发送一个激活命令的示例:
#define SDI_BREAK_TIME 13
#define SDI_BREAK_QUIET_TIME 20
//@brief 发送确认激活命令
//@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); //失能