📄 7960.c
字号:
#include "include.h"
//*************************************************************************************************
// 功能描述 : 初始化I/O
// 输入参数 : 无
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void InitPort(void)
{
EnableSet;
TRFDirOUT; // 设置并口输出0
TRFFunc;
TRFWrite = 0x00; //
clkOFF;
clkPINset; // CLK 输出
irqPINset;
irqEDGEset; // IRQ上升沿中断
LEDallOFF;
LEDportSET;
LEDpowerON;
OOKdirIN; // 设置OOK 端口
}
//*************************************************************************************************
// 功能描述 : 简单结束并口通信
// 输入参数 : 无
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void STOPcondition(void)
{
TRFWrite |= 0x80;
clkON;
TRFWrite = 0x00;
clkOFF;
}
//*************************************************************************************************
// 功能描述 : 彻底结束并口通信
// 输入参数 : 无
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void STOPcont(void)
{
TRFWrite = 0x00;
TRFDirOUT;
TRFWrite = 0x80;
TRFWrite = 0x00;
}
//*************************************************************************************************
// 功能描述 : 并口通信起始
// 输入参数 : 无
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void STARTcondition(void)
{
TRFWrite = 0x00;
clkON;
TRFWrite = 0xff;
clkOFF;
}
//*************************************************************************************************
// 功能描述 : 单个写
// 输入参数 : 内容指针,长度
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void WriteSingle(unsigned char *pbuf, unsigned char lenght)
{
unsigned char i;
STARTcondition();
while(lenght > 0)
{
*pbuf = (0x1f &*pbuf); // 设置地址为非连续写 register address
for(i = 0; i < 2; i++) // 单个地址和数据写操作
{
TRFWrite = *pbuf; //发送命令和数据
clkON;
clkOFF;
pbuf++;
lenght--;
}
}
STOPcondition();
}
//*************************************************************************************************
// 功能描述 : 连续写
// 输入参数 : 内容指针,长度
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void WriteCont(unsigned char *pbuf, unsigned char lenght)
{
STARTcondition();
*pbuf = (0x20 | *pbuf); // 设置地址写为连续模式 address, write, continous
*pbuf = (0x3f & *pbuf); // 设置寄存器地址
while(lenght > 0)
{
TRFWrite = *pbuf; //发送命令
clkON;
clkOFF;
pbuf++;
lenght--;
}
STOPcont();
}
//*************************************************************************************************
// 功能描述 : 单个读
// 输入参数 : 地址和长度
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void ReadSingle(unsigned char *pbuf, unsigned char lenght)
{
STARTcondition();
while(lenght > 0)
{
*pbuf = (0x40 | *pbuf); //地址, 读,单个
*pbuf = (0x5f & *pbuf); //积存器地址
TRFWrite = *pbuf; // 发送命令
clkON;
clkOFF;
TRFDirIN; // 上升沿读取数据
clkON;
*pbuf = TRFRead;
clkOFF;
TRFWrite = 0x00;
TRFDirOUT;
pbuf++;
lenght--;
}
STOPcondition();
}
//*************************************************************************************************
// 功能描述 : 连续读
// 输入参数 : 地址和长度
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void ReadCont(unsigned char *pbuf, unsigned char lenght)
{
STARTcondition();
*pbuf = (0x60 | *pbuf); //地址, 读,连续
*pbuf = (0x7f & *pbuf); //积存器地址
TRFWrite = *pbuf; //发送命令
clkON;
clkOFF;
TRFDirIN; //上升沿读取数据
while(lenght > 0)
{
clkON;
*pbuf = TRFRead;
clkOFF;
pbuf++;
lenght--;
}
STOPcont();
}
//*************************************************************************************************
// 功能描述 : 发送命令
// 输入参数 : 命令指针
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void DirectCommand(unsigned char *pbuf)
{
STARTcondition();
*pbuf = (0x80 | *pbuf); //命令
*pbuf = (0x9f & *pbuf); //命令码
TRFWrite = *pbuf; //发送命令
clkON;
clkOFF;
STOPcondition();
}
//*************************************************************************************************
// 功能描述 : 直接写数据
// 输入参数 : 数据指针,长度
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void RAWwrite(unsigned char *pbuf, unsigned char lenght)
{
STARTcondition();
while(lenght > 0)
{
TRFWrite = *pbuf; //发送命令
clkON;
clkOFF;
pbuf++;
lenght--;
}
STOPcont();
}
//*************************************************************************************************
// 功能描述 : 初始化7860
// 输入参数 : 无
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void Initial7960s(void)
{
unsigned char command[2];
TRFDisable; // 复位TRF7960
DelayMs(8);
TRFEnable;
command[0] = ModulatorControl;
command[1] = 0x01; //调制形式为 OOK
WriteSingle(command, 2);
command[0] = ModulatorControl;
ReadSingle(command, 1);
}
//*************************************************************************************************
// 功能描述 : IRQ中断处理
// 输入参数 : FIFO状态
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void InterruptHandlerReader(unsigned char *Register)
{
// TX IRQ
if(*Register == 0xA0) //正在发送,并且FIFO只剩下3字节
{
i_reg = 0x00;
}
else if(*Register == BIT7) // 在TX开始时置位,TX完毕后产生中断,发送完毕
{
i_reg = 0x00;
*Register = Reset; // FIFO 复位
DirectCommand(Register);
}
// RX IRQ
else if(*Register == 0x60) // FIFO 中数据超过 75% (9 bytes)
{
i_reg = 0x01; // 仍然是接收状态
buf[RXTXstate] = FIFO;
ReadCont(&buf[RXTXstate], 9); // 从 FIFO 读 9 bytes
RXTXstate = RXTXstate + 9;
if(irqPORT & irqPIN)
{
*Register = IRQStatus; // IRQ 状态积存器地址
ReadSingle(Register, 1);
irqCLR;
if(*Register == 0x40) // 接收完成
{
*Register = FIFOStatus;
ReadSingle(Register, 1); //判断在FIFO中剩余的BYTES
*Register = 0x0F & (*Register + 0x01); //
buf[RXTXstate] = FIFO; //将接收的内容放到正确的缓存中
ReadCont(&buf[RXTXstate], *Register);
RXTXstate = RXTXstate + *Register;
*Register = TXLenghtByte2; //判断是否有数据损坏
ReadSingle(Register, 1); //判断损坏的位数
if((*Register & BIT0) == BIT0)
{
*Register = (*Register >> 1) & 0x07; // 隐藏前面无关的5位
*Register = 8 - *Register; //坏掉的位数
buf[RXTXstate - 1] &= 0xFF << *Register;
}
i_reg = 0xFF; //接收结束
*Register = Reset; // FIFO 复位
DirectCommand(Register);
}
else if(*Register == 0x50) //CRC错误
{ //接收结束,并且错误
i_reg = 0x02;
}
}
else // 接收完毕中断
{
Register[0] = IRQStatus;
ReadSingle(Register, 2);
if(Register[0] == 0x00)
{
i_reg = 0xFF;
}
}
}
else if(*Register == BIT6) // RX结束
{
if(RXErrorFlag == RXERROR) // CRC错误 BIT60x0f
{
i_reg = 0x02; // RX 完成
return;
}
*Register = FIFOStatus;
ReadSingle(Register, 1); //确定FIFI中剩余的字节数
*Register = (0x0F & *Register) + 0x01; // data bytes + addr
buf[RXTXstate] = FIFO; // 将接收的数据放入缓存中;
ReadCont(&buf[RXTXstate], *Register);
RXTXstate = RXTXstate + *Register;
*Register = TXLenghtByte2; //判断是否有数据损坏
ReadSingle(Register, 1); //判断损坏的位数
if((*Register & BIT0) == BIT0)
{
*Register = (*Register >> 1) & 0x07; // 隐藏前面无关的5位
*Register = 8 -*Register;
buf[RXTXstate - 1] &= 0xFF << *Register;
}
*Register = Reset; //接收完成复位FIFO
DirectCommand(Register);
i_reg = 0xFF; //最后接收的字节
}
else if((*Register & BIT4) == BIT4) // CRC错误
{
if((*Register & BIT5) == BIT5) // 是否有FIFO益出中断
{
i_reg = 0x01; // 正在RX
RXErrorFlag = RXERROR;
}
else
{
i_reg = 0x02; // RX结束 无FIFO益出
}
}
else if((*Register & BIT2) == BIT2) // byte framing 错误
{
if((*Register & BIT5) == BIT5)
{
i_reg = 0x01; //正在RX
RXErrorFlag = RXERROR;
}
else
{
i_reg = 0x02; //RX结束
}
}
else if(*Register == BIT0)
{ //无应答中断
i_reg = 0x00;
}
else
{ //其他中断处理
i_reg = 0x02;
*Register = StopDecoders; //接收完成复位FIFO
DirectCommand(Register);
*Register = Reset;
DirectCommand(Register);
*Register = IRQStatus;
ReadSingle(Register, 1);
irqCLR;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -