GD32 定时器+一个IO实现SIF读取

本文档介绍了一种单线通讯协议SIF(一线通),详细阐述了其实现过程,包括定时器和GPIO口的数据读取,以及数据的校验和处理。代码示例展示了如何在GD32F103CBT6芯片上实现该协议,包括对高低电平时间的精确判断和数据帧的解析。最终,成功接收的数据通过串口发送出来。

参照下面文章,单线通讯—SIF通讯协议(一线通)案例二 作者Geek YANG,程序中有少许错误,移植过来后,有修改,比如数据的时间长度,校验方式,接收收据的处理等,最后成功实现。
注释有些没改过来。。

/*******************************************************************************
 *@时  间 : 2022-2-22
 *@摘  要 : 主程序文件
 *@芯  片 : GD32F103CBT6
 *										  -------------			
*******************************************************************************/

/*================================= Demo说明 ===================================
定时器 + 一个GPIO口进行通讯数据读取
==============================================================================*/


/* 包含的头文件 ---------------------------------------------------------------*/
#include <gd32f10x.h>
#include <gd32f103e_eval.h>
/* 宏定义 ---------------------------------------------------------------------*/
#define DATA_REV_PIN            gpio_input_bit_get(GPIOB,BIT(9))     //定义数据接收引脚(根据实际项目进行更改)

#define LOW                     0       //低电平
#define HIGH                    1       //高电平

#define SYNC_L_TIME_NUM         1100    //同步信号低电平时间:50ms = 50000us / 50us = 1000
#define SYNC_H_TIME_NUM_MIN     8      //同步信号高电平最小时间:500-100us = 400us / 50us = 8  
#define SYNC_H_TIME_NUM_MAX     12     //同步信号高电平最大时间:500+100us = 600us / 50us = 12

#define SHORT_TIME_NUM_MIN      9     //一个逻辑周期中短的时间最小值:500-50us = 450us / 50us = 9
#define SHORT_TIME_NUM_MAX      11    //一个逻辑周期中短的时间最大值:500+50us = 550us / 50us = 11

#define LONG_TIME_NUM_MIN       18    //一个逻辑周期中长的时间最小值:1ms-100us = 900us / 50us = 18
#define LONG_TIME_NUM_MAX       22    //一个逻辑周期中长的时间最大值:1ms+100us = 1100us / 50us = 22

#define LOGIC_CYCLE_NUM_MIN     26    //一个逻辑周期最小时间:1.5ms-200us = 1300us / 50us = 26
#define LOGIC_CYCLE_NUM_MAX     34    //一个逻辑周期最大时间:1.5ms+200us = 1700us / 50us = 34

#define HALF_LOGIC_CYCLE_MIN    13    //一个逻辑周期的1/2最小时间:750-100us = 650us / 50us = 13
#define HALF_LOGIC_CYCLE_MAX    17    //一个逻辑周期的1/2最大时间:750+100us = 850us / 50us = 17

#define END_SIGNAL_TIME_NUM     100   //结束信号电平时间:5ms低电平 + Nms高电平,实际检测5ms低电平就行,一帧数据发送完成后检测5ms低电平就代表完成了,不发数据的时候上拉电阻拉高了

#define REV_BIT_NUM             8     //接收的bit位个数,看是按字节接收还是按字接收,1字节=8bit,1字=2字节=16bit
#define REV_DATA_NUM            12    //接收的数据个数


/* 类型定义 -------------------------------------------------------------------*/
typedef enum
{
   
   
    INITIAL_STATE=
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值