⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rfia4421.c

📁 射频芯片IA4421应用的程序源代码,供大家参考,其中关于IA4421操作的函数已经小批量用于生产中
💻 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 + -