📄 spi_fonction.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 + -