|
本人新手正上大学 手上有BF531开发板, 所以准备通过板上的SPI接口来玩无线传输 ,但是弄了好久一直无法使用也不知道什么地方有错,所以请坛上的高手们帮帮忙
以下是我的接口
NRF2401接口 (原文件名:nrf2401接口.jpg)
531的spi接口 (原文件名:spi.jpg)
以下下是我的程序
/********************************************************************************
* name:init_sys.c
* 作者:tomjark
* 创建时间:2010-08-05
* 描述:系统初始化配置
*********************************************************************************/
#include "NRF24L001.h"
#define SET_MSEL(x) (((x)&0x3F) << 0x9) /* Set MSEL = 0-63 --> VCO = CLKIN*MSEL*/
#define SET_SSEL(x) ((x)&0xF) /* Set SSEL = 0-15 --> SCLK = VCO/SSEL */
/****************************************************************************
* 名称 : Init_PLL
* 功能 : 配置处理器的内核与系统时钟
*************************************************************/
void Init_PLL(void)
{
//*pSIC_IWR0 |= 0x1;
*pPLL_CTL = SET_MSEL(18); //Core Clock 27MHz * 18 = 486MHz
idle();
*pPLL_DIV = SET_SSEL(3); //System Clock CCLK / 4 = 121MHz
ssync();
*pVR_CTL = 0x40FB;
ssync();
idle();
}
void Init_SPI()
{
*pSPI_CTL = 0X5401;// SPI enable|Master| controled by software|MSB 8bit|Miso enable
*pFIO_DIR = PF9+PF8; //Set PF8 and PF9 output CE=PF8 CSN=PF9
*pSPI_BAUD = 0x000A; //SPIx_SCK(spi clock) = SCLK(system clock) / (2 * SPIx_BUAD)
}
//SPI send a word function
void SPI_send_data(uchar data)
{
*pSPI_TDBR = data;
while ((*pSPI_STAT & 0x0001) == 0) ;
ssync();
}
//SPI receive a word functionuchar SPI_receive_data(uchar data)
uchar SPI_receive_data(void)
{
SPI_send_data(0xFF);
ssync();
return (*pSPI_RDBR);
}
//Clear the RDBR
void SPI_RDBR_Clr(void)
{
unsigned char buf;
while (*pSPI_STAT & 0x0020) //When Rx is full
buf = *pSPI_RDBR; //read the RDBR
ssync();
}
//SET CS
void CSN_SET_LOW(void)
{
*pFIO_FLAG_C = PF9;
ssync();
}
void CSN_SET_HIGH(void)
{
* pFIO_FLAG_S =PF9;
ssync();
}
void CE_SET_LOW(void)
{
*pFIO_FLAG_C = PF8;
ssync();
}
void CE_SET_HIGH(void)
{
* pFIO_FLAG_S =PF8;
ssync();
}
/************************************************************
*file name : SPI_NRF2401
*
*
*
************************************************************/
#include "NRF24L001.h"
#define unsigned char uchar
#define RX_DR STATUS|0x06
#define TX_DS STATUS|0x05
#define MAX_RT STATUS|0x04
uchar TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // Define a static TX address
uchar RX_ADDRESS[RX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // Define a static RX address
uchar sta;
/**************************************************
Function: inerDelay();
Description:
delay "n" us or ms when use this function
**************************************************/
void inerDelay_us(uchar n)
{
int i,j;
for(i=n;i>0;i--){
for(j=0;j<30;j++)
{
j=j;
}
}
}
void Delay_ms(uchar n)
{
int i;
for(i=n;i>0;i--)
inerDelay_us(60);
}
/**************************************************
Function: SPI_Write_Reg();
Description:
Writes value 'value' to register 'reg'
**************************************************/
void SPI_Write_Reg(uchar reg,uchar value)
{
//uchar status;
CSN_SET_LOW();
SPI_send_data(WRITE_REG+reg);
SPI_send_data(value);
CSN_SET_HIGH();
//return(reg);
}
/**************************************************
Function: SPI_Read();
Description:
Read one uchar from nRF24L01 register, 'reg'
**************************************************/
uchar SPI_Read_Reg(uchar reg)
{
uchar regtemp;
CSN_SET_LOW(); // CSN low, initialize SPI communication...
SPI_send_data(READ_REG+reg);
//SPI_RDBR_Clr();
regtemp=SPI_receive_data();
//printf("the reg is %s",regtemp);
CSN_SET_HIGH();
// CSN high, terminate SPI communication
return(regtemp); // return register value
}
/**************************************************
Function: SPI_Write_Buf();
Description:
Writes contents of buffer '*pBuf' to nRF24L01
Typically used to write TX payload, Rx/Tx address
**************************************************/
void SPI_Write_Buf(uchar reg, uchar *pTBuf, uchar bytes)
{
uchar status,byte_ctr;
CSN_SET_LOW();
SPI_send_data(WRITE_REG+reg);
for(byte_ctr=0; byte_ctr<bytes; byte_ctr++)
{
SPI_send_data(*pTBuf++);
}
CSN_SET_HIGH(); // Set CSN high again
}
/**************************************************
Function: SPI_Read_Buf();
Description:
**************************************************/
void SPI_Read_Buf(uchar reg, uchar *pRBuf, uchar bytes)
{
uchar byte_ctr;
CSN_SET_LOW(); // Set CSN low, init SPI tranaction
SPI_Read_Reg(reg); // Select register to write to and read status uchar
for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
{
pRBuf[byte_ctr] = SPI_receive_data(); //
}
CSN_SET_HIGH();
}
/**************************************************
*Function: SetRX_Mode();
*
* Description:
* 设置nrf2401为接收模式
**************************************************/
void SetRX_Mode(void)
{
SPI_send_data(FLUSH_RX); //清除rx fifo
SPI_Write_Reg( CONFIG, 0x39); //进入掉电模式来配置寄存器 0011 1011 接收模式
//SPI_Write_Buf(RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // Use the same address on the RX device as the TX device
SPI_Write_Reg(EN_AA, 0x01); //P0 auto answer enable
SPI_Write_Reg( EN_RXADDR, 0x01); // chanel po enable to receive
//SPI_Write_Reg(RF_CH, 0); // RF channel frenquencey
SPI_Write_Reg(RX_PW_P0, RX_PLOAD_WIDTH); //接收通道数据位宽为20
//SPI_Write_Reg( RF_SETUP, 0x07); //射频寄存器 数字传输率和发送功率为2M 0db
SPI_Write_Reg(CONFIG, 0x3B); //8位 CRC校验 接收模式
}
/**************************************************
*Function: SetTX_Mode();
*
* Description:
* 设置nrf2401为发送模式
**************************************************/
void SetTX_Mode(void)
{
SPI_send_data(FLUSH_TX); //清除TX fifo
SPI_Write_Reg(CONFIG, 0x58); //进入掉电模式来配置寄存器 0101 1000 发送模式
//SPI_Write_Buf(TX_ADDR, RX_ADDRESS, TX_ADR_WIDTH); // Use the same address on the TX device as the RX device
SPI_Write_Reg(EN_AA, 0x00); //P0 auto answer enable/disable
SPI_Write_Reg(EN_RXADDR, 0x01); // chanel po enable to receive
//SPI_Write_Reg(RF_CH, 0); // RF channel frenquencey
SPI_Write_Reg(RX_PW_P0, RX_PLOAD_WIDTH); //接收通道数据位宽为20
SPI_Write_Reg(STATUS,0x7E); //clear the interrupt
//SPI_Write_Reg(RF_SETUP, 0x07); //射频寄存器 数字传输率和发送功率为2M 0db
SPI_Write_Reg(CONFIG, 0x5A); //8位CRC校验 发送模式 5A
}
void config_chk()
{
uchar reg_val=0;
reg_val = SPI_Read_Reg(CONFIG);
printf("CONFIG IS 0x%X \n",reg_val); reg_val=0;
reg_val = SPI_Read_Reg(EN_AA);
printf("EN_AA IS 0x%X \n",reg_val); reg_val=0;
reg_val = SPI_Read_Reg(EN_RXADDR);
printf("EN_RXADDR IS 0x%X \n",reg_val); reg_val=0;
reg_val = SPI_Read_Reg(RX_PW_P0);
printf("RX_PW_P0 IS 0x%X \n",reg_val); reg_val=0;
}
/**************************************************
Function: nRF24L01_TxPacket();
Description:
This function initializes one nRF24L01 device to
TX mode, set TX address, set RX address for auto.ack,
fill TX payload, select RF channel, datarate & TX pwr.
PWR_UP is set, CRC(2 bytes) is enabled, & PRIM:TX.
ToDo: One high pulse(>10us) on CE will now send this
packet and expext an acknowledgment from the RX device.
**************************************************/
void nRF24L01_TxPacket(uchar * tx_buf)
{
uchar temp,i;
SPI_send_data(FLUSH_TX); //清除TX fifo
CSN_SET_LOW();
SPI_send_data(WR_TX_PLOAD);
for(i=0;i<TX_PLOAD_WIDTH;i++){
SPI_send_data(tx_buf);
}
CSN_SET_HIGH;
CE_SET_HIGH;
inerDelay_us(20);
CE_SET_LOW;
inerDelay_us(150);
SPI_Write_Reg(STATUS,0x20);//clr the TX_DS interrupt
SPI_send_data(FLUSH_TX); //清除TX fifo
}
/**************************************************
*Function: nRF24L01_RxPacket();
*
* Description:
* 设置nrf2401为接收模式
**************************************************/
void nRF24L01_RxPacket(uchar* rx_buf)
{
uchar temp,i;
CSN_SET_LOW;
SPI_send_data(RD_RX_PLOAD);
for(i=0;i<TX_PLOAD_WIDTH;i++)
{
temp=SPI_receive_data();
rx_buf = temp;
}
CSN_SET_HIGH;
SPI_Write_Reg(STATUS,0x40);//clr the RX_DR interrupt
SPI_send_data(FLUSH_RX);
}
以下是主程序
/*****************************************************************************
* NRF24L001.c
*****************************************************************************/
#include <stdio.h>
#include "NRF24L001.h"
void main( void )
{
Init_PLL();
Init_SPI();
unsigned char tsbuf[20]={0};
unsigned char rsbuf[20]={0};
int i;
for(i=0;i<20;i++){
tsbuf=i*2+1;}
for(i=0;i<20;i++){
SetTX_Mode();
config_chk();
nRF24L01_TxPacket(tsbuf);
//SetRX_Mode();
//config_chk();
//nRF24L01_RxPacket(rsbuf);
printf("NRF transmit is OK\n");
}
}
工程下载
点击此处下载 ourdev_574788.rar(文件大小:56K) (原文件名:NRF2401NEW.rar) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|