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

📄 twimain._c

📁 PTR8000无线通信模块的单片机控制程序
💻 _C
字号:

/*函数的使用说明:
1.该twi模块包含四种工作模式,主发,主收,从收,从发,其中主发由
  twiWriteByte(从机地址,要发送的数据)实现,主收由twiReadByte(从机地址)实现,从机
  的发送与接收均通过中断实现
2.在从机模式下,需调用twi_init()来使能并初始化twi总线
3.在主机模式下,调用twiWriteByte(从机地址,要发送的数据)向指定的从机写入数据,
  调用twiReadByte(从机地址)从指定的从机读取数据,然后可通过查询错误状态error_state
  的值决定下一步如何操作。
*/

#include "twi.h"

//TWI同程序的接口参数
//receive_data,error_state不用设置
char receive_data=0;  		  // 接收到的数据
char error_state=0;   		  // twi错误状态
//以下三个参数根据需求进行设置
char slave_address=0xa0;      // 设置从机地址,Bits 7..1:存放从机地址,Bit 0:最低位为广播识别使能位
char bit_race=0x20;           // 设置主机模式的比特率,SCL=CPU频率/(16+2*(TWBR)*4TWPS),TWPS在4的指数位置
char send_data=0x02;     	  // 从机发送模式下从机向主机发送的数据
//要发送的数据
char trandata[num] = {0x00,0x01,0x02,0x03};
//*************************PTR8000全局变量**********************************
unsigned char Recv;
unsigned char RC0 = 0x4c,RC1 = 0x0c;//用于设置发送频率
unsigned char Add = 0xa1; //设置发送地址
//*************************** twi错误状态说明*********************************
// 0:twi传送无错误
// 1:在主发模式下,SLA+W已发送,返回NOT ACK
// 2:在主发模式下,DATA已发送,返回NOT ACK
// 3:在主发模式下,SLA+W或者数据的仲裁失败
// 4:在主收模式下,SLA+R或者数据的仲裁失败
// 5:在主收模式下,SLA+R已发送,返回NOT ACK
// 6:在主发模式下,START信号发送不成功
// 7:在主收模式下,START信号发送不成功
// 8:在主收模式下,数据接受完成
// 9:在主收模式下,数据接受不成功
//*****************************************************************************


//*************************函数定义部分**************************************
void port_init(void);			//初始化MEGA各控制引脚

void Delay_1ms(void);					//延时1ms函数
void Delay_Nms(unsigned int N);			//延时Nms函数
void LED(unsigned char i);			    //点亮/熄灭LED

//串口通讯用函数
void Uart_Init(void);					//UART初始化
void Uart_Send(unsigned char c);			//UART发送一个字符


//SPI通讯用函数
void SPI_MasterInit(void);	//SPI主机初始化
void SPI_M_Send(unsigned char c);	//主机方式发送一个字符
unsigned char  SPI_M_Recv(unsigned char c);	//主机接收一个字符

//PTR8000用函数
void PTR8_Standby(void);	//set TRC_CE Disable
void PTR8_TREN(void);		//set TRX_CE  Enable
void PTR8_TX(void);		//无线模块发送状态
void PTR8_RX(void);		//无线模块接收状态
void Init_PTR8_CR(void);	//初始化PTR8000控制状态

void Init_Device(void);	//初始化串口、SPI口及其他设备

//******************************函数实现部分************************************

//*************************** I/O 初始化****************************************
//******************************************************************************
/*	函数名:	init_port
	功能说明:初始化各MEGA8各控制引脚
	参数说明:无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-23
	修改时间:
	修改内容:				*/
void port_init(void)
{
	PORTB = 0x2f;	//置PB0,PB1,PB2,PB3,PB5为1,PB4,PB6,PB7为0
	DDRB = 0x2f;	//置PB0,PB1,PB2--SS,PB3--MOSI,PB5--SCK为输出,PB4--MISO为输入
	PORTC = 0x0f;   
	DDRC  = 0x0f;	//PC4--SDA,PC5--SCL为输入,PC0--PC3全为输出以便测试
	PORTD = 0x05;	//置PWR,TXEN为1,  TRXCE为0
	DDRD  = 0x07;	//置PD3,PD4,PD5输入;PD2--PWR,PD0--TXEN,PD1--TRXCE输出
}
//**************************************************************************************

/*	函数名:	Delay_1ms
	功能说明:软件延时1ms
	参数说明:无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-06
	修改时间:
	修改内容:				*/
	
void Delay_1ms(void)
{
	unsigned int i;
	for ( i = 0 ; i < ( unsigned int ) 11 * 143 - 2 ; i ++ )
		;
}
//******************************************************************

/*	函数名:	Delay_Nms
	功能说明:软件延时Nms,适用于所有CPU
	参数说明:N值决定延时长度。范围为0~65536之间的整数
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-06
	修改时间:
	修改内容:				*/
void Delay_Nms(unsigned int N)
{
	unsigned int j;
	for( j = 0 ; j < N ; j ++ )
		Delay_1ms();
}
//*******************************************************************

/*	函数名:	LED
	功能说明:点亮/熄灭LED
	参数说明:0----点亮;1----熄灭
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-23
	修改时间:
	修改内容:				*/

void LED(unsigned char i)
{
	if(i == 0)
		PORTB &= ~BIT(PB1);
	else
		PORTB |= BIT(PB1);
}

//*******************************************************************

//串口通讯用函数

/*	函数名:	Uart_Init
	功能说明:串口初始化函数,适用于所有CPU
					波特率9600,8位字节,无奇偶校验
	参数说明:无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-02
	修改时间:
	修改内容:				*/
void Uart_Init(void)
{
 	UCSRB = 0x00; //disable while setting baud rate
	UCSRA = 0x00;
 	UCSRC = 0x86;
 	UBRRL = 0x47; //set baud rate lo
 	UBRRH = 0x00; //set baud rate hi
 	UCSRB = 0x98;
}
//********************************************************************

/*	函数名:	Uart_Send
	功能说明:通过查询方式,串口发送一个字节函数,适用于所有CPU					
	参数说明:c为所要发送的字节
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-02
	修改时间:
	修改内容:				*/
void Uart_Send(unsigned char c)
{
 	while(!(UCSRA&(1<<UDRE)))
  		;	//等待空闲
 	UDR=c;	//发送数据
}
/*接收中断函数*/
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
 	Recv = UDR;
	Uart_Send(Recv);//接收到的数据立即通过串口返回
	
}
//**********************************************************************

//SPI通讯用函数

/*	函数名:	SPI_MasterInit
	功能说明:SPI主机初始化函数。使能SPI,MSB在前,主模式
					起始上升沿,采样上升沿。16分频
	参数说明:	无
	返回值:	无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-02
	修改时间:
	修改内容:				*/

void SPI_MasterInit(void)
{
	SPCR = 0x51;		//SPI控制寄存器初始化:SPI允许,MSB先发,主模式,16分频
}
//**********************************************************************
/*	函数名:	SPI_M_Send
	功能说明:SPI主机发送一个字节函数。
	参数说明:	c为要发送的字节
	返回值:	无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-02
	修改时间:2005-12-05
	修改内容:	去掉SS信号控制语句	*/

void SPI_M_Send(unsigned char c)
{
	SPDR = c;	//传送开始
	while(!(SPSR & 0X80)) 
		;	//查询SPIF标志
	
}
//************************************************************************

/*	函数名:	SPI_M_Recv
	功能说明:SPI主机方式接收一个字节函数。
	参数说明:任意无效字符
	返回值:	返回接收到的字节
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-06
	修改时间:
	修改内容:				*/

unsigned char SPI_M_Recv(unsigned char c)
{
	SPDR = c;	//传送开始
	while(!(SPSR & 0X80)) 
		;	//查询SPIF标志
	return SPDR;	//返回接收的字符
}
//*************************************************************************

//***************************PTR8000无线模块用函数*****************

/*	函数名:	PTR8_Standby
	功能说明:将PTR8置为待机状态。SET TRX_CE = 0
	参数说明:无
	返回值:	无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-23
	修改时间:
	修改内容:				*/

