📄 +
字号:
/****************************************Copyright (c)**************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: SoftDecode.c
** Last modified Date: 2008-07-18
** Last Version: v1.0
** Description: PT2262芯片的软件解码
**
**------------------------------------------------------------------------------------------------------
** Created By: ChaiLiMing
** Created date: 2008-08-13
** Version: v1.0
** Descriptions: PA0接受无线编码信号
**
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/
/* 程序配置文件 */
#include "config.h"
/* 定义按键 */
#define KEY5 GPIO_PIN_5
/* 定义变量 */
uint8 gbRxData; /* 接受数据变量 */
uint8 gbRxAddr; /* 接受地址变量 */
uint8 gbRxDataBuf; /* 数据缓存,用来返回解码后的数据 */
uint8 gbRxAddrBuf; /* 地址缓存,用来返回解码后的地址 */
uint32 ulStart , ulStop; /* 测量低电平时的起始时间和结束时间 */
uint32 ulInterval; /* 低电平时间 */
uint8 acEnCode1[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; /* 8421编码数组 */
uint32 giRxBuf[MAX_RX]; /* 缓冲脉冲宽度,接收一个完整的数据需要24+2个单元 */
/*******************************************************************************************
**函数原形:void Go2JTAG(void)
**功能描述:防止JTAG失效程序
**参数说明:无
**返回值:无
********************************************************************************************/
void GTAG_WAIT(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); /* 使能GPIO端口B模块 */
GPIODirModeSet(GPIO_PORTB_BASE,KEY5,GPIO_DIR_MODE_IN); /* 设置PB1为输入 */
if(GPIOPinRead(GPIO_PORTB_BASE,KEY5)==0) /* 读写PB1的电平状态 */
{
while(1); /* 循环 */
}
}
/*************************************************************************************************
** 函数名称 GPIO_Init
** 函数功能 初始化GPIO口、端口方向、触发方式和中断使能。
** 输入参数 无。
** 输出参数 无。
**************************************************************************************************/
void GPIO_Init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); /* 使能GPIO PA口 */
GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_0, GPIO_DIR_MODE_IN); /* 设置PA0为输入 */
GPIOIntTypeSet(GPIO_PORTA_BASE, GPIO_PIN_0, GPIO_RISING_EDGE); /* PA0上升沿触发 */
GPIOPinIntEnable(GPIO_PORTA_BASE, GPIO_PIN_0); /* 使能PA0中断 */
IntEnable(INT_GPIOA); /* 使能PA口中断 */
IntMasterEnable(); /* 使能处理器中断 */
}
/***********************************************************************************************
**函数原形:void GPIO_Port_A_ISR(void)
**功能描述:测低电平时间,并进行解码
**参数说明:gbRxAddr和gbRxData为解码后的地址和数据存储区
**返回值: 无
************************************************************************************************/
void GPIO_Port_A_ISR(void)
{
GPIOPinIntClear(GPIO_PORTA_BASE,GPIO_PIN_0); /* 清除中断标志,重要 */
uint8 fRxStart; /* 同步码已接受标志 */
uint8 gbPtRx; /* 缓存区指针 */
uint8 bTemp; /* 将解码后的位(0或1)存于bTemp */
uint8 gbRxPos; /* 接受地址和数据位计数器 */
fRxStart = 0;
gbPtRx = 0;
gbRxPos = 0;
while(1)
{
SysTickPeriodSet(10000000UL); /* 设置SysTick计数器的周期值 */
ulStart = SysTickValueGet(); /* 读取SysTick当前值(初值) */
while(GPIOPinRead(GPIO_PORTA_BASE,GPIO_PIN_0) ); /* PA0为高电平,则等待 */
SysTickEnable(); /* 使能SysTick计数器 */
while(GPIOPinRead(GPIO_PORTA_BASE,GPIO_PIN_0) == 0);/* PA0为低电平等待,测低电平时间 */
ulStop = SysTickValueGet(); /* 读取SysTick当前值(终值) */
SysTickDisable(); /* 关闭SysTick计数器 */
ulInterval = ulStart - ulStop; /* 计算时间间隔,即低电平宽度,只有
检测低电平宽度才能得到有效同步位 */
if(ulInterval > PULSE_TIME_OUT){ /* 超时 跳出循环 */
break;
}
giRxBuf[0] = gbPtRx;
giRxBuf[gbPtRx++] = ulInterval; /* 将低电平宽度存于缓存区中 */
if(gbPtRx > MAX_RX)
gbPtRx = 1;
/* 检测低脉冲低电平时间, 用于检测同步位, 同步位长度大约为 2 ms */
if((ulInterval>SYN_MIN)&&(ulInterval<SYN_MAX)){ /* 寻找同步位 */
fRxStart = 1; /* 开始接受地址和数据标志置位 */
giRxBuf[0]=1;
giRxBuf[1]=ulInterval;
gbPtRx=2;
gbRxData = 0;
gbRxAddr = 0;
gbRxPos = 0;
}
else if(fRxStart){ /* 判断是否接受数据 */
if(((ulInterval>SHORT_MIN)&&(ulInterval<SHORT_MAX))||((ulInterval>LONG_MIN)&&(ulInterval<LONG_MAX))){
if((gbPtRx%2) == 0){ /* 接收偶数位数据,奇数位已在giRxbuf缓存中 */
/* 两次检测到的低电平宽度如果都小于中界点,bTemp为1 */
if((giRxBuf[gbPtRx-1]<PULSE_WIDE)&&(ulInterval<PULSE_WIDE)){
bTemp = 1;
}
/* 两次检测到的低电平宽度如果都大于中界点,bTemp为0 */
else if((giRxBuf[gbPtRx-1]>PULSE_WIDE)&&(ulInterval>PULSE_WIDE)){
bTemp = 0;
}
else{
fRxStart = 0; /* 收到错误脉冲,退出中断,等待下次同步 */
break;
}
if(gbRxPos < 8){ /* gbRxPos小于8为地址信号 */
if(bTemp == 1) /* 如果发送的相应地址为1,将1存于相应的gbRxAddr中 */
gbRxAddr+=acEnCode1[gbRxPos];
}
else{
if(bTemp==1) /* 将发送的数据位存于gbRxData中 */
gbRxData+=acEnCode1[gbRxPos-8];
}
if(++gbRxPos>=12){ /* gbRxPos>=12接受完成 */
gbRxDataBuf = gbRxData; /* 返回解码后数据,根据数据值可执行不同代码 */
gbRxAddrBuf = gbRxAddr; /* 返回解码后地址,根据地址值可执行不同代码 */
gbRxPos=0; /* 接受地址和数据计数器清零 */
fRxStart=0; /* 重新开始同步 */
// GPIOPinIntDisable(GPIO_PORTA_BASE, GPIO_PIN_0); /* 禁止PA0中断 */
break;
}
}
}
else{
fRxStart=0;
break; /* 收到错误脉冲,退出中断,等待下次同步 */
}
}
}
}
/***********************************************************************************************
**函数原形:int main(void)
**功能描述:设置时钟,初始化GPIO口,等待中断
**参数说明:无
**返回值: 无
************************************************************************************************/
int main(void)
{
GTAG_WAIT(); /* 防止GATG失效 */
SysCtlClockSet( SYSCTL_SYSDIV_20 | SYSCTL_USE_PLL |
SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); /* 设置系统时钟,系统工作在10M */
GPIO_Init(); /* 初始化PA0口 */
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -