PIC18F4520 + NRF24L01

发布者:创新火花最新更新时间:2020-09-10 来源: eefocus关键字:PIC18F4520  NRF24L01  对调 手机看文章 扫描二维码
随时随地手机看文章

SI SO应该对调过来用。。


TX


/*

** Tx.c

** Transmit test program for PIC18F4520 and nRF24L01 or nRF24L01+

** Uses the Microchip C18 compiler

** Based on SFE code for the CC5X compiler in 24L01demo_V01.c

*/


#include

#include

#include


// Pragmas

#pragma config OSC = INTIO67

#pragma config PWRT = ON

//#pragma config MCLRE = OFF

#pragma config BOREN = OFF



//function prototypes

void init(void);

void transmit_data(void);

void configure_transmitter(void);

unsigned char spi_Send_Read(unsigned char);

unsigned char spi1_send_read_byte(unsigned char byte);

void dly(unsigned int);



// Defines

#define SPI_SCK LATCbits.LATC3 // Clock pin, PORTC pin 3 

#define SPI_SO LATCbits.LATC5 // Serial output pin, PORTC pin 5 

#define SPI_SI PORTCbits.RC4 // Serial input pin, PORTC pin 4 

#define SPI_CSN LATCbits.LATC2 // CSN output pin, PORTC pin 2

#define SPI_CE LATCbits.LATC1 // CE output pin, PORTC pin 1

#define SPI_IRQ PORTBbits.RB0 // IRQ input pin, PORTB pin 0

#define SPI_SCALE 4              // postscaling of signal 

#define LED LATDbits.LATD1

#define PB PORTAbits.RA1


// Macros

#define nop() _asm nop _endasm


void main(void)

{

init();

configure_transmitter();  

while (1)  

{

transmit_data();

LED = 1;

dly(63973); //200 ms delay

LED = 0;           

dly(40000); //3.27 s delay 

nop();          

}

}



void init(void)

{

// run internal oscillator at 8 MHz

OSCCON = OSCCON | 0x70;

while (OSCCONbits.IOFS == 0)

;

PORTA = 0x00;

PORTD = 0X00;

ADCON1 = 0x0F; // set up PORTA to be digital I/Os

TRISA = 0x02; // PORTA<7.2,0> outputs PORTA<1> input

TRISD = 0XFD;

TRISCbits.TRISC3 = 0; // SDO output

TRISCbits.TRISC4 = 1;

TRISCbits.TRISC5 = 0;   // SCK output

TRISCbits.TRISC2 = 0; // CSN output

TRISCbits.TRISC1 = 0; // CE output

TRISBbits.TRISB0 = 1; // IRQ input

OpenSPI(SPI_FOSC_16, MODE_00, SMPMID); //open SPI1

OpenTimer0( TIMER_INT_OFF &

            T0_16BIT &

            T0_SOURCE_INT &

            T0_PS_1_256 );

}


void configure_transmitter(void)

{

    unsigned char i, j, data, cmd;


    SPI_CE = 0;

    SPI_CSN = 0;


// PTX, CRC enabled, mask a couple of ints    

  spi_Send_Read(0x20);

  spi_Send_Read(0x38);

SPI_CSN = 1; 

    SPI_CSN = 0;

    

//auto retransmit off

  spi_Send_Read(0x24);    

    spi_Send_Read(0x00);    

    SPI_CSN = 1;

    SPI_CSN = 0;

    

//address width = 5

    spi_Send_Read(0x23);

  spi_Send_Read(0x03);    

    SPI_CSN = 1;

    SPI_CSN = 0;

    

//data rate = 1MB

    spi_Send_Read(0x26);

  spi_Send_Read(0x07);

    SPI_CSN = 1; 

    SPI_CSN = 0;

    

//set channel 2, this is default but we did it anyway...

    spi_Send_Read(0x25);

  spi_Send_Read(0x02);

    SPI_CSN = 1;

    SPI_CSN = 0;

    

//set address E7E7E7E7E7, also default...

    spi_Send_Read(0x30);    

    for (j = 0; j < 5; j++)

    {

        spi_Send_Read(0xE7);

    }  

    SPI_CSN = 1;

    SPI_CSN = 0;

    

    //disable auto-ack, RX mode

    //shouldn't have to do this, but it won't TX if you don't

    spi_Send_Read(0x21);

  spi_Send_Read(0x00);

    SPI_CSN = 1;

}


void transmit_data(void)

{

    unsigned char i, data, cmd;   

    

    SPI_CSN = 0;

    

//clear previous ints

  spi_Send_Read(0x27);

  spi_Send_Read(0x7E);

SPI_CSN = 1;

    SPI_CSN = 0;

    

//PWR_UP = 1

    spi_Send_Read(0x20);

  spi_Send_Read(0x3A);

    SPI_CSN = 1;

    SPI_CSN = 0;

    

    //clear TX fifo

    //the data sheet says that this is supposed to come up 0 after POR, but that doesn't seem to be the case

    spi_Send_Read(0xE1);

    SPI_CSN = 1;

    SPI_CSN = 0;

    

//4 byte payload

    spi_Send_Read(0xA0);

    spi_Send_Read(0x34);

  spi_Send_Read(0x33);

    spi_Send_Read(0x32);

  spi_Send_Read(0x31);

    SPI_CSN = 1;

    

    //Pulse CE to start transmission

    SPI_CE = 1;

    dly(65000); //delay 69 ms

    SPI_CE = 0;

}



unsigned char spi_Send_Read(unsigned char byte)

{

SSPBUF = byte;

while(!DataRdySPI())

;

return SSPBUF;

}


void dly(unsigned int c)

{

INTCONbits.TMR0IF = 0;

WriteTimer0(c);

while (INTCONbits.TMR0IF == 0)

;

}







RX


/*

** Rx.c

** Receive test program for PIC18F4520 and nRF24L01 or nRF24L01+

** Uses the Microchip C18 compiler

** Based on SFE code for the CC5X compiler in 24L01demo_V01.c

**

** The LED is flashed five times when data are received.

** The received data in the buffer may be checked using the 

** debugger Watch window.*/


#include

#include

#include


// Pragmas

#pragma config OSC = INTIO67

#pragma config PWRT = ON

#pragma config MCLRE = OFF

#pragma config BOREN = OFF


//function prototypes

void init(void);

void reset_RX(void);

void configure_RX(void);

unsigned char spi_Send_Read(unsigned char);

void dly(unsigned int);


// Defines

#define SPI_SCK LATCbits.LATC3 // Clock pin, PORTC pin 3 

#define SPI_SO LATCbits.LATC5 // Serial output pin, PORTC pin 5 

#define SPI_SI PORTCbits.RC4 // Serial input pin, PORTC pin 4 

#define SPI_CSN LATCbits.LATC2 // CSN output pin, PORTC pin 2

#define SPI_CE LATCbits.LATC1 // CE output pin, PORTC pin 1

#define SPI_IRQ PORTBbits.RB0 // IRQ input pin, PORTB pin 0

#define SPI_SCALE 4              // postscaling of signal 

#define LED LATDbits.LATD1

#define PB PORTAbits.RA1


// Macros

#define nop() _asm nop _endasm


void main(void)

{

unsigned char i;


init();

configure_RX();

while(1)

{

    if (SPI_IRQ == 0)    //wait for anything

        {

            for (i = 0; i < 5; i++)  //flash LED 5 times if data received

            {

                LED = 1;

                dly(63973); // 200 ms delay

                LED = 0;

                dly(63973); // 196 ms

            }

            dly(63973); // 196 ms

            reset_RX();            

        }

}

}


// initialise 18F4520

void init(void)

{

// run internal oscillator at 8 MHz

OSCCON = OSCCON | 0x70;

while (OSCCONbits.IOFS == 0)

;


PORTA = 0x00;

PORTD = 0X00;

ADCON1 = 0x0F; // set up PORTA to be digital I/Os

TRISA = 0x02; // PORTA<7.2,0> outputs PORTA<1> input

TRISD = 0XFD;

TRISCbits.TRISC3 = 0; // SDO output

TRISCbits.TRISC4 = 1;

TRISCbits.TRISC5 = 0;   // SCK output

TRISCbits.TRISC2 = 0; // CSN output

TRISCbits.TRISC1 = 0; // CE output

TRISBbits.TRISB0 = 1; // IRQ input

OpenSPI(SPI_FOSC_16, MODE_00, SMPMID); //open SPI1

OpenTimer0( TIMER_INT_OFF &

            T0_16BIT &

            T0_SOURCE_INT &

            T0_PS_1_256 );

}


//configure nRF24L01 for receive

void configure_RX(void)

{

    unsigned char i, j;


    SPI_CSN = 0;

    SPI_CE = 0;

    

//PRX, CRC enabled

spi_Send_Read(0x20);

spi_Send_Read(0x39); 

SPI_CSN = 1;   

SPI_CSN = 0;

    

//disable auto-ack for all channels      

spi_Send_Read(0x21);

spi_Send_Read(0x00);     

SPI_CSN = 1;    

SPI_CSN = 0;

    

//address width = 5 bytes  

  spi_Send_Read(0x23);

spi_Send_Read(0x03);    

    SPI_CSN = 1;    

    SPI_CSN = 0;

    

//data rate = 1MB   

  spi_Send_Read(0x26);

spi_Send_Read(0x07);    

    SPI_CSN = 1;

  SPI_CSN = 0;


//4 byte payload  

  spi_Send_Read(0x31);

spi_Send_Read(0x04);    

    SPI_CSN = 1;    

    SPI_CSN = 0;


    //set channel 2 

    spi_Send_Read(0x25);

spi_Send_Read(0x02);    

    SPI_CSN = 1;     

    SPI_CSN = 0;


    //set address E7E7E7E7E7

    spi_Send_Read(0x30);

    for (j = 0; j < 5; j++)

  spi_Send_Read(0xE7); 

    SPI_CSN = 1;  

    SPI_CSN = 0;

    

//PWR_UP = 1   

  spi_Send_Read(0x20);

spi_Send_Read(0x3B);   

    SPI_CSN = 1;    

    SPI_CE = 1;     

}


void reset_RX(void)

{

    unsigned char i, j;

    unsigned char buffer[4];    

    

//Read RX payload   

    SPI_CSN = 0;    

    spi_Send_Read(0x61);    

    for (j = 0; j < 4; j++)

    {        

        buffer[j] = spi_Send_Read(0);        

    }    

    SPI_CSN = 1;    

    

//Flush RX FIFO    

    SPI_CSN = 0;    

[1] [2]
关键字:PIC18F4520  NRF24L01  对调 引用地址:PIC18F4520 + NRF24L01

上一篇:PIC EEPROM问题
下一篇:pic减法进位问题

推荐阅读最新更新时间:2024-11-01 07:34

STM32 驱动无线NRF24L01 的稳定修正
修正处 void sent_data(u8* fp,u16 flong) { u16 i; TX_Mode((u8*)&flong); //传送长度 while(!tran); //等待完成 tran=0; flong=flong/33+1; while(flong) { for(i=0;i 20000;i++); //这个延时的非常必要 大约2MS 左右 if(MAX_RT) return;//无应答返回 TX_Mode(fp); //传送数据 while(!tran); //等待完成 tran=0; fp+=32;flong--; } } 更加合理的延时写法 ,发送分两部分 首先发送内容长度
[单片机]
STM32 驱动无线<font color='red'>NRF24L01</font> 的稳定修正
基于nRF24L01的钢丝绳无损检测系统
  本文提出了一种基于nRF24L01的无线传输方式下的钢丝绳无损检测方法,利用该系统对在线钢丝绳进行无损检测,检测结果采用nRF24L01进行无线传输,克服了有线传输的应用弊端,解决了钢丝绳恶劣的工作环境和其无损检测有线传输方式的矛盾,提高了检测精度。   1 钢丝绳无损检测系统硬件设计   1.1 系统总体结构图   钢丝绳无损检测系统由数据采集端和接收处理端组成。数据采集端系统框图如图1所示,主要分为:传感器模块,A/D采集模块,LM3S1 138处理器模块,RF24L01无线模块。其中传感器部分采用华中科技大学机械学院无损检测实验室具有自主知识产权的无损检测传感器,该传感器由2个霍尔元件和1个旋转编码器组成,输出4路模拟
[单片机]
基于<font color='red'>nRF24L01</font>的钢丝绳无损检测系统
单片机AT89C5l用电故障控制系统
1 引言   对于电网短路和线路故障检测保护已有不少研究。市面上的电器短路、过载、超压的保护器功能单一。容易损坏,没用提示功能,不够人性化。但随人们生活水平的不断提高。用电设备也不断增加,产生了肓目用电现象。这给人们造成极大的安全隐患。其中危害性最大的用电故障有三种:输入电压过高、室内线路严重过载、用电器短路。本文设计的单片机AT89C5l用电故障控制系统的目的就是为了防止这三种故障带来的危害。   2 硬件的组成   单片机用电故障控制系统的硬件分别是:由降压变压器、2个相瓦串联的感应线圈、升压变JK器、电磁开关、5V稳压电源、超压过流信号获取比较电路、可编程接门扩展芯片8255、HD44780字符液晶显示模块、ISD26
[单片机]
单片机AT89C5l用电故障控制系统
PIC18f4520禁止低电压编程问题
PIC18f4520具有低电压编程模式,一般高压编程的电压为13V,而低压编程的电压只有5V,但是低电压编程会占用芯片的PGM/RB5,这样烧写的芯片必须PGM/RB5接低电平芯片才能工作 大部分在线编程也都是用的高压编程,特别是PIC专用编程器的在线编程,一定是用的高压编程,这时必须将低压编程使能禁止掉,否则你的PGM/RB5就要接地芯片才能正常工作了。低电压编程基本上用不到,只在一些编程器无法提供高压的情况下使用。 实际中发现低压编程会使外部中断无法正常使用,如果你还使用了RB5引脚的话会使系统运行不正常,所以在配置字_CONFIG()中会加入LVPDIS低电压禁止模式。
[单片机]
基于BOA和nRF24L01的智能家居系统
  1 引言   人们生活水平的提高以及科技的进步,特别是计算机技术、网络技术和通信技术的发展,智能家居将慢慢成为未来家居生活的发展方向。1984年在美国诞生了世界上第一座智能家居建筑,从此以后,世界上的各大公司和科研单位不断加速在智能家居方面的研究,他们分别提出了自己的智能家居解决方案,其中以新加坡提出的技术方案最具代表性,他的智能家居系统包括三表抄送、安防报警、家电控制、家庭智能控制面板、监控中心等功能,目标在于将家庭中与信息相关的通信设备、家用电器和家庭安防装置通过总线技术连接到家庭智能化系统上,从而进行集中或远程控制和管理。在未来,智能家居不仅要为用户提供健康、舒适安全和安全的生活环境,而且用户还能够远程控制家庭电器设备和
[单片机]
基于BOA和<font color='red'>nRF24L01</font>的智能家居系统
PIC18F4520 + NRF24L01
SI SO应该对调过来用。。 TX /* ** Tx.c ** Transmit test program for PIC18F4520 and nRF24L01 or nRF24L01+ ** Uses the Microchip C18 compiler ** Based on SFE code for the CC5X compiler in 24L01demo_V01.c */ #include p18cxxx.h #include spi.h #include timers.h // Pragmas #pragma config OSC = INTIO67 #pragma config PWRT =
[单片机]
新型高速无线射频器件nRF24L01及其应用
1 nRF24L01概述 nRF24.L01是一款新型单片射频收发器件,工作于2.4 GHz~2.5 GHz ISM频段。内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型ShockBurst技术,其中输出功率和通信频道可通过程序进行配置。nRF24L01功耗低,在以-6 dBm的功率发射时,工作电流也只有9 mA;接收时,工作电流只有12.3 mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。 nRF24L01主要特性如下: GFSK调制: 硬件集成OSI链路层; 具有自动应答和自动再发射功能; 片内自动生成报头和CRC校验码; 数据传输率为l Mb/s或2Mb/s; SPI速
[应用]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved