📄 rfia4421.c
字号:
/*
*******************************************************************************
**
** This device driver was created by Applilet for the 78K0S/KB1+, 78K0S/KA1+,
** 78K0S/KY1+,78K0S/KU1+ 8-Bit Single-Chip Microcontrollers.
**
** Copyright(C) NEC Electronics Corporation 2002-2006
** All rights reserved by NEC Electronics Corporation.
**
** This program should be used on your own responsibility.
** NEC Electronics Corporation assumes no responsibility for any losses
** incurred by customers or third parties arising from the use of this file.
**
** Filename : main.c
** Abstract : This file implements main function.
** APIlib : NEC78K0SKX1+.lib V1.70 [7 Dec. 2006]
**
** Device : uPD78F9202
**
** Compiler : NEC/CC78K0
**
*******************************************************************************
*/
/*
*******************************************************************************
** Include files
*******************************************************************************
*/
#include "macrodriver.h"
#include "system.h"
#include "ad.h"
#include "port.h"
#include "timer.h"
#include "watchdogtimer.h"
#include "lvi.h"
#include "rfreminder.h"
/*
*******************************************************************************
** MacroDefine
*******************************************************************************
*/
void main( void )
{
uchar ls1,i;
/* TODO. add user code */
ini_pp();
rf_ini_IA4421();
TM00_Start(); /* 定时器启动 */
jsq10ms=0;
while(1)
{
main_1:
WDTE=0xAC;
if (jsq10ms<20) goto main_1;
if (!Data_sent_flg_kx) goto main_1;
else
{
delayms(20);
if (!Data_sent_flg_kx) goto main_1;
}
main_1_1:
WDTE=0xAC;
delayms(10);
if (Data_sent_flg_kx) goto main_1_1;
delayms(10);
if (Data_sent_flg_kx) goto main_1_1;
rf_ready_to_send();
rf_send_begin_code();
rf_send_1byte('G');
rf_send_1byte('O');
rf_send_1byte('D');
rf_send_1byte('S');
rf_send_1byte('A');
rf_send_1byte('V');
rf_send_1byte('E');
rf_send_1byte('M');
rf_send_1byte('E');
rf_send_1byte('E'); // SEND MORE,
rf_end_to_send();
jsq10ms=0;
/*
main_2:
WDTE=0xAC;
if (jsq10ms<200) goto main_2;
Data_sent_flg_kx=1;
rf_ready_to_recv();
rf_ini_fifo();
rf_wrrd_IA4421_cmd(0x0000);
for (i=0;i<9;i++)
{
main_3:
WDTE=0xAC;
ls1=rf_check_irq_sta();
if (ls1!=0) goto main_3;
rf_recv_buf[i]=rf_recv_1byte();
}
rf_end_to_recv();
Data_sent_flg_kx=0;
jsq10ms=0;
*/
}
}
//------------------------------------------------------
/* MCU 初始化 */
//------------------------------------------------------
void ini_pp(void)
{
P2.0=1;
PM2.0=1;
P2.1=0;
PM2.1=0;
P4.0=1;
PM4.0=1;
P4.3=1;
PM4.3=0;
P2.2=1;
PM2.2=0;
P2.3=1;
PM2.3=1;
/*
P3.2=1;
PM3.2=1;
*/
}
//------------------------------------------------------
/* RF_IA4421_写入指令读出数据/状态函数 */
/* 输入:16位指令 */
/* /输出:16位数据/状态 */
/* 调用规则:需要写入指令或读取数据状态时调用 */
//------------------------------------------------------
uint rf_wrrd_IA4421_cmd(uint cmd)
{
uchar i;
uint ls1=0;
IA4421_cs_kx=1;
NOP();
IA4421_clk_kx=0;
IA4421_mosi_kx=0;
IA4421_cs_kx=0;
Nop10();
for (i=0;i<16;i++)
{
IA4421_clk_kx=0;
if (cmd&0x8000) IA4421_mosi_kx=1;
else IA4421_mosi_kx=0;
Nop10();
IA4421_clk_kx=1;
cmd<<=1;
ls1<<=1;
if (IA4421_miso_kx) ls1|=0x0001;
}
IA4421_clk_kx=0;
IA4421_cs_kx=1;
return ls1;
}
//------------------------------------------------------
/* 发送1字节数据 */
/* 通过RF发送1字节数据,该数据按照规定指令写入RF芯片即可 */
/* 输入:要发送的数据 */
/* 输出:无 */
/* 调用规则:需要发送数据时调用 */
//------------------------------------------------------
void rf_send_1byte(uchar data)
{
uchar ls1;
uint ls2;
rf_send_1byte1:
ls1=rf_check_irq_sta();
if (ls1!=0) goto rf_send_1byte1;
ls2=rf_wrrd_IA4421_cmd(0xb800+(uint)data);
}
//------------------------------------------------------
/* 读取1字节数据 */
/* 从RF读取1字节收到的数据,该数据已经接收放在芯片内 */
/* 输入:无 */
/* 输出:收到的数据 */
/* 调用规则:需要接收数据时调用,调用前要通过IRQ引脚确认已经收到数据, */
//------------------------------------------------------
uchar rf_recv_1byte(void)
{
uchar ls1;
mls2=rf_wrrd_IA4421_cmd(0xb000);
return (mls2l);
}
//------------------------------------------------------
/* 读取RF状态 */
/* 读取RF状态,即芯片内部状态 */
/* 输入:无 */
/* 输出:1字状态 */
/* 调用规则:需要读取状态时调用 */
//------------------------------------------------------
uint rf_read_status(void)
{
uchar ls1;
uint ls2;
ls1=rf_check_irq_sta();
if (ls1!=0) return 0xff;
ls2=rf_wrrd_IA4421_cmd(0x0000);
return (ls2);
}
//------------------------------------------------------
/* 检查IRQ是否变低 */
/* 检查是否收到数据--查询方式接收 */
/* 检查是否处理完上次的数据/指令等 */
/* 检测IRQ线状态,IRQ=0时表示收到数据或指令/数据处理完毕 */
/* 输入:无 */
/* 输出:状态 0xff表示IRQ未准备好, 0x00表示IRQ准备好(变低) */
/* 调用规则:需要检测IRQ时调用 */
//------------------------------------------------------
uchar rf_check_irq_sta(void)
{
if (IA4421_irq_kx) return 0xff;
else return 0;
}
//------------------------------------------------------
/* IA4421初始化程序 */
/* 输入:无 */
/* 输出:无 */
/* 调用规则:需要对IA4421进行软件初始化时调用 */
//------------------------------------------------------
void rf_ini_IA4421(void)
{
rf_wrrd_IA4421_cmd(0x80d8); /* 频段选择;使能发送寄存器;使能接收FIFO设定晶体负载电容12.5p(根据晶体实际参数设置) */
rf_wrrd_IA4421_cmd(0x8201); /* 禁止时钟输出 */
rf_wrrd_IA4421_cmd(0xa4b0); /* 中心频点设定(433M),可以根据实际需要设定不同频点 */
rf_wrrd_IA4421_cmd(0xc623); /* 设置无线发送波特率9.6k */
rf_wrrd_IA4421_cmd(0x94a0); /* VDI output ;接收带宽135k ; */
rf_wrrd_IA4421_cmd(0xc22c); /* 时钟获取锁定为慢速模式;数字滤波 */
rf_wrrd_IA4421_cmd(0xca81); /* FIFO 中断级别为8;同步格式长度(0x2d 0xd4)禁止高灵敏度复位 */
rf_wrrd_IA4421_cmd(0xced4); /* 同步模式,使用缺省值 */
rf_wrrd_IA4421_cmd(0xc4f7); /* 自动频率控制 */
rf_wrrd_IA4421_cmd(0x9830); /* 设置中心频道和输出功率 */
rf_wrrd_IA4421_cmd(0xcc77); /* 晶体启动时间为2ms */
rf_wrrd_IA4421_cmd(0xe000); /* 唤醒定时周期设置(此处未使用) */
rf_wrrd_IA4421_cmd(0xc800); /* 低任务模式设置(此处未使用) */
rf_wrrd_IA4421_cmd(0xc000); /* 低电压检测设置 */
}
//------------------------------------------------------
/* 发送前导码 */
/* 发送数据前,要先发送前导码,本函数1次性发出前导码 */
/* 输入:无 */
/* 输出:无 */
/* 调用规则:发送数据前调用先发送前导码 */
//------------------------------------------------------
void rf_send_begin_code(void)
{
rf_send_1byte(0xaa);
rf_send_1byte(0xaa);
rf_send_1byte(0xaa);
rf_send_1byte(0x2d);
rf_send_1byte(0xd4);
}
//------------------------------------------------------
/* 接收使能函数--准备好接收 */
/* 打开接收使能控制,准备好接收 */
/* 输入:无 */
/* 输出:无 */
/* 调用规则:接收前先调用本函数 */
//------------------------------------------------------
void rf_ready_to_recv(void)
{
uint ls1;
ls1=rf_wrrd_IA4421_cmd(0x82D9); /* 接收准备,打开接收基带 */
}
//------------------------------------------------------
/* 接收完成关闭使能函数--接收结束,RF进入待机 */
/* 关闭接收使能控制 */
/* 输入:无 */
/* 输出:无 */
/* 调用规则:接收完成后调用本函数 */
//------------------------------------------------------
void rf_end_to_recv(void)
{
uint ls1;
ls1=rf_wrrd_IA4421_cmd(0x8201); /* 关闭接收使能, */
}
//------------------------------------------------------
/* 发送使能函数--准备好发送 */
/* 打开发送使能控制,并复位IRQ引脚信号,使之有效 */
/* 输入:无 */
/* 输出:无 */
/* 调用规则:发送前先调用本函数 */
//------------------------------------------------------
void rf_ready_to_send(void)
{
uint ls1;
ls1=rf_wrrd_IA4421_cmd(0x8239); /* 打开发送接收链,放大器,晶体,pll */
ls1=rf_wrrd_IA4421_cmd(0x0000); /* 保证把nirq 拉高 */
}
//------------------------------------------------------
/* 发送完成关闭使能函数--发送结束,RF进入待机 */
/* 关闭发送使能控制 */
/* 输入:无 */
/* 输出:无 */
/* 调用规则:发送完成后调用本函数 */
//------------------------------------------------------
void rf_end_to_send(void)
{
uint ls1;
ls1=rf_wrrd_IA4421_cmd(0x8201); /* 关闭发送使能 */
}
//------------------------------------------------------
/* 初始化RF的FIFO */
/* 输入:无 */
/* 输出:无 */
/* 调用规则:接收前 */
//------------------------------------------------------
void rf_ini_fifo(void)
{
uint ls1;
ls1=rf_wrrd_IA4421_cmd(0xca80); //init fifo
ls1=rf_wrrd_IA4421_cmd(0xca83); //able fifo
}
//------------------------------------------------------
/* 发送一串数据 */
/* 输入:无 */
/* 输出:无 */
/* 调用规则:需要发送一串数据时 */
/* 变量:发送的数据放在 rf_send_buf[8]中,最多8字节, 1次发送8字节 */
//------------------------------------------------------
void rf_send_string(void)
{
uchar i;
rf_ready_to_send();
for (i=0;i<8;i++)
{
rf_send_1byte(rf_send_buf[i]);
}
rf_send_1byte(0x02); /* 多发1字节 */
rf_end_to_send();
}
//------------------------------------------------------
//------------------------------------------------------
void Nop10(void)
{
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
}
//------------------------------------------------------
//------------------------------------------------------
void Nop100(void)
{
Nop10();
Nop10();
Nop10();
Nop10();
Nop10();
Nop10();
Nop10();
Nop10();
Nop10();
Nop10();
}
void delayms(uchar dlt)
{
uchar i,j;
if (dlt==0) return;
for (i=0;i<dlt;i++)
{
for (j=0;j<110;j++)
{
Nop10();
}
}
}
/*
IA4421 RF(射频)芯片驱动程序,
初始化IA4421, 并可以发出一串固定数据,同时可以接收一串固定的数据
发出的数据预先写在内部指定的区域
有端口与上位机连接,当端口为高电平且持续超过20毫秒时, 发出预先存储的数据串. 检测到新的高电平时,再次发送,每次电平变化只发出1次数据
//芯片有自编程功能, 所以写入的数据通过外部接口发送给芯片,片内程序把写入的数据写到指定的内部FLASH
// 有IO口设定是编程模式,还是正常运行模式. 编程模式下,可以从一个IO口接收发来的数据,接收完成,比较正确后数据写入FLASH
//单片机的4个不参与仿真的IO口用于驱动IA4421, 4个参与仿真的IO口用于其他功能.
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -