搜索
bottom↓
回复: 1

求救:基于blackfin BF531处理器的NRF24L01 应用

[复制链接]

出0入0汤圆

发表于 2010-8-13 14:41:27 | 显示全部楼层 |阅读模式
本人新手正上大学 手上有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周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2010-8-13 15:21:15 | 显示全部楼层
在线等。多谢啦。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-7 14:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表