void PTR8_Standby(void)
{
	PORTD &= ~BIT(PD1);	//TRX_CE = 0
}
//**************************************************************************

/*	函数名:	PTR8_TREN
	功能说明:将PTR8置为工作状态。SET TRX_CE = 1
	参数说明:无
	返回值:	无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-23
	修改时间:
	修改内容:				*/

void PTR8_TREN(void)
{
	PORTD |= BIT(PD1);	//TRX_CE = 1
}
//***************************************************************************

/*	函数名:	PTR8_TX
	功能说明:将PTR8置为发送状态。
	参数说明:无
	返回值:	无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-23
	修改时间:
	修改内容:				*/

void PTR8_TX(void)
{
	PORTD |= BIT(PD0);	//TX_EN = 1
}
//***************************************************************************

/*	函数名:	PTR8_RX
	功能说明:将PTR8置为接收状态。
	参数说明:无
	返回值:	无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-23
	修改时间:
	修改内容:				*/

void PTR8_RX(void)
{
	PORTD &= ~BIT(PD0);	//TX_EN = 0
}
//*****************************************************************************

void Init_PTR8_CR(void)
{
	PORTB &= ~BIT(PB2);	//SS SET LOW, Write Configuration register Start
	SPI_M_Send(WC);	//Wirte Configuration Register,Start From 0000
	SPI_M_Send(RC0);	//Write CH_NO [7 : 0]
	SPI_M_Send(RC1);		//Write Byte 2
	SPI_M_Send(0x44);
	SPI_M_Send(0x01);	//RX payload = 1 byte 
	SPI_M_Send(0x01);	//TX payload = 1 byte
	SPI_M_Send(Add);
	SPI_M_Send(Add);
	SPI_M_Send(Add);
	SPI_M_Send(Add);
	SPI_M_Send(0x58);
	PORTB |= BIT(PB2);	//SS set HIGH,Write Configuration Register Finish
	
}
//************************************************************************************
/*	函数名:	Init_Device
	功能说明:初始化设备。LED亮一下,蜂鸣器叫一声,初始化串口
	参数说明:无
	返回值:	无
	函数作者:Haibo YU
	版本号:	1.0
	创建时间:2005-12-23
	修改时间:
	修改内容:				*/

void Init_Device(void)
{
	//stop errant interrupts until set up
 	CLI(); //disable all interrupts
 	
	port_init();		//初始化各控制端口
	Uart_Init();		//串口初始化
	SPI_MasterInit();//SPI Master Init
	MCUCR = 0x00;
 	GICR  = 0x00;
 	TIMSK = 0x00; //timer interrupt sources
 	
	SEI(); //re-enable interrupts
	//all peripherals are now initialised
}




//****************************** 主函数  ***************************************
//******************************************************************************
void main(void)
{
 	
	unsigned char dr;
	Init_Device();	//Init All Device

	Init_PTR8_CR();	//Set Configuration register
	Delay_1ms();

	PTR8_RX();	//Set RX mode
	PTR8_TREN();	// TRX_CE = 1  Enable RX
	Delay_1ms();
	while(1)
	{
	 		
		 	dr = (PINC & 0x04);
			if(dr != 0)			//DR置位,无线数据接收成功
			{
			
			
			 	  PTR8_Standby();	//TRX_CE = 0,disable RX
			 	  Delay_1ms();
			 	  PORTB &= ~BIT(PB2);	//SS = 0
			 	  SPI_M_Send(RRP);	//Read RX payload
			 	  
			 	 
			  	  Recv = SPI_M_Recv(0xff);
			 	  
			 	  PORTB |= BIT(PB2);	//SS = 1

			 	/*  if(Recv == 0)
				  {
				   	LED(0); //接收到0 LED亮
				   	Delay_Nms(1000);
				  }
				  else
				  {
				   	LED(1);//接收到1 LED灭
					Delay_Nms(1000);  
				  }*/
				  
				  PTR8_RX();	//Set RX mode
				  PTR8_TREN();	// TRX_CE = 1  Enable RX
				  Delay_1ms();
				  
				  twiWriteByte(0xc0,Recv);
			}	
	}   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -