- #include <macros.h>
- #define uchar unsigned char
- #define uint unsigned int
- //------------------------------------------------------------------------------
- //spi標志
- #define DDR_SPI DDRB
- #define DD_MOSI 5
- #define DD_SCK 7
- #define DD_SS 4
- //--------------------------------NRF24L01接口定義--------------------------------
- //------------------------------------------------------------------------------
- //#define NRF24L01_MISO PB6 //輸入0
- #define Hign_24L01_MISO PORTB|=(1 << PB6)
- #define Low_24L01_MISO PORTB &= ~(1 << PB6)
- #define Read_24L01_MISO PINB & (1 << PB6)
- //#define NRF24L01_MOSI PB5 //輸出1
- #define Hign_24L01_MOSI PORTB |= (1 << PB5)
- #define Low_24L01_MOSI PORTB &= ~(1 << PB5)
- #define Read_24L01_MOSI PINB & (1 << PB5)
- //#define NRF24L01_SCK PB7 //輸出1
- #define Hign_24L01_SCK PORTB |= (1 << PB7)
- #define Low_24L01_SCK PORTB &= ~(1 << PB7)
- #define Read_24L01_SCK PINB & (1 << PB7);
- //#define NRF24L01_CSN PB4 //輸出1
- #define Low_24L01_CSN PORTB &= ~(1 << PB4)
- #define Hign_24L01_CSN PORTB |= (1 << PB4)
- //#define NRF24L01_CE PB2 //輸出1
- #define Hign_24L01_CE PORTB |= (1 << PB3)
- #define Low_24L01_CE PORTB &= ~(1 << PB3)
- #define Read_24L01_CE PINB & (1 << PB3)
- //char sta,count,tf;
- /
- /
- /
- void spi_init()
- {
- DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS)|(1 << PB3);//設置MOSI,SCK,SS.CE 為OUTPUT,其它為INPUT
- SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0);//使能SPI接口,主機模式,MSB低位在前,模式0,16分頻,SPI時鐘1MHZ
- SPSR=0;
- }
- uchar SPI_RW(uchar date)
- {
- SPDR=date;
- while(!(SPSR&(1<<SPIF)));
- return SPDR;
- }
- uchar SPI_Read(uchar reg)
- {
- uchar reg_val;
-
- Low_24L01_CSN; // CSN low, initialize SPI communication...
- SPI_RW(reg); // Select register to read from..
- reg_val = SPI_RW(0); // ..then read registervalue
- Hign_24L01_CSN; // CSN high, terminate SPI communication
-
- return(reg_val); // return register value
- }
- uchar SPI_RW_Reg(uchar reg, uchar value)
- {
- uchar status;
-
- Low_24L01_CSN; // CSN low, init SPI transaction
- status = SPI_RW(reg); // select register
- SPI_RW(value); // ..and write value to it..
- Hign_24L01_CSN; // CSN high again
-
- return(status); // return nRF24L01 status uchar
- }
- uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bites)
- {
- uint status1,uchar_ctr;
-
- Low_24L01_CSN; // Set CSN low, init SPI tranaction
- status1 = SPI_RW(reg); // Select register to write to and read status uchar
-
- for(uchar_ctr=0;uchar_ctr<bites;uchar_ctr++)
- pBuf[uchar_ctr] = SPI_RW(0); //
-
- Hign_24L01_CSN;
-
- return(status1); // return nRF24L01 status uchar
- }
- uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bites)
- {
- uchar status1,uchar_ctr;
-
- Low_24L01_CSN; //SPI使能
- status1 = SPI_RW(reg);
- for(uchar_ctr=0; uchar_ctr<bites; uchar_ctr++) //
- SPI_RW(*pBuf++);
- Hign_24L01_CSN; //關閉SPI
- return(status1); //
- }
- void SetRX_Mode(void)
- {
- Low_24L01_CE;
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);
- SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); //
- SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); //
- SPI_RW_Reg(WRITE_REG + RF_CH,0); //
- SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
- Hign_24L01_CE;
- Delay(200);//注意不能太小
- }
- uchar nRF24L01_RxPacket(uchar* rx_buf)
- {
- uchar sta,flag=0;
- sta=SPI_Read(STATUS); // 讀取狀態寄存其來判斷數據接收狀況
- if(sta&0x40) // 判斷是否接收到數據RX_DR==1?
- {
- Low_24L01_CE; //SPI使能
- SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
- flag =1; //讀取數據完成標志
- }
- SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到數據后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標志
- return (flag);
- }
- void nRF24L01_TxPacket(uchar * tx_buf)
- {
- Low_24L01_CE; //StandBy I模式
- SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
- SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 裝載數據
- SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); //
- SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); //
- SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); //
- SPI_RW_Reg(WRITE_REG + RF_CH, 0); //
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收發完成中斷響應,16位CRC,主發送
- Hign_24L01_CE; //置高CE,激發數據發送
- Delay(150);
- }
- /
- void init_NRF24L01(void)
- {
- spi_init();
- Low_24L01_CE; // chip enable
- Hign_24L01_CSN; // Spi disable
- Low_24L01_SCK; // Spi clock line init high
-
- }
- 主函數(發送)
- //外部8MHZ晶振
- #include <iom16v.h>
- #include <macros.h>
- #include"RF24L01.H"
- #include"LCD1602.H"
- uchar TX_BUF[32]={0x53,0x75,0x63,0x63,0x65,0x73,0x66,0x75,0x6c,0x21};//successful!
- void main()
- {
- lcd_init();
- init_NRF24L01();
- LCD_write_str(0,0,"fa song shu ju:");
- delay_ms(10);
- while(1)
- {
- nRF24L01_TxPacket(TX_BUF);
- delay_ms(50);
- sta=SPI_Read(STATUS);
- //while(sta&0x20)
- //{
- for(i=0;i<10;i++)
- {
- LCD_write_char(1,i,TX_BUF[i]);
- }
- SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
- //}
- delay_ms(500);
- }
- }
- 主函數(接收)
- #include <iom16v.h>
- #include <macros.h>
- #include"RF24L01.H"
- #include"LCD1602.H"
- #define mclk 8000000
- #pragma interrupt_handler uart_rx:12
- uchar RX_BUF[32];
- uchar rdata,flag=0;
- void main()
- {
- uchar i;
- lcd_init();
- init_NRF24L01();
- LCD_write_str(0,0,"jie shou shu ju:");
- delay_ms(10);
- while(1)
- {
- SetRX_Mode();
- if(nRF24L01_RxPacket(RX_BUF)) //判斷是否收到數據
- {
- for(i=0;i<10;i++)
- {
- LCD_write_char(1,i,RX_BUF[i]);
- delay_ms(1);
- }
- }
- delay_ms(500);
- }
- }
復制代碼
|