TI中文支持网
TI专业的中文技术问题搜集分享网站

28027 用IO口模拟SPI控制24L01

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File

#include "f2802x_common/include/adc.h"
#include "f2802x_common/include/clk.h"
#include "f2802x_common/include/flash.h"
#include "f2802x_common/include/gpio.h"
#include "f2802x_common/include/pie.h"
#include "f2802x_common/include/pll.h"
#include "f2802x_common/include/timer.h"
#include "f2802x_common/include/wdog.h"
GPIO_Handle myGpio;
#define CE_HIGH GPIO_setHigh(myGpio,GPIO_Number_0)
#define CE_LOW GPIO_setLow(myGpio,GPIO_Number_0)
#define CSN_HIGH GPIO_setHigh(myGpio,GPIO_Number_1)
#define CSN_LOW GPIO_setLow(myGpio,GPIO_Number_1)
#define MOSI_HIGH GPIO_setHigh(myGpio,GPIO_Number_2)
#define MOSI_LOW GPIO_setLow(myGpio,GPIO_Number_2)
#define SCK_HIGH GPIO_setHigh(myGpio,GPIO_Number_3)
#define SCK_LOW GPIO_setLow(myGpio,GPIO_Number_3)
#define MISO GpioDataRegs.GPADAT.bit.GPIO4
#define IRQ GpioDataRegs.GPADAT.bit.GPIO5
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

#define uchar unsigned char
#define uint  unsigned int

/**********  NRF24L01寄存器操作命令  ***********/
#define READ_REG        0x00  //读配置寄存器,低5位为寄存器地址
#define WRITE_REG       0x20  //写配置寄存器,低5位为寄存器地址
#define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
#define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
#define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
#define NOP             0xFF  //空操作,可以用来读状态寄存器
/**********  NRF24L01寄存器地址   *************/
#define CONFIG          0x00  //配置寄存器地址
#define EN_AA           0x01  //使能自动应答功能
#define EN_RXADDR       0x02  //接收地址允许
#define SETUP_AW        0x03  //设置地址宽度(所有数据通道)
#define SETUP_RETR      0x04  //建立自动重发
#define RF_CH           0x05  //RF通道
#define RF_SETUP        0x06  //RF寄存器
#define STATUS          0x07  //状态寄存器
#define OBSERVE_TX      0x08  // 发送检测寄存器
#define CD              0x09  // 载波检测寄存器
#define RX_ADDR_P0      0x0A  // 数据通道0接收地址
#define RX_ADDR_P1      0x0B  // 数据通道1接收地址
#define RX_ADDR_P2      0x0C  // 数据通道2接收地址
#define RX_ADDR_P3      0x0D  // 数据通道3接收地址
#define RX_ADDR_P4      0x0E  // 数据通道4接收地址
#define RX_ADDR_P5      0x0F  // 数据通道5接收地址
#define TX_ADDR         0x10  // 发送地址寄存器
#define RX_PW_P0        0x11  // 接收数据通道0有效数据宽度(1~32字节)
#define RX_PW_P1        0x12  // 接收数据通道1有效数据宽度(1~32字节)
#define RX_PW_P2        0x13  // 接收数据通道2有效数据宽度(1~32字节)
#define RX_PW_P3        0x14  // 接收数据通道3有效数据宽度(1~32字节)
#define RX_PW_P4        0x15  // 接收数据通道4有效数据宽度(1~32字节)
#define RX_PW_P5        0x16  // 接收数据通道5有效数据宽度(1~32字节)
#define FIFO_STATUS     0x17  // FIFO状态寄存器
/*————————————————————————————————————————————————————————————————————*/

/******   STATUS寄存器bit位定义      *******/
#define MAX_TX      0x10  //达到最大发送次数中断
#define TX_OK       0x20  //TX发送完成中断
#define RX_OK       0x40  //接收到数据中断
/*——————————————————————————————————————————————————*/

/*********     24L01发送接收数据宽度定义      ***********/
#define TX_ADR_WIDTH    5   //5字节地址宽度
#define RX_ADR_WIDTH    5   //5字节地址宽度
#define TX_PLOAD_WIDTH  32  //32字节有效数据宽度
#define RX_PLOAD_WIDTH  32  //32字节有效数据宽度
uchar test;

const uchar TX_ADDRESS[TX_ADR_WIDTH]={0x68,0x86,0x66,0x88,0x28}; //发送地址
const uchar RX_ADDRESS[RX_ADR_WIDTH]={0x68,0x86,0x66,0x88,0x28}; //发送地址
uchar PEOPLETOPEOPLE;
uchar rece_buf[32];
void delay_us(uint num)
{
    uint i;

    for(i=0;i<num;i++)
     ;
}

void delay_150us()
{
    uint i;

    for(i=0;i<150;i++);
}

uchar SPI_rW2(uchar byte)
{
    uchar bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // 输出8位
    {
        PEOPLETOPEOPLE=byte&0x80;
        if(PEOPLETOPEOPLE!=0)
            {
                MOSI_HIGH;
            }
        if(PEOPLETOPEOPLE==0)
            {
                MOSI_LOW;
            }// MSB TO MOSI
        delay_us(2);
        byte=(byte<<1);    // shift next bit to MSB
        //delay_us(50);
        SCK_HIGH;
        delay_us(2);
        test=MISO;
        byte|=test;            // capture current MISO bit//1

        SCK_LOW;
    }
    return byte;
}

/*********************************************/
/* 函数功能:给24L01的寄存器写值(一个字节) */
/* 入口参数:reg   要写的寄存器地址          */
/*           value 给寄存器写的值            */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Write_Reg(uchar reg,uchar value)
{
    uchar status;

    CSN_LOW;                 //CSN=0;
      status = SPI_rW2(reg);//发送寄存器地址,并读取状态值
    SPI_rW2(value);
    CSN_HIGH;                  //CSN=1;
    CSN_LOW;
    CSN_LOW;
    CSN_HIGH;

    return status;
}
/*************************************************/
/* 函数功能:读24L01的寄存器值 (一个字节)      */
/* 入口参数:reg  要读的寄存器地址               */
/* 出口参数:value 读出寄存器的值                */
/*************************************************/
uchar NRF24L01_Read_Reg(uchar reg)
{
     uchar value;

    CSN_LOW;              //CSN=0;
      SPI_rW2(reg);//发送寄存器值(位置),并读取状态值
    value = SPI_rW2(NOP);
    CSN_HIGH;             //CSN=1;

    return value;
}
/*********************************************/
/* 函数功能:读24L01的寄存器值(多个字节)   */
/* 入口参数:reg   寄存器地址                */
/*           *pBuf 读出寄存器值的存放数组    */
/*           len   数组字节长度              */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Read_Buf(uchar reg,uchar *pBuf,uchar len)
{
    uchar status,u8_ctr;
    CSN_LOW;                   //CSN=0
      status=SPI_rW2(reg);//发送寄存器地址,并读取状态值
     for(u8_ctr=0;u8_ctr<len;u8_ctr++)
    {pBuf[u8_ctr]=SPI_rW2(0Xff);}//读出数据
    CSN_HIGH;                 //CSN=1
      return status;        //返回读到的状态值
}
/**********************************************/
/* 函数功能:给24L01的寄存器写值(多个字节)  */
/* 入口参数:reg  要写的寄存器地址            */
/*           *pBuf 值的存放数组               */
/*           len   数组字节长度               */
/**********************************************/
uchar NRF24L01_Write_Buf(uchar reg, uchar *pBuf, uchar len)
{
    uchar status,u8_ctr;
    CSN_LOW;
      status = SPI_rW2(reg);//发送寄存器值(位置),并读取状态值
      for(u8_ctr=0; u8_ctr<len; u8_ctr++)
    {SPI_rW2(*pBuf++);delay_us(2);} //写入数据
    CSN_HIGH;
      return status;          //返回读到的状态值
}

/*********************************************/
/* 函数功能:24L01接收数据                   */
/* 入口参数:rxbuf 接收数据数组              */
/* 返回值: 0   成功收到数据                 */
/*          1   没有收到数据                 */
/*********************************************/
uchar NRF24L01_RxPacket(uchar *rxbuf)
{
    uchar state;

    state=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值
    NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
    if(state&RX_OK)//接收到数据
    {
        CE_LOW;
        NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
        NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
        CE_HIGH;
        delay_150us();
        return 0;
    }
    return 1;//没收到任何数据
}
/**********************************************/
/* 函数功能:设置24L01为发送模式              */
/* 入口参数:txbuf  发送数据数组              */
/* 返回值; 0x10    达到最大重发次数,发送失败*/
/*          0x20    成功发送完成              */
/*          0xff    发送失败                  */
/**********************************************/
uchar NRF24L01_TxPacket(uchar *txbuf)
{
    uchar state;

    CE_LOW;//CE拉低,使能24L01配置
      NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节
     CE_HIGH;//CE置高,使能发送
    while(IRQ==1);//等待发送完成
    state=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值
    NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
    if(state&MAX_TX)//达到最大重发次数
    {
        NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器
        return MAX_TX;
    }
    if(state&TX_OK)//发送完成
    {
        return TX_OK;
    }
    return 0xff;//发送失败
}

/********************************************/
/* 函数功能:检测24L01是否存在              */
/* 返回值;  0  存在                        */
/*           1  不存在                      */
/********************************************/
uchar NRF24L01_Check(void)
{
    uchar check_in_buf[5]={0x11,0x22,0x33,0x44,0x55};
    uchar check_out_buf[5]={0x00};
    SCK_LOW;
    CSN_HIGH;
    CE_LOW;
    NRF24L01_Write_Buf(WRITE_REG+TX_ADDR, check_in_buf, 5);
    NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);
    //CE_HIGH;//||||||||||
    if((check_out_buf[0] == 0x11)&&\
       (check_out_buf[1] == 0x22)&&\
       (check_out_buf[2] == 0x33)&&\
       (check_out_buf[3] == 0x44)&&\
       (check_out_buf[4] == 0x55))
        return 0;
    else
        return 1;
}

void NRF24L01_RT_Init(void)
{
    CE_LOW;
    delay_us(40);
      NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
    NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
      NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(uchar*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址
      NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(uchar*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK
      NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答
      NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址
      NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
      NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);       //设置RF通道为40
      NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
      NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0f);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
      delay_us(40);
    CE_HIGH;    //CE置高,使能发送
    delay_us(40);
}
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

///////////////////////////////
///////////////////////////////

///////////////////////////////
///////////////////////////////
// Prototype statements for functions found within this file.
interrupt void cpu_timer0_isr(void);

uint16_t interruptCount = 0;
uint32_t test_buf=0x0020;
ADC_Handle myAdc;
CLK_Handle myClk;
FLASH_Handle myFlash;

PIE_Handle myPie;
TIMER_Handle myTimer;

void main(void)
{

    CPU_Handle myCpu;
    PLL_Handle myPll;
    WDOG_Handle myWDog;

    // Initialize all the handles needed for this application
    myAdc = ADC_init((void *)ADC_BASE_ADDR, sizeof(ADC_Obj));
    myClk = CLK_init((void *)CLK_BASE_ADDR, sizeof(CLK_Obj));
    myCpu = CPU_init((void *)NULL, sizeof(CPU_Obj));
    myFlash = FLASH_init((void *)FLASH_BASE_ADDR, sizeof(FLASH_Obj));
    myGpio = GPIO_init((void *)GPIO_BASE_ADDR, sizeof(GPIO_Obj));
    myPie = PIE_init((void *)PIE_BASE_ADDR, sizeof(PIE_Obj));
    myPll = PLL_init((void *)PLL_BASE_ADDR, sizeof(PLL_Obj));
    myTimer = TIMER_init((void *)TIMER0_BASE_ADDR, sizeof(TIMER_Obj));
    myWDog = WDOG_init((void *)WDOG_BASE_ADDR, sizeof(WDOG_Obj));
    
    // Perform basic system initialization
    WDOG_disable(myWDog);
    CLK_enableAdcClock(myClk);
    (*Device_cal)();
    
    //Select the internal oscillator 1 as the clock source
    CLK_setOscSrc(myClk, CLK_OscSrc_Internal);
    
    // Setup the PLL for x10 /2 which will yield 50Mhz = 10Mhz * 10 / 2
    PLL_setup(myPll, PLL_Multiplier_10, PLL_DivideSelect_ClkIn_by_2);
    
    // Disable the PIE and all interrupts
    PIE_disable(myPie);
    PIE_disableAllInts(myPie);
    CPU_disableGlobalInts(myCpu);
    CPU_clearIntFlags(myCpu);
    
    // If running from flash copy RAM only functions to RAM   
#ifdef _FLASH
    memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
#endif      

    // Setup a debug vector table and enable the PIE
    PIE_setDebugIntVectorTable(myPie);
    PIE_enable(myPie);

    // Configure CPU-Timer 0 to interrupt every 500 milliseconds:
    // 60MHz CPU Freq, 50 millisecond Period (in uSeconds)
    //    ConfigCpuTimer(&CpuTimer0, 60, 500000);

    // Configure GPIO 0-3 as outputs
    GPIO_setMode(myGpio, GPIO_Number_0, GPIO_0_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_1, GPIO_1_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_2, GPIO_2_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_3, GPIO_3_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_4, GPIO_4_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_5, GPIO_5_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_34, GPIO_34_Mode_GeneralPurpose);
    
    GPIO_setDirection(myGpio, GPIO_Number_0, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_1, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_2, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_3, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_4, GPIO_Direction_Input);
    GPIO_setDirection(myGpio, GPIO_Number_5, GPIO_Direction_Input);
    GPIO_setDirection(myGpio, GPIO_Number_34, GPIO_Direction_Output);

    GPIO_setQualification(myGpio, GPIO_Number_4, GPIO_Qual_Sync);
    GPIO_setQualification(myGpio, GPIO_Number_5, GPIO_Qual_Sync);

    // Enable CPU INT1 which is connected to CPU-Timer 0:
   // CPU_enableInt(myCpu, CPU_IntNumber_1);

    // Enable TINT0 in the PIE: Group 1 interrupt 7
   // PIE_enableTimer0Int(myPie);
    GPIO_setHigh(myGpio,GPIO_Number_34);
    // Enable global Interrupts and higher priority real-time debug events
    CPU_enableGlobalInts(myCpu);
    CPU_enableDebugInt(myCpu);

    while(NRF24L01_Check());
    GPIO_setLow(myGpio,GPIO_Number_34);
    NRF24L01_RT_Init();
    while(1)
    {
        if(IRQ==0)       // 如果接收到无线数据
                {

                        CE_LOW;
                        NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);
                        CE_HIGH;
                        delay_us(15);
                        NRF24L01_TxPacket(rece_buf);
                        CE_LOW;
                        NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);
                        CE_HIGH;

                }
    }
}

无法发送数据

不知道是不是IO口模拟SPI的程序有问题  求大牛解答

uchar SPI_rW2(uchar byte)
{
    uchar bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // 输出8位
    {
        PEOPLETOPEOPLE=byte&0x80;
        if(PEOPLETOPEOPLE!=0)
            {
                MOSI_HIGH;
            }
        if(PEOPLETOPEOPLE==0)
            {
                MOSI_LOW;
            }// MSB TO MOSI
        delay_us(2);
        byte=(byte<<1);    // shift next bit to MSB
        //delay_us(50);
        SCK_HIGH;
        delay_us(2);
        test=MISO;
        byte|=test;            // capture current MISO bit//1

        SCK_LOW;
    }
    return byte;
}

Johnson Chen1:

楼主

首先要确定是软件有问题还是硬件有问题,可以用示波器看一下你的SPI信号时钟和数据是否能输出正常。

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File

#include "f2802x_common/include/adc.h"
#include "f2802x_common/include/clk.h"
#include "f2802x_common/include/flash.h"
#include "f2802x_common/include/gpio.h"
#include "f2802x_common/include/pie.h"
#include "f2802x_common/include/pll.h"
#include "f2802x_common/include/timer.h"
#include "f2802x_common/include/wdog.h"
GPIO_Handle myGpio;
#define CE_HIGH GPIO_setHigh(myGpio,GPIO_Number_0)
#define CE_LOW GPIO_setLow(myGpio,GPIO_Number_0)
#define CSN_HIGH GPIO_setHigh(myGpio,GPIO_Number_1)
#define CSN_LOW GPIO_setLow(myGpio,GPIO_Number_1)
#define MOSI_HIGH GPIO_setHigh(myGpio,GPIO_Number_2)
#define MOSI_LOW GPIO_setLow(myGpio,GPIO_Number_2)
#define SCK_HIGH GPIO_setHigh(myGpio,GPIO_Number_3)
#define SCK_LOW GPIO_setLow(myGpio,GPIO_Number_3)
#define MISO GpioDataRegs.GPADAT.bit.GPIO4
#define IRQ GpioDataRegs.GPADAT.bit.GPIO5
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

#define uchar unsigned char
#define uint  unsigned int

/**********  NRF24L01寄存器操作命令  ***********/
#define READ_REG        0x00  //读配置寄存器,低5位为寄存器地址
#define WRITE_REG       0x20  //写配置寄存器,低5位为寄存器地址
#define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
#define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
#define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
#define NOP             0xFF  //空操作,可以用来读状态寄存器
/**********  NRF24L01寄存器地址   *************/
#define CONFIG          0x00  //配置寄存器地址
#define EN_AA           0x01  //使能自动应答功能
#define EN_RXADDR       0x02  //接收地址允许
#define SETUP_AW        0x03  //设置地址宽度(所有数据通道)
#define SETUP_RETR      0x04  //建立自动重发
#define RF_CH           0x05  //RF通道
#define RF_SETUP        0x06  //RF寄存器
#define STATUS          0x07  //状态寄存器
#define OBSERVE_TX      0x08  // 发送检测寄存器
#define CD              0x09  // 载波检测寄存器
#define RX_ADDR_P0      0x0A  // 数据通道0接收地址
#define RX_ADDR_P1      0x0B  // 数据通道1接收地址
#define RX_ADDR_P2      0x0C  // 数据通道2接收地址
#define RX_ADDR_P3      0x0D  // 数据通道3接收地址
#define RX_ADDR_P4      0x0E  // 数据通道4接收地址
#define RX_ADDR_P5      0x0F  // 数据通道5接收地址
#define TX_ADDR         0x10  // 发送地址寄存器
#define RX_PW_P0        0x11  // 接收数据通道0有效数据宽度(1~32字节)
#define RX_PW_P1        0x12  // 接收数据通道1有效数据宽度(1~32字节)
#define RX_PW_P2        0x13  // 接收数据通道2有效数据宽度(1~32字节)
#define RX_PW_P3        0x14  // 接收数据通道3有效数据宽度(1~32字节)
#define RX_PW_P4        0x15  // 接收数据通道4有效数据宽度(1~32字节)
#define RX_PW_P5        0x16  // 接收数据通道5有效数据宽度(1~32字节)
#define FIFO_STATUS     0x17  // FIFO状态寄存器
/*————————————————————————————————————————————————————————————————————*/

/******   STATUS寄存器bit位定义      *******/
#define MAX_TX      0x10  //达到最大发送次数中断
#define TX_OK       0x20  //TX发送完成中断
#define RX_OK       0x40  //接收到数据中断
/*——————————————————————————————————————————————————*/

/*********     24L01发送接收数据宽度定义      ***********/
#define TX_ADR_WIDTH    5   //5字节地址宽度
#define RX_ADR_WIDTH    5   //5字节地址宽度
#define TX_PLOAD_WIDTH  32  //32字节有效数据宽度
#define RX_PLOAD_WIDTH  32  //32字节有效数据宽度
uchar test;

const uchar TX_ADDRESS[TX_ADR_WIDTH]={0x68,0x86,0x66,0x88,0x28}; //发送地址
const uchar RX_ADDRESS[RX_ADR_WIDTH]={0x68,0x86,0x66,0x88,0x28}; //发送地址
uchar PEOPLETOPEOPLE;
uchar rece_buf[32];
void delay_us(uint num)
{
    uint i;

    for(i=0;i<num;i++)
     ;
}

void delay_150us()
{
    uint i;

    for(i=0;i<150;i++);
}

uchar SPI_rW2(uchar byte)
{
    uchar bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // 输出8位
    {
        PEOPLETOPEOPLE=byte&0x80;
        if(PEOPLETOPEOPLE!=0)
            {
                MOSI_HIGH;
            }
        if(PEOPLETOPEOPLE==0)
            {
                MOSI_LOW;
            }// MSB TO MOSI
        delay_us(2);
        byte=(byte<<1);    // shift next bit to MSB
        //delay_us(50);
        SCK_HIGH;
        delay_us(2);
        test=MISO;
        byte|=test;            // capture current MISO bit//1

        SCK_LOW;
    }
    return byte;
}

/*********************************************/
/* 函数功能:给24L01的寄存器写值(一个字节) */
/* 入口参数:reg   要写的寄存器地址          */
/*           value 给寄存器写的值            */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Write_Reg(uchar reg,uchar value)
{
    uchar status;

    CSN_LOW;                 //CSN=0;
      status = SPI_rW2(reg);//发送寄存器地址,并读取状态值
    SPI_rW2(value);
    CSN_HIGH;                  //CSN=1;
    CSN_LOW;
    CSN_LOW;
    CSN_HIGH;

    return status;
}
/*************************************************/
/* 函数功能:读24L01的寄存器值 (一个字节)      */
/* 入口参数:reg  要读的寄存器地址               */
/* 出口参数:value 读出寄存器的值                */
/*************************************************/
uchar NRF24L01_Read_Reg(uchar reg)
{
     uchar value;

    CSN_LOW;              //CSN=0;
      SPI_rW2(reg);//发送寄存器值(位置),并读取状态值
    value = SPI_rW2(NOP);
    CSN_HIGH;             //CSN=1;

    return value;
}
/*********************************************/
/* 函数功能:读24L01的寄存器值(多个字节)   */
/* 入口参数:reg   寄存器地址                */
/*           *pBuf 读出寄存器值的存放数组    */
/*           len   数组字节长度              */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Read_Buf(uchar reg,uchar *pBuf,uchar len)
{
    uchar status,u8_ctr;
    CSN_LOW;                   //CSN=0
      status=SPI_rW2(reg);//发送寄存器地址,并读取状态值
     for(u8_ctr=0;u8_ctr<len;u8_ctr++)
    {pBuf[u8_ctr]=SPI_rW2(0Xff);}//读出数据
    CSN_HIGH;                 //CSN=1
      return status;        //返回读到的状态值
}
/**********************************************/
/* 函数功能:给24L01的寄存器写值(多个字节)  */
/* 入口参数:reg  要写的寄存器地址            */
/*           *pBuf 值的存放数组               */
/*           len   数组字节长度               */
/**********************************************/
uchar NRF24L01_Write_Buf(uchar reg, uchar *pBuf, uchar len)
{
    uchar status,u8_ctr;
    CSN_LOW;
      status = SPI_rW2(reg);//发送寄存器值(位置),并读取状态值
      for(u8_ctr=0; u8_ctr<len; u8_ctr++)
    {SPI_rW2(*pBuf++);delay_us(2);} //写入数据
    CSN_HIGH;
      return status;          //返回读到的状态值
}

/*********************************************/
/* 函数功能:24L01接收数据                   */
/* 入口参数:rxbuf 接收数据数组              */
/* 返回值: 0   成功收到数据                 */
/*          1   没有收到数据                 */
/*********************************************/
uchar NRF24L01_RxPacket(uchar *rxbuf)
{
    uchar state;

    state=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值
    NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
    if(state&RX_OK)//接收到数据
    {
        CE_LOW;
        NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
        NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
        CE_HIGH;
        delay_150us();
        return 0;
    }
    return 1;//没收到任何数据
}
/**********************************************/
/* 函数功能:设置24L01为发送模式              */
/* 入口参数:txbuf  发送数据数组              */
/* 返回值; 0x10    达到最大重发次数,发送失败*/
/*          0x20    成功发送完成              */
/*          0xff    发送失败                  */
/**********************************************/
uchar NRF24L01_TxPacket(uchar *txbuf)
{
    uchar state;

    CE_LOW;//CE拉低,使能24L01配置
      NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节
     CE_HIGH;//CE置高,使能发送
    while(IRQ==1);//等待发送完成
    state=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值
    NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
    if(state&MAX_TX)//达到最大重发次数
    {
        NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器
        return MAX_TX;
    }
    if(state&TX_OK)//发送完成
    {
        return TX_OK;
    }
    return 0xff;//发送失败
}

/********************************************/
/* 函数功能:检测24L01是否存在              */
/* 返回值;  0  存在                        */
/*           1  不存在                      */
/********************************************/
uchar NRF24L01_Check(void)
{
    uchar check_in_buf[5]={0x11,0x22,0x33,0x44,0x55};
    uchar check_out_buf[5]={0x00};
    SCK_LOW;
    CSN_HIGH;
    CE_LOW;
    NRF24L01_Write_Buf(WRITE_REG+TX_ADDR, check_in_buf, 5);
    NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);
    //CE_HIGH;//||||||||||
    if((check_out_buf[0] == 0x11)&&\
       (check_out_buf[1] == 0x22)&&\
       (check_out_buf[2] == 0x33)&&\
       (check_out_buf[3] == 0x44)&&\
       (check_out_buf[4] == 0x55))
        return 0;
    else
        return 1;
}

void NRF24L01_RT_Init(void)
{
    CE_LOW;
    delay_us(40);
      NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
    NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
      NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(uchar*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址
      NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(uchar*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK
      NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答
      NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址
      NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
      NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);       //设置RF通道为40
      NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
      NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0f);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
      delay_us(40);
    CE_HIGH;    //CE置高,使能发送
    delay_us(40);
}
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

///////////////////////////////
///////////////////////////////

///////////////////////////////
///////////////////////////////
// Prototype statements for functions found within this file.
interrupt void cpu_timer0_isr(void);

uint16_t interruptCount = 0;
uint32_t test_buf=0x0020;
ADC_Handle myAdc;
CLK_Handle myClk;
FLASH_Handle myFlash;

PIE_Handle myPie;
TIMER_Handle myTimer;

void main(void)
{

    CPU_Handle myCpu;
    PLL_Handle myPll;
    WDOG_Handle myWDog;

    // Initialize all the handles needed for this application
    myAdc = ADC_init((void *)ADC_BASE_ADDR, sizeof(ADC_Obj));
    myClk = CLK_init((void *)CLK_BASE_ADDR, sizeof(CLK_Obj));
    myCpu = CPU_init((void *)NULL, sizeof(CPU_Obj));
    myFlash = FLASH_init((void *)FLASH_BASE_ADDR, sizeof(FLASH_Obj));
    myGpio = GPIO_init((void *)GPIO_BASE_ADDR, sizeof(GPIO_Obj));
    myPie = PIE_init((void *)PIE_BASE_ADDR, sizeof(PIE_Obj));
    myPll = PLL_init((void *)PLL_BASE_ADDR, sizeof(PLL_Obj));
    myTimer = TIMER_init((void *)TIMER0_BASE_ADDR, sizeof(TIMER_Obj));
    myWDog = WDOG_init((void *)WDOG_BASE_ADDR, sizeof(WDOG_Obj));
    
    // Perform basic system initialization
    WDOG_disable(myWDog);
    CLK_enableAdcClock(myClk);
    (*Device_cal)();
    
    //Select the internal oscillator 1 as the clock source
    CLK_setOscSrc(myClk, CLK_OscSrc_Internal);
    
    // Setup the PLL for x10 /2 which will yield 50Mhz = 10Mhz * 10 / 2
    PLL_setup(myPll, PLL_Multiplier_10, PLL_DivideSelect_ClkIn_by_2);
    
    // Disable the PIE and all interrupts
    PIE_disable(myPie);
    PIE_disableAllInts(myPie);
    CPU_disableGlobalInts(myCpu);
    CPU_clearIntFlags(myCpu);
    
    // If running from flash copy RAM only functions to RAM   
#ifdef _FLASH
    memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
#endif      

    // Setup a debug vector table and enable the PIE
    PIE_setDebugIntVectorTable(myPie);
    PIE_enable(myPie);

    // Configure CPU-Timer 0 to interrupt every 500 milliseconds:
    // 60MHz CPU Freq, 50 millisecond Period (in uSeconds)
    //    ConfigCpuTimer(&CpuTimer0, 60, 500000);

    // Configure GPIO 0-3 as outputs
    GPIO_setMode(myGpio, GPIO_Number_0, GPIO_0_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_1, GPIO_1_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_2, GPIO_2_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_3, GPIO_3_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_4, GPIO_4_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_5, GPIO_5_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_34, GPIO_34_Mode_GeneralPurpose);
    
    GPIO_setDirection(myGpio, GPIO_Number_0, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_1, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_2, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_3, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_4, GPIO_Direction_Input);
    GPIO_setDirection(myGpio, GPIO_Number_5, GPIO_Direction_Input);
    GPIO_setDirection(myGpio, GPIO_Number_34, GPIO_Direction_Output);

    GPIO_setQualification(myGpio, GPIO_Number_4, GPIO_Qual_Sync);
    GPIO_setQualification(myGpio, GPIO_Number_5, GPIO_Qual_Sync);

    // Enable CPU INT1 which is connected to CPU-Timer 0:
   // CPU_enableInt(myCpu, CPU_IntNumber_1);

    // Enable TINT0 in the PIE: Group 1 interrupt 7
   // PIE_enableTimer0Int(myPie);
    GPIO_setHigh(myGpio,GPIO_Number_34);
    // Enable global Interrupts and higher priority real-time debug events
    CPU_enableGlobalInts(myCpu);
    CPU_enableDebugInt(myCpu);

    while(NRF24L01_Check());
    GPIO_setLow(myGpio,GPIO_Number_34);
    NRF24L01_RT_Init();
    while(1)
    {
        if(IRQ==0)       // 如果接收到无线数据
                {

                        CE_LOW;
                        NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);
                        CE_HIGH;
                        delay_us(15);
                        NRF24L01_TxPacket(rece_buf);
                        CE_LOW;
                        NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);
                        CE_HIGH;

                }
    }
}

无法发送数据

不知道是不是IO口模拟SPI的程序有问题  求大牛解答

uchar SPI_rW2(uchar byte)
{
    uchar bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // 输出8位
    {
        PEOPLETOPEOPLE=byte&0x80;
        if(PEOPLETOPEOPLE!=0)
            {
                MOSI_HIGH;
            }
        if(PEOPLETOPEOPLE==0)
            {
                MOSI_LOW;
            }// MSB TO MOSI
        delay_us(2);
        byte=(byte<<1);    // shift next bit to MSB
        //delay_us(50);
        SCK_HIGH;
        delay_us(2);
        test=MISO;
        byte|=test;            // capture current MISO bit//1

        SCK_LOW;
    }
    return byte;
}

ZHANGGE CHENG:

回复 Johnson Chen1:

谢谢  该问题已解决   可以正常通信

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File

#include "f2802x_common/include/adc.h"
#include "f2802x_common/include/clk.h"
#include "f2802x_common/include/flash.h"
#include "f2802x_common/include/gpio.h"
#include "f2802x_common/include/pie.h"
#include "f2802x_common/include/pll.h"
#include "f2802x_common/include/timer.h"
#include "f2802x_common/include/wdog.h"
GPIO_Handle myGpio;
#define CE_HIGH GPIO_setHigh(myGpio,GPIO_Number_0)
#define CE_LOW GPIO_setLow(myGpio,GPIO_Number_0)
#define CSN_HIGH GPIO_setHigh(myGpio,GPIO_Number_1)
#define CSN_LOW GPIO_setLow(myGpio,GPIO_Number_1)
#define MOSI_HIGH GPIO_setHigh(myGpio,GPIO_Number_2)
#define MOSI_LOW GPIO_setLow(myGpio,GPIO_Number_2)
#define SCK_HIGH GPIO_setHigh(myGpio,GPIO_Number_3)
#define SCK_LOW GPIO_setLow(myGpio,GPIO_Number_3)
#define MISO GpioDataRegs.GPADAT.bit.GPIO4
#define IRQ GpioDataRegs.GPADAT.bit.GPIO5
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

#define uchar unsigned char
#define uint  unsigned int

/**********  NRF24L01寄存器操作命令  ***********/
#define READ_REG        0x00  //读配置寄存器,低5位为寄存器地址
#define WRITE_REG       0x20  //写配置寄存器,低5位为寄存器地址
#define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
#define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
#define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
#define NOP             0xFF  //空操作,可以用来读状态寄存器
/**********  NRF24L01寄存器地址   *************/
#define CONFIG          0x00  //配置寄存器地址
#define EN_AA           0x01  //使能自动应答功能
#define EN_RXADDR       0x02  //接收地址允许
#define SETUP_AW        0x03  //设置地址宽度(所有数据通道)
#define SETUP_RETR      0x04  //建立自动重发
#define RF_CH           0x05  //RF通道
#define RF_SETUP        0x06  //RF寄存器
#define STATUS          0x07  //状态寄存器
#define OBSERVE_TX      0x08  // 发送检测寄存器
#define CD              0x09  // 载波检测寄存器
#define RX_ADDR_P0      0x0A  // 数据通道0接收地址
#define RX_ADDR_P1      0x0B  // 数据通道1接收地址
#define RX_ADDR_P2      0x0C  // 数据通道2接收地址
#define RX_ADDR_P3      0x0D  // 数据通道3接收地址
#define RX_ADDR_P4      0x0E  // 数据通道4接收地址
#define RX_ADDR_P5      0x0F  // 数据通道5接收地址
#define TX_ADDR         0x10  // 发送地址寄存器
#define RX_PW_P0        0x11  // 接收数据通道0有效数据宽度(1~32字节)
#define RX_PW_P1        0x12  // 接收数据通道1有效数据宽度(1~32字节)
#define RX_PW_P2        0x13  // 接收数据通道2有效数据宽度(1~32字节)
#define RX_PW_P3        0x14  // 接收数据通道3有效数据宽度(1~32字节)
#define RX_PW_P4        0x15  // 接收数据通道4有效数据宽度(1~32字节)
#define RX_PW_P5        0x16  // 接收数据通道5有效数据宽度(1~32字节)
#define FIFO_STATUS     0x17  // FIFO状态寄存器
/*————————————————————————————————————————————————————————————————————*/

/******   STATUS寄存器bit位定义      *******/
#define MAX_TX      0x10  //达到最大发送次数中断
#define TX_OK       0x20  //TX发送完成中断
#define RX_OK       0x40  //接收到数据中断
/*——————————————————————————————————————————————————*/

/*********     24L01发送接收数据宽度定义      ***********/
#define TX_ADR_WIDTH    5   //5字节地址宽度
#define RX_ADR_WIDTH    5   //5字节地址宽度
#define TX_PLOAD_WIDTH  32  //32字节有效数据宽度
#define RX_PLOAD_WIDTH  32  //32字节有效数据宽度
uchar test;

const uchar TX_ADDRESS[TX_ADR_WIDTH]={0x68,0x86,0x66,0x88,0x28}; //发送地址
const uchar RX_ADDRESS[RX_ADR_WIDTH]={0x68,0x86,0x66,0x88,0x28}; //发送地址
uchar PEOPLETOPEOPLE;
uchar rece_buf[32];
void delay_us(uint num)
{
    uint i;

    for(i=0;i<num;i++)
     ;
}

void delay_150us()
{
    uint i;

    for(i=0;i<150;i++);
}

uchar SPI_rW2(uchar byte)
{
    uchar bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // 输出8位
    {
        PEOPLETOPEOPLE=byte&0x80;
        if(PEOPLETOPEOPLE!=0)
            {
                MOSI_HIGH;
            }
        if(PEOPLETOPEOPLE==0)
            {
                MOSI_LOW;
            }// MSB TO MOSI
        delay_us(2);
        byte=(byte<<1);    // shift next bit to MSB
        //delay_us(50);
        SCK_HIGH;
        delay_us(2);
        test=MISO;
        byte|=test;            // capture current MISO bit//1

        SCK_LOW;
    }
    return byte;
}

/*********************************************/
/* 函数功能:给24L01的寄存器写值(一个字节) */
/* 入口参数:reg   要写的寄存器地址          */
/*           value 给寄存器写的值            */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Write_Reg(uchar reg,uchar value)
{
    uchar status;

    CSN_LOW;                 //CSN=0;
      status = SPI_rW2(reg);//发送寄存器地址,并读取状态值
    SPI_rW2(value);
    CSN_HIGH;                  //CSN=1;
    CSN_LOW;
    CSN_LOW;
    CSN_HIGH;

    return status;
}
/*************************************************/
/* 函数功能:读24L01的寄存器值 (一个字节)      */
/* 入口参数:reg  要读的寄存器地址               */
/* 出口参数:value 读出寄存器的值                */
/*************************************************/
uchar NRF24L01_Read_Reg(uchar reg)
{
     uchar value;

    CSN_LOW;              //CSN=0;
      SPI_rW2(reg);//发送寄存器值(位置),并读取状态值
    value = SPI_rW2(NOP);
    CSN_HIGH;             //CSN=1;

    return value;
}
/*********************************************/
/* 函数功能:读24L01的寄存器值(多个字节)   */
/* 入口参数:reg   寄存器地址                */
/*           *pBuf 读出寄存器值的存放数组    */
/*           len   数组字节长度              */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Read_Buf(uchar reg,uchar *pBuf,uchar len)
{
    uchar status,u8_ctr;
    CSN_LOW;                   //CSN=0
      status=SPI_rW2(reg);//发送寄存器地址,并读取状态值
     for(u8_ctr=0;u8_ctr<len;u8_ctr++)
    {pBuf[u8_ctr]=SPI_rW2(0Xff);}//读出数据
    CSN_HIGH;                 //CSN=1
      return status;        //返回读到的状态值
}
/**********************************************/
/* 函数功能:给24L01的寄存器写值(多个字节)  */
/* 入口参数:reg  要写的寄存器地址            */
/*           *pBuf 值的存放数组               */
/*           len   数组字节长度               */
/**********************************************/
uchar NRF24L01_Write_Buf(uchar reg, uchar *pBuf, uchar len)
{
    uchar status,u8_ctr;
    CSN_LOW;
      status = SPI_rW2(reg);//发送寄存器值(位置),并读取状态值
      for(u8_ctr=0; u8_ctr<len; u8_ctr++)
    {SPI_rW2(*pBuf++);delay_us(2);} //写入数据
    CSN_HIGH;
      return status;          //返回读到的状态值
}

