?? 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];
/*********************************************************************
* 函 數(shù) 名: unsigned char SPI_RW(unsigned char data_to_send)
* 功能描述: 向nRF24L01寫入一個字節(jié), 返回在寫入期間讀出的數(shù)據(jù)(根據(jù)SPI協(xié)議
,主設(shè)備向mosi線寫入的同時,從設(shè)備也向miso線寫入)
*輸入/輸出參數(shù):
輸入: 'data_to_send', current byte to be written in
輸出: the byte read from nRF24L01 during write
* 全局變量:無
* 設(shè) 計 者:高朝偉 日期: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; //時鐘低電平時,寫入要發(fā)送數(shù)據(jù)的最高位至mosi線輸出
data_to_send=data_to_send<<1; //取要發(fā)送數(shù)據(jù)的下一位至MSB,準備輸出
sck=1; //時鐘高電平,主從雙方可以開始讀出數(shù)據(jù)
data_to_send=data_to_send|miso; //主方從miso線上讀入從方輸出的數(shù)據(jù)
sck=0; //時鐘低電平,雙方可以把要發(fā)送的數(shù)據(jù)寫入
}
return(data_to_send);
}
/*********************************************************************
* 函 數(shù) 名: unsigned char SPI_Read_Reg(unsigned char control_word)
* 功能描述: 從nRF24L01的某一個寄存器讀出一個字節(jié), 返回所讀出的數(shù)據(jù)
*輸入/輸出參數(shù):
輸入: 'control_word', register to read from
輸出: return reg_val, register value.
* 全局變量:無
* 設(shè) 計 者:高朝偉 日期: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); //讀取寄存器中的內(nèi)容
csn=1; //SPI串口通信結(jié)束
return(reg_val); //返回所讀數(shù)值
}
/*********************************************************************
* 函 數(shù) 名: unsigned char SPI_Write_Reg(unsigned char control_word, unsigned char data_to_write)
* 功能描述: 向nRF24L01的某一個寄存器寫入一個給定的字節(jié), 返回status寄存器的數(shù)據(jù)
* 輸入/輸出參數(shù):
輸入: 'control_word' register to write , 'data_to_write' value to be writed in.
輸出: return nRF24L01 status byte.
* 全局變量:無
* 設(shè) 計 者:高朝偉 日期: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); //寫入要操作的寄存器控制字并讀取狀態(tài)寄存器的數(shù)值
SPI_RW(data_to_write); //寫入要傳送的數(shù)據(jù)
csn=1; //SPI串口通信結(jié)束
return(status); //返回RF模塊狀態(tài)寄存器的數(shù)值
}
/*********************************************************************
* 函 數(shù) 名: unsigned char SPI_Write_Buf(unsigned char control_word, unsigned char *Buf, unsigned char bytes_num)
* 功能描述: 向nRF24L01的發(fā)送緩沖區(qū)寫入給定個數(shù)的字節(jié), 返回status寄存器的數(shù)據(jù)
* 輸入/輸出參數(shù):
輸入: 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.
* 全局變量:無
* 設(shè) 計 者:高朝偉 日期: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); //寫入要操作的寄存器控制字并讀取狀態(tài)寄存器的數(shù)值
for(byte_ctr=0; byte_ctr<bytes_num;byte_ctr++) //把數(shù)組*Buf中的所有字節(jié)發(fā)送輸出
SPI_RW(*Buf++);
csn=1; //SPI串口通信結(jié)束
return(status); //返回RF模塊狀態(tài)寄存器的數(shù)值
}
/*********************************************************************
* 函 數(shù) 名: unsigned char SPI_Read_Buf(unsigned char control_word, unsigned char *Buf, unsigned char bytes_num)
* 功能描述: 從nRF24L01的接收緩沖區(qū)讀出給定個數(shù)的字節(jié)并寫入數(shù)組*Buf中, 返回status寄存器的數(shù)據(jù)
* 輸入/輸出參數(shù):
輸入: '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.
* 全局變量:無
* 設(shè) 計 者:高朝偉 日期: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); //寫入要操作的寄存器控制字并讀取狀態(tài)寄存器的數(shù)值
for(byte_ctr=0;byte_ctr<bytes_num;byte_ctr++)
Buf[byte_ctr] = SPI_RW(0); // 從nRF24L01中讀出數(shù)據(jù)并存入數(shù)組*Buf中
csn=1; //SPI串口通信結(jié)束
return(status); //返回RF模塊狀態(tài)寄存器的數(shù)值
}
/********************************************************************************
* 函 數(shù) 名:void init_RF_send(void)
* 函數(shù)說明: nRF24L01射頻模塊發(fā)射模式初始化子函數(shù)
* 功能描述: 對nRF24L01的接收模式進行設(shè)置, 只需把ce位置位后130us,模塊開始監(jiān)視空中信息.
* 全局變量: 無
* 調(diào)用函數(shù): SPI_Write_Buf()
* 輸 入: 無
* 返 回: 無
* 設(shè) 計 者:高朝偉 日期: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..
}
/********************************************************************************
* 函 數(shù) 名:void init_RF_receive(void)
* 函數(shù)說明: nRF24L01射頻模塊接收模式初始化子函數(shù)
* 功能描述: 對nRF24L01的接收模式進行設(shè)置, 只需把ce位置位后130us,模塊開始監(jiān)視空中信息.
* 全局變量: 無
* 調(diào)用函數(shù): SPI_Write_Buf()
* 輸 入: 無
* 返 回: 無
* 設(shè) 計 者:高朝偉 日期: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 + -