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

📄 spi_fonction.c

📁 SPI 协议软件实现 用于nRF24L01射频IC与MCU的通讯 
💻 C
字号:
/* 访问SFR 和SFR的位*/    
#include <REG52.H>  
#include "SPI_function_macro.h" 
#include "global_header.h" 

/* 全局变量声明 */
sbit csn=P2^6;			//SPI片选接口
sbit sck=P2^5;			//SPI时钟接口
sbit mosi=P2^4;			//SPI主出子入接口
sbit miso=P2^3;			//SPI主入子出接口

extern unsigned char code RFmain_ADDR[TX_ADR_LENGTH];

/********************************************************************* 
* 函 数 名: unsigned char SPI_RW(unsigned char data_to_send)
* 功能描述: 向nRF24L01写入一个字节, 返回在写入期间读出的数据(根据SPI协议
			,主设备向mosi线写入的同时,从设备也向miso线写入)
*输入/输出参数:
	输入: 'data_to_send', current byte to be written in
	输出: the byte read from nRF24L01 during write
* 全局变量:无
* 设 计 者:高朝伟     日期:2006-04-17
* 修 改 者:           日期:
* 版 本:I-1
***********************************************************************/
unsigned char SPI_RW(unsigned char data_to_send)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		mosi=data_to_send&0x80;		//时钟低电平时,写入要发送数据的最高位至mosi线输出	
		data_to_send=data_to_send<<1;			//取要发送数据的下一位至MSB,准备输出
		sck=1;		//时钟高电平,主从双方可以开始读出数据
		data_to_send=data_to_send|miso;		//主方从miso线上读入从方输出的数据
		sck=0;		//时钟低电平,双方可以把要发送的数据写入			
	}
	return(data_to_send);
}

/********************************************************************* 
* 函 数 名: unsigned char SPI_Read_Reg(unsigned char control_word)
* 功能描述: 从nRF24L01的某一个寄存器读出一个字节, 返回所读出的数据
*输入/输出参数:
	输入: 'control_word', register to read from 
	输出: return reg_val, register value.
* 全局变量:无
* 设 计 者:高朝伟     日期:2006-04-17
* 修 改 者:           日期:
* 版 本:I-1
***********************************************************************/
 unsigned char SPI_Read_Reg(unsigned char control_word)
{
	unsigned char reg_val;
	csn=0;			//SPI串口使能,开始通信
  	SPI_RW(control_word);                         //写入要操作的寄存器控制字
  	reg_val = SPI_RW(0);                          //读取寄存器中的内容 
  	csn=1;			//SPI串口通信结束
  	return(reg_val);                               //返回所读数值
}  

/********************************************************************* 
* 函 数 名: unsigned char SPI_Write_Reg(unsigned char control_word, unsigned char data_to_write)
* 功能描述: 向nRF24L01的某一个寄存器写入一个给定的字节, 返回status寄存器的数据
* 输入/输出参数:
	输入: 'control_word' register to write ,   'data_to_write' value to be writed in.
	输出: return nRF24L01 status byte.
* 全局变量:无
* 设 计 者:高朝伟     日期:2006-04-17
* 修 改 者:           日期:
* 版 本:I-1
***********************************************************************/
unsigned char SPI_Write_Reg(unsigned char control_word, unsigned char data_to_write)
{
	unsigned char status;
	csn=0;			//SPI串口使能,开始通信
  	status = SPI_RW(control_word);      //写入要操作的寄存器控制字并读取状态寄存器的数值
  	SPI_RW(data_to_write);              //写入要传送的数据
	csn=1;			//SPI串口通信结束
  	return(status);		//返回RF模块状态寄存器的数值
}

/********************************************************************* 
* 函 数 名: unsigned char SPI_Write_Buf(unsigned char control_word, unsigned char *Buf, unsigned char bytes_num)
* 功能描述: 向nRF24L01的发送缓冲区写入给定个数的字节, 返回status寄存器的数据
* 输入/输出参数:
	输入: register 'control_word' to write in, buffer '*pBuf*' contains data to be written in and 
		  buffer size 'buf_size' is #of bytes to be written in
	输出: return nRF24L01 status byte.
* 全局变量:无
* 设 计 者:高朝伟     日期:2006-04-17
* 修 改 者:           日期:
* 版 本:I-1
***********************************************************************/
unsigned char SPI_Write_Buf(unsigned char control_word, unsigned char *Buf, unsigned char bytes_num)
{
	unsigned char status,byte_ctr;

 	csn=0;			//SPI串口使能,开始通信
  	status = SPI_RW(control_word);      //写入要操作的寄存器控制字并读取状态寄存器的数值
	for(byte_ctr=0; byte_ctr<bytes_num;byte_ctr++)    //把数组*Buf中的所有字节发送输出
	SPI_RW(*Buf++);
	csn=1;			//SPI串口通信结束
  	return(status);		//返回RF模块状态寄存器的数值
}