/*********************************************/
/* 函数功能:24L01接收数据                   */
/* 入口参数:rxbuf 接收数据数组              */
/* 返回值: 0   成功收到数据                 */
/*          1   没有收到数据                 */
/*********************************************/
uchar NRF24L01_RxPacket(uchar *rxbuf)
{
    uchar state;

    state=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值
    NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
    if(state&RX_OK)//接收到数据
    {
        CE_LOW;
        NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
        NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
        CE_HIGH;
        delay_150us();
        return 0;
    }
    return 1;//没收到任何数据
}
/**********************************************/
/* 函数功能:设置24L01为发送模式              */
/* 入口参数:txbuf  发送数据数组              */
/* 返回值; 0x10    达到最大重发次数,发送失败*/
/*          0x20    成功发送完成              */
/*          0xff    发送失败                  */
/**********************************************/
uchar NRF24L01_TxPacket(uchar *txbuf)
{
    uchar state;

    CE_LOW;//CE拉低,使能24L01配置
      NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节
     CE_HIGH;//CE置高,使能发送
    while(IRQ==1);//等待发送完成
    state=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值
    NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
    if(state&MAX_TX)//达到最大重发次数
    {
        NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器
        return MAX_TX;
    }
    if(state&TX_OK)//发送完成
    {
        return TX_OK;
    }
    return 0xff;//发送失败
}

/********************************************/
/* 函数功能:检测24L01是否存在              */
/* 返回值;  0  存在                        */
/*           1  不存在                      */
/********************************************/
uchar NRF24L01_Check(void)
{
    uchar check_in_buf[5]={0x11,0x22,0x33,0x44,0x55};
    uchar check_out_buf[5]={0x00};
    SCK_LOW;
    CSN_HIGH;
    CE_LOW;
    NRF24L01_Write_Buf(WRITE_REG+TX_ADDR, check_in_buf, 5);
    NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);
    //CE_HIGH;//||||||||||
    if((check_out_buf[0] == 0x11)&&\
       (check_out_buf[1] == 0x22)&&\
       (check_out_buf[2] == 0x33)&&\
       (check_out_buf[3] == 0x44)&&\
       (check_out_buf[4] == 0x55))
        return 0;
    else
        return 1;
}

void NRF24L01_RT_Init(void)
{
    CE_LOW;
    delay_us(40);
      NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
    NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
      NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(uchar*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址
      NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(uchar*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK
      NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答
      NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址
      NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
      NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);       //设置RF通道为40
      NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
      NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0f);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
      delay_us(40);
    CE_HIGH;    //CE置高,使能发送
    delay_us(40);
}
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

///////////////////////////////
///////////////////////////////

///////////////////////////////
///////////////////////////////
// Prototype statements for functions found within this file.
interrupt void cpu_timer0_isr(void);

uint16_t interruptCount = 0;
uint32_t test_buf=0x0020;
ADC_Handle myAdc;
CLK_Handle myClk;
FLASH_Handle myFlash;

PIE_Handle myPie;
TIMER_Handle myTimer;

void main(void)
{

    CPU_Handle myCpu;
    PLL_Handle myPll;
    WDOG_Handle myWDog;

    // Initialize all the handles needed for this application
    myAdc = ADC_init((void *)ADC_BASE_ADDR, sizeof(ADC_Obj));
    myClk = CLK_init((void *)CLK_BASE_ADDR, sizeof(CLK_Obj));
    myCpu = CPU_init((void *)NULL, sizeof(CPU_Obj));
    myFlash = FLASH_init((void *)FLASH_BASE_ADDR, sizeof(FLASH_Obj));
    myGpio = GPIO_init((void *)GPIO_BASE_ADDR, sizeof(GPIO_Obj));
    myPie = PIE_init((void *)PIE_BASE_ADDR, sizeof(PIE_Obj));
    myPll = PLL_init((void *)PLL_BASE_ADDR, sizeof(PLL_Obj));
    myTimer = TIMER_init((void *)TIMER0_BASE_ADDR, sizeof(TIMER_Obj));
    myWDog = WDOG_init((void *)WDOG_BASE_ADDR, sizeof(WDOG_Obj));
    
    // Perform basic system initialization
    WDOG_disable(myWDog);
    CLK_enableAdcClock(myClk);
    (*Device_cal)();
    
    //Select the internal oscillator 1 as the clock source
    CLK_setOscSrc(myClk, CLK_OscSrc_Internal);
    
    // Setup the PLL for x10 /2 which will yield 50Mhz = 10Mhz * 10 / 2
    PLL_setup(myPll, PLL_Multiplier_10, PLL_DivideSelect_ClkIn_by_2);
    
    // Disable the PIE and all interrupts
    PIE_disable(myPie);
    PIE_disableAllInts(myPie);
    CPU_disableGlobalInts(myCpu);
    CPU_clearIntFlags(myCpu);
    
    // If running from flash copy RAM only functions to RAM   
#ifdef _FLASH
    memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
#endif      

    // Setup a debug vector table and enable the PIE
    PIE_setDebugIntVectorTable(myPie);
    PIE_enable(myPie);

    // Configure CPU-Timer 0 to interrupt every 500 milliseconds:
    // 60MHz CPU Freq, 50 millisecond Period (in uSeconds)
    //    ConfigCpuTimer(&CpuTimer0, 60, 500000);

    // Configure GPIO 0-3 as outputs
    GPIO_setMode(myGpio, GPIO_Number_0, GPIO_0_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_1, GPIO_1_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_2, GPIO_2_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_3, GPIO_3_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_4, GPIO_4_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_5, GPIO_5_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_34, GPIO_34_Mode_GeneralPurpose);
    
    GPIO_setDirection(myGpio, GPIO_Number_0, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_1, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_2, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_3, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_4, GPIO_Direction_Input);
    GPIO_setDirection(myGpio, GPIO_Number_5, GPIO_Direction_Input);
    GPIO_setDirection(myGpio, GPIO_Number_34, GPIO_Direction_Output);

    GPIO_setQualification(myGpio, GPIO_Number_4, GPIO_Qual_Sync);
    GPIO_setQualification(myGpio, GPIO_Number_5, GPIO_Qual_Sync);

    // Enable CPU INT1 which is connected to CPU-Timer 0:
   // CPU_enableInt(myCpu, CPU_IntNumber_1);

    // Enable TINT0 in the PIE: Group 1 interrupt 7
   // PIE_enableTimer0Int(myPie);
    GPIO_setHigh(myGpio,GPIO_Number_34);
    // Enable global Interrupts and higher priority real-time debug events
    CPU_enableGlobalInts(myCpu);
    CPU_enableDebugInt(myCpu);

    while(NRF24L01_Check());
    GPIO_setLow(myGpio,GPIO_Number_34);
    NRF24L01_RT_Init();
    while(1)
    {
        if(IRQ==0)       // 如果接收到无线数据
                {

                        CE_LOW;
                        NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);
                        CE_HIGH;
                        delay_us(15);
                        NRF24L01_TxPacket(rece_buf);
                        CE_LOW;
                        NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);
                        CE_HIGH;

                }
    }
}

无法发送数据

不知道是不是IO口模拟SPI的程序有问题  求大牛解答

uchar SPI_rW2(uchar byte)
{
    uchar bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // 输出8位
    {
        PEOPLETOPEOPLE=byte&0x80;
        if(PEOPLETOPEOPLE!=0)
            {
                MOSI_HIGH;
            }
        if(PEOPLETOPEOPLE==0)
            {
                MOSI_LOW;
            }// MSB TO MOSI
        delay_us(2);
        byte=(byte<<1);    // shift next bit to MSB
        //delay_us(50);
        SCK_HIGH;
        delay_us(2);
        test=MISO;
        byte|=test;            // capture current MISO bit//1

        SCK_LOW;
    }
    return byte;
}

xg ss:

回复 ZHANGGE CHENG:

您好,我的问题与您一样,用的是F28335,无论如何修改程序,24L01发送后就是不能接收到ACK信号,接收端也收不到数据,能告知您是如何解决的吗,我已一周都过不去,谢谢!

 

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File

#include "f2802x_common/include/adc.h"
#include "f2802x_common/include/clk.h"
#include "f2802x_common/include/flash.h"
#include "f2802x_common/include/gpio.h"
#include "f2802x_common/include/pie.h"
#include "f2802x_common/include/pll.h"
#include "f2802x_common/include/timer.h"
#include "f2802x_common/include/wdog.h"
GPIO_Handle myGpio;
#define CE_HIGH GPIO_setHigh(myGpio,GPIO_Number_0)
#define CE_LOW GPIO_setLow(myGpio,GPIO_Number_0)
#define CSN_HIGH GPIO_setHigh(myGpio,GPIO_Number_1)
#define CSN_LOW GPIO_setLow(myGpio,GPIO_Number_1)
#define MOSI_HIGH GPIO_setHigh(myGpio,GPIO_Number_2)
#define MOSI_LOW GPIO_setLow(myGpio,GPIO_Number_2)
#define SCK_HIGH GPIO_setHigh(myGpio,GPIO_Number_3)
#define SCK_LOW GPIO_setLow(myGpio,GPIO_Number_3)
#define MISO GpioDataRegs.GPADAT.bit.GPIO4
#define IRQ GpioDataRegs.GPADAT.bit.GPIO5
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

#define uchar unsigned char
#define uint  unsigned int

/**********  NRF24L01寄存器操作命令  ***********/
#define READ_REG        0x00  //读配置寄存器,低5位为寄存器地址
#define WRITE_REG       0x20  //写配置寄存器,低5位为寄存器地址
#define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
#define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
#define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
#define NOP             0xFF  //空操作,可以用来读状态寄存器
/**********  NRF24L01寄存器地址   *************/
#define CONFIG          0x00  //配置寄存器地址
#define EN_AA           0x01  //使能自动应答功能
#define EN_RXADDR       0x02  //接收地址允许
#define SETUP_AW        0x03  //设置地址宽度(所有数据通道)
#define SETUP_RETR      0x04  //建立自动重发
#define RF_CH           0x05  //RF通道
#define RF_SETUP        0x06  //RF寄存器
#define STATUS          0x07  //状态寄存器
#define OBSERVE_TX      0x08  // 发送检测寄存器
#define CD              0x09  // 载波检测寄存器
#define RX_ADDR_P0      0x0A  // 数据通道0接收地址
#define RX_ADDR_P1      0x0B  // 数据通道1接收地址
#define RX_ADDR_P2      0x0C  // 数据通道2接收地址
#define RX_ADDR_P3      0x0D  // 数据通道3接收地址
#define RX_ADDR_P4      0x0E  // 数据通道4接收地址
#define RX_ADDR_P5      0x0F  // 数据通道5接收地址
#define TX_ADDR         0x10  // 发送地址寄存器
#define RX_PW_P0        0x11  // 接收数据通道0有效数据宽度(1~32字节)
#define RX_PW_P1        0x12  // 接收数据通道1有效数据宽度(1~32字节)
#define RX_PW_P2        0x13  // 接收数据通道2有效数据宽度(1~32字节)
#define RX_PW_P3        0x14  // 接收数据通道3有效数据宽度(1~32字节)
#define RX_PW_P4        0x15  // 接收数据通道4有效数据宽度(1~32字节)
#define RX_PW_P5        0x16  // 接收数据通道5有效数据宽度(1~32字节)
#define FIFO_STATUS     0x17  // FIFO状态寄存器
/*————————————————————————————————————————————————————————————————————*/

/******   STATUS寄存器bit位定义      *******/
#define MAX_TX      0x10  //达到最大发送次数中断
#define TX_OK       0x20  //TX发送完成中断
#define RX_OK       0x40  //接收到数据中断
/*——————————————————————————————————————————————————*/

/*********     24L01发送接收数据宽度定义      ***********/
#define TX_ADR_WIDTH    5   //5字节地址宽度
#define RX_ADR_WIDTH    5   //5字节地址宽度
#define TX_PLOAD_WIDTH  32  //32字节有效数据宽度
#define RX_PLOAD_WIDTH  32  //32字节有效数据宽度
uchar test;

const uchar TX_ADDRESS[TX_ADR_WIDTH]={0x68,0x86,0x66,0x88,0x28}; //发送地址
const uchar RX_ADDRESS[RX_ADR_WIDTH]={0x68,0x86,0x66,0x88,0x28}; //发送地址
uchar PEOPLETOPEOPLE;
uchar rece_buf[32];
void delay_us(uint num)
{
    uint i;

    for(i=0;i<num;i++)
     ;
}

void delay_150us()
{
    uint i;

    for(i=0;i<150;i++);
}

uchar SPI_rW2(uchar byte)
{
    uchar bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // 输出8位
    {
        PEOPLETOPEOPLE=byte&0x80;
        if(PEOPLETOPEOPLE!=0)
            {
                MOSI_HIGH;
            }
        if(PEOPLETOPEOPLE==0)
            {
                MOSI_LOW;
            }// MSB TO MOSI
        delay_us(2);
        byte=(byte<<1);    // shift next bit to MSB
        //delay_us(50);
        SCK_HIGH;
        delay_us(2);
        test=MISO;
        byte|=test;            // capture current MISO bit//1

        SCK_LOW;
    }
    return byte;
}

/*********************************************/
/* 函数功能:给24L01的寄存器写值(一个字节) */
/* 入口参数:reg   要写的寄存器地址          */
/*           value 给寄存器写的值            */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Write_Reg(uchar reg,uchar value)
{
    uchar status;

    CSN_LOW;                 //CSN=0;
      status = SPI_rW2(reg);//发送寄存器地址,并读取状态值
    SPI_rW2(value);
    CSN_HIGH;                  //CSN=1;
    CSN_LOW;
    CSN_LOW;
    CSN_HIGH;

    return status;
}
/*************************************************/
/* 函数功能:读24L01的寄存器值 (一个字节)      */
/* 入口参数:reg  要读的寄存器地址               */
/* 出口参数:value 读出寄存器的值                */
/*************************************************/
uchar NRF24L01_Read_Reg(uchar reg)
{
     uchar value;

    CSN_LOW;              //CSN=0;
      SPI_rW2(reg);//发送寄存器值(位置),并读取状态值
    value = SPI_rW2(NOP);
    CSN_HIGH;             //CSN=1;

    return value;
}
/*********************************************/
/* 函数功能:读24L01的寄存器值(多个字节)   */
/* 入口参数:reg   寄存器地址                */
/*           *pBuf 读出寄存器值的存放数组    */
/*           len   数组字节长度              */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Read_Buf(uchar reg,uchar *pBuf,uchar len)
{
    uchar status,u8_ctr;
    CSN_LOW;                   //CSN=0
      status=SPI_rW2(reg);//发送寄存器地址,并读取状态值
     for(u8_ctr=0;u8_ctr<len;u8_ctr++)
    {pBuf[u8_ctr]=SPI_rW2(0Xff);}//读出数据
    CSN_HIGH;                 //CSN=1
      return status;        //返回读到的状态值
}
/**********************************************/
/* 函数功能:给24L01的寄存器写值(多个字节)  */
/* 入口参数:reg  要写的寄存器地址            */
/*           *pBuf 值的存放数组               */
/*           len   数组字节长度               */
/**********************************************/
uchar NRF24L01_Write_Buf(uchar reg, uchar *pBuf, uchar len)
{
    uchar status,u8_ctr;
    CSN_LOW;
      status = SPI_rW2(reg);//发送寄存器值(位置),并读取状态值
      for(u8_ctr=0; u8_ctr<len; u8_ctr++)
    {SPI_rW2(*pBuf++);delay_us(2);} //写入数据
    CSN_HIGH;
      return status;          //返回读到的状态值
}

/*********************************************/
/* 函数功能:24L01接收数据                   */
/* 入口参数:rxbuf 接收数据数组              */
/* 返回值: 0   成功收到数据                 */
/*          1   没有收到数据                 */
/*********************************************/
uchar NRF24L01_RxPacket(uchar *rxbuf)
{
    uchar state;

    state=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值
    NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
    if(state&RX_OK)//接收到数据
    {
        CE_LOW;
        NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
        NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
        CE_HIGH;
        delay_150us();
        return 0;
    }
    return 1;//没收到任何数据
}
/**********************************************/
/* 函数功能:设置24L01为发送模式              */
/* 入口参数:txbuf  发送数据数组              */
/* 返回值; 0x10    达到最大重发次数,发送失败*/
/*          0x20    成功发送完成              */
/*          0xff    发送失败                  */
/**********************************************/
uchar NRF24L01_TxPacket(uchar *txbuf)
{
    uchar state;

    CE_LOW;//CE拉低,使能24L01配置
      NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节
     CE_HIGH;//CE置高,使能发送
    while(IRQ==1);//等待发送完成
    state=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值
    NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
    if(state&MAX_TX)//达到最大重发次数
    {
        NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器
        return MAX_TX;
    }
    if(state&TX_OK)//发送完成
    {
        return TX_OK;
    }
    return 0xff;//发送失败
}

/********************************************/
/* 函数功能:检测24L01是否存在              */
/* 返回值;  0  存在                        */
/*           1  不存在                      */
/********************************************/
uchar NRF24L01_Check(void)
{
    uchar check_in_buf[5]={0x11,0x22,0x33,0x44,0x55};
    uchar check_out_buf[5]={0x00};
    SCK_LOW;
    CSN_HIGH;
    CE_LOW;
    NRF24L01_Write_Buf(WRITE_REG+TX_ADDR, check_in_buf, 5);
    NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);
    //CE_HIGH;//||||||||||
    if((check_out_buf[0] == 0x11)&&\
       (check_out_buf[1] == 0x22)&&\
       (check_out_buf[2] == 0x33)&&\
       (check_out_buf[3] == 0x44)&&\
       (check_out_buf[4] == 0x55))
        return 0;
    else
        return 1;
}

void NRF24L01_RT_Init(void)
{
    CE_LOW;
    delay_us(40);
      NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
    NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
      NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(uchar*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址
      NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(uchar*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK
      NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答
      NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址
      NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
      NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);       //设置RF通道为40
      NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
      NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0f);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
      delay_us(40);
    CE_HIGH;    //CE置高,使能发送
    delay_us(40);
}
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

///////////////////////////////
///////////////////////////////

///////////////////////////////
///////////////////////////////
// Prototype statements for functions found within this file.
interrupt void cpu_timer0_isr(void);

uint16_t interruptCount = 0;
uint32_t test_buf=0x0020;
ADC_Handle myAdc;
CLK_Handle myClk;
FLASH_Handle myFlash;

PIE_Handle myPie;
TIMER_Handle myTimer;

void main(void)
{

    CPU_Handle myCpu;
    PLL_Handle myPll;
    WDOG_Handle myWDog;

    // Initialize all the handles needed for this application
    myAdc = ADC_init((void *)ADC_BASE_ADDR, sizeof(ADC_Obj));
    myClk = CLK_init((void *)CLK_BASE_ADDR, sizeof(CLK_Obj));
    myCpu = CPU_init((void *)NULL, sizeof(CPU_Obj));
    myFlash = FLASH_init((void *)FLASH_BASE_ADDR, sizeof(FLASH_Obj));
    myGpio = GPIO_init((void *)GPIO_BASE_ADDR, sizeof(GPIO_Obj));
    myPie = PIE_init((void *)PIE_BASE_ADDR, sizeof(PIE_Obj));
    myPll = PLL_init((void *)PLL_BASE_ADDR, sizeof(PLL_Obj));
    myTimer = TIMER_init((void *)TIMER0_BASE_ADDR, sizeof(TIMER_Obj));
    myWDog = WDOG_init((void *)WDOG_BASE_ADDR, sizeof(WDOG_Obj));
    
    // Perform basic system initialization
    WDOG_disable(myWDog);
    CLK_enableAdcClock(myClk);
    (*Device_cal)();
    
    //Select the internal oscillator 1 as the clock source
    CLK_setOscSrc(myClk, CLK_OscSrc_Internal);
    
    // Setup the PLL for x10 /2 which will yield 50Mhz = 10Mhz * 10 / 2
    PLL_setup(myPll, PLL_Multiplier_10, PLL_DivideSelect_ClkIn_by_2);
    
    // Disable the PIE and all interrupts
    PIE_disable(myPie);
    PIE_disableAllInts(myPie);
    CPU_disableGlobalInts(myCpu);
    CPU_clearIntFlags(myCpu);
    
    // If running from flash copy RAM only functions to RAM   
#ifdef _FLASH
    memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
#endif      

    // Setup a debug vector table and enable the PIE
    PIE_setDebugIntVectorTable(myPie);
    PIE_enable(myPie);

    // Configure CPU-Timer 0 to interrupt every 500 milliseconds:
    // 60MHz CPU Freq, 50 millisecond Period (in uSeconds)
    //    ConfigCpuTimer(&CpuTimer0, 60, 500000);

    // Configure GPIO 0-3 as outputs
    GPIO_setMode(myGpio, GPIO_Number_0, GPIO_0_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_1, GPIO_1_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_2, GPIO_2_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_3, GPIO_3_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_4, GPIO_4_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_5, GPIO_5_Mode_GeneralPurpose);
    GPIO_setMode(myGpio, GPIO_Number_34, GPIO_34_Mode_GeneralPurpose);
    
    GPIO_setDirection(myGpio, GPIO_Number_0, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_1, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_2, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_3, GPIO_Direction_Output);
    GPIO_setDirection(myGpio, GPIO_Number_4, GPIO_Direction_Input);
    GPIO_setDirection(myGpio, GPIO_Number_5, GPIO_Direction_Input);
    GPIO_setDirection(myGpio, GPIO_Number_34, GPIO_Direction_Output);

    GPIO_setQualification(myGpio, GPIO_Number_4, GPIO_Qual_Sync);
    GPIO_setQualification(myGpio, GPIO_Number_5, GPIO_Qual_Sync);

    // Enable CPU INT1 which is connected to CPU-Timer 0:
   // CPU_enableInt(myCpu, CPU_IntNumber_1);

    // Enable TINT0 in the PIE: Group 1 interrupt 7
   // PIE_enableTimer0Int(myPie);
    GPIO_setHigh(myGpio,GPIO_Number_34);
    // Enable global Interrupts and higher priority real-time debug events
    CPU_enableGlobalInts(myCpu);
    CPU_enableDebugInt(myCpu);

    while(NRF24L01_Check());
    GPIO_setLow(myGpio,GPIO_Number_34);
    NRF24L01_RT_Init();
    while(1)
    {
        if(IRQ==0)       // 如果接收到无线数据
                {

                        CE_LOW;
                        NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);
                        CE_HIGH;
                        delay_us(15);
                        NRF24L01_TxPacket(rece_buf);
                        CE_LOW;
                        NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);
                        CE_HIGH;

                }
    }
}

无法发送数据

不知道是不是IO口模拟SPI的程序有问题  求大牛解答

uchar SPI_rW2(uchar byte)
{
    uchar bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // 输出8位
    {
        PEOPLETOPEOPLE=byte&0x80;
        if(PEOPLETOPEOPLE!=0)
            {
                MOSI_HIGH;
            }
        if(PEOPLETOPEOPLE==0)
            {
                MOSI_LOW;
            }// MSB TO MOSI
        delay_us(2);
        byte=(byte<<1);    // shift next bit to MSB
        //delay_us(50);
        SCK_HIGH;
        delay_us(2);
        test=MISO;
        byte|=test;            // capture current MISO bit//1

        SCK_LOW;
    }
    return byte;
}

yigang zhao:

回复 ZHANGGE CHENG:

楼主,你好,我用28335时也遇到了像你所说的问题,但是还没有解决,能不能给指导下,谢谢啦!

可以加我QQ:82482901.

赞(0)
未经允许不得转载:TI中文支持网 » 28027 用IO口模拟SPI控制24L01
分享到: 更多 (0)