/********************************************************************* 
* 函 数 名: unsigned char SPI_Read_Buf(unsigned char control_word, unsigned char *Buf, unsigned char bytes_num)
* 功能描述: 从nRF24L01的接收缓冲区读出给定个数的字节并写入数组*Buf中, 返回status寄存器的数据
* 输入/输出参数:
	输入: 'control_word', register to read from, '*Buf' is the buffer that read bytes are stored to 
	and 'bytes_num' is #of bytes to read.
	输出: return nRF24L01 status byte.
* 全局变量:无
* 设 计 者:高朝伟     日期:2006-04-17
* 修 改 者:           日期:
* 版 本:I-1
***********************************************************************/
 unsigned char SPI_Read_Buf(unsigned char control_word, unsigned char *Buf, unsigned char bytes_num)
{
	unsigned char status,byte_ctr;
	csn=0;			//SPI串口使能,开始通信
  	status = SPI_RW(control_word);      //写入要操作的寄存器控制字并读取状态寄存器的数值
	for(byte_ctr=0;byte_ctr<bytes_num;byte_ctr++)
    Buf[byte_ctr] = SPI_RW(0);		// 从nRF24L01中读出数据并存入数组*Buf中
  	csn=1;			//SPI串口通信结束
  	return(status);		//返回RF模块状态寄存器的数值
} 


/******************************************************************************** 
* 函 数 名:void init_RF_send(void)	
* 函数说明: nRF24L01射频模块发射模式初始化子函数
* 功能描述: 对nRF24L01的接收模式进行设置, 只需把ce位置位后130us,模块开始监视空中信息.
* 全局变量: 无
* 调用函数: SPI_Write_Buf()
* 输 入: 无
* 返 回: 无
* 设 计 者:高朝伟     日期:2006-05-25
* 修 改 者:           日期:
* 版 本:I-1
**********************************************************************************/
void init_RF_send(void)		
{	
  	SPI_Write_Reg(WRITE_REG + EN_AA, 0x01);            // Enable Auto.Ack:Pipe0
  	SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x01);        // Enable Pipe0 receive
  	SPI_Write_Reg(WRITE_REG + SETUP_RETR, 0x1a);       // 500 + 86us, 10 retrans...
  	SPI_Write_Reg(WRITE_REG + RF_CH, 40);              // Select RF channel 40
  	SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x07);         // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR
  	SPI_Write_Reg(WRITE_REG + CONFIG, 0x0e);           // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. MAX_RT & TX_DS enabled..
}

/******************************************************************************** 
* 函 数 名:void init_RF_receive(void)
* 函数说明: nRF24L01射频模块接收模式初始化子函数
* 功能描述: 对nRF24L01的接收模式进行设置, 只需把ce位置位后130us,模块开始监视空中信息.
* 全局变量: 无
* 调用函数: SPI_Write_Buf()
* 输 入: 无
* 返 回: 无
* 设 计 者:高朝伟     日期:2006-05-25
* 修 改 者:           日期:
* 版 本:I-1
**********************************************************************************/
void init_RF_receive(void)
{	
	SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RFmain_ADDR, TX_ADR_LENGTH);//Use the same address on the RX device as the TX device
	SPI_Write_Reg(WRITE_REG + EN_AA, 0x01);	 						// Enable Auto-Ack:Pipe0
	SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x01);	 					// Enable Pipe0 receive
	SPI_Write_Reg(WRITE_REG + RF_CH, 40);	 						// Select RF channel 40
	SPI_Write_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);	// Select same RX payload width as TX Payload width
	SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x07);			// TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR
	SPI_Write_Reg(WRITE_REG + CONFIG, 0x0f);	// Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX. RX_DR enabled..

}

⌨️ 快捷键说明

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