久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
兩片NRF24L01無法實現通信 大神們幫我看看,兩天了!
[打印本頁]
作者:
xiaofang
時間:
2017-8-5 19:33
標題:
兩片NRF24L01無法實現通信 大神們幫我看看,兩天了!
兩片
N
R
F
2
4
L
0
1無法實現通信
#include <STC12C5A60S2.H>
#include"LCD1602display.h"
// Define interface to nRF24L01
// Define SPI pinssbit qq=P3^4;
sbit CE = P2^1; // Chip Enable pin signal (output)
sbit CSN = P2^2; // Slave Select pin, (output to CSN, nRF24L01)
sbit SCK = P2^3; // Master Out, Slave In pin (output)
sbit MOSI = P2^4; // Serial Clock pin, (output)
sbit MISO = P2^5; // Master In, Slave Out pin (input)
sbit IRQ = P2^6; // Interrupt signal, from nRF24L01 (input)
sbit P3_7=P3^2;
// SPI(nRF24L01) commands
#define READ_REG 0x00 // Define read command to register
#define WRITE_REG 0x20 // Define write command to register
#define RD_RX_PLOAD 0x61 // Define RX payload register address
#define WR_TX_PLOAD 0xA0 // Define TX payload register address
#define FLUSH_TX 0xE1 // Define flush TX register command
#define FLUSH_RX 0xE2 // Define flush RX register command
#define REUSE_TX_PL 0xE3 // Define reuse TX payload register command
#define NOP 0xFF // Define No Operation, might be used to read status register
// SPI(nRF24L01) registers(addresses)
#define CONFIG 0x00 // 'Config' register address
#define EN_AA 0x01 // 'Enable Auto Acknowledgment' register address
#define EN_RXADDR 0x02 // 'Enabled RX addresses' register address
#define SETUP_AW 0x03 // 'Setup address width' register address
#define SETUP_RETR 0x04 // 'Setup Auto. Retrans' register address
#define RF_CH 0x05 // 'RF channel' register address
#define RF_SETUP 0x06 // 'RF setup' register address
#define STATUS 0x07 // 'Status' register address
#define OBSERVE_TX 0x08 // 'Observe TX' register address
#define CD 0x09 // 'Carrier Detect' register address
#define RX_ADDR_P0 0x0A // 'RX address pipe0' register address
#define RX_ADDR_P1 0x0B // 'RX address pipe1' register address
#define RX_ADDR_P2 0x0C // 'RX address pipe2' register address
#define RX_ADDR_P3 0x0D // 'RX address pipe3' register address
#define RX_ADDR_P4 0x0E // 'RX address pipe4' register address
#define RX_ADDR_P5 0x0F // 'RX address pipe5' register address
#define TX_ADDR 0x10 // 'TX address' register address
#define RX_PW_P0 0x11 // 'RX payload width, pipe0' register address
#define RX_PW_P1 0x12 // 'RX payload width, pipe1' register address
#define RX_PW_P2 0x13 // 'RX payload width, pipe2' register address
#define RX_PW_P3 0x14 // 'RX payload width, pipe3' register address
#define RX_PW_P4 0x15 // 'RX payload width, pipe4' register address
#define RX_PW_P5 0x16 // 'RX payload width, pipe5' register address
#define FIFO_STATUS 0x17 // 'FIFO Status Register' register address
#define uchar unsigned char
/***************************************************/
#define TX_ADR_WIDTH 5 // 5字節寬度的發送/接收地址
#define TX_PLOAD_WIDTH 4 // 數據通道有效數據寬度
uchar code table[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
uchar code
TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};
// 定義一個靜態發送地址,該地址是指通道0的地址嗎??
uchar RX_BUF[TX_PLOAD_WIDTH]; //是否以確定發送與接收的數據寬度一樣??
uchar TX_BUF[TX_PLOAD_WIDTH]; //是否以確定發送與接收的數據寬度一樣??
uchar flag; //該字符的作用???
uchar x=0,y=0,z=0,m=0; //為什么設置為這個數字
uchar bdata sta;
sbit RX_DR = sta^6;
sbit TX_DS = sta^5;
sbit MAX_RT = sta^4;
/**************************************************/
/**************************************************
函數:delay_ms()
描述:
延遲x毫秒
/**************************************************/
void delay_ms(uchar x)
{
uchar i, j;
i = 0;
for(i=0; i<x; i++)
{
j = 250;
while(--j);
j = 250;
while(--j);
}
}
/**************************************************/
/**************************************************
函數:SPI_RW()
描述:
根據SPI協議,寫一字節數據到nRF24L01,同時從nRF24L01
讀出一字節
/**************************************************/
//是不是接收端與發射端都要用到這個函數,讀出的字節是否為狀態字
uchar SPI_RW(uchar byte)
{
uchar i;
for(i=0; i<8; i++) // 循環8次
{
MOSI = (byte & 0x80); // byte最高位輸出到MOSI
byte <<= 1; // 低一位移位到最高位
SCK = 1; // 拉高SCK,nRF24L01從MOSI讀入1位數據,同時從MISO輸出1位數據
byte |= MISO; // 讀MISO到byte最低位
SCK = 0; // SCK置低
}
return(byte); // 返回讀出的一字節
}
/**************************************************/
/**************************************************
函數:SPI_RW_Reg()
描述:寫數據value到reg寄存器
是不是通過寫地址確定寄存器,然后向其寫數據??
/**************************************************/
uchar SPI_RW_Reg(uchar reg, uchar value)
{
uchar status;
CSN = 0; // CSN置低,開始傳輸數據
status = SPI_RW(reg); // 選擇寄存器,同時返回狀態字
SPI_RW(value); // 然后寫數據到該寄存器
CSN = 1; // CSN拉高,結束數據傳輸
return(status); // 返回狀態寄存器
}
/**************************************************/
/**************************************************
函數:SPI_Read()
描述:
從reg寄存器讀一字節
/**************************************************/
uchar SPI_Read(uchar reg)
{
uchar reg_val;
CSN = 0; // CSN置低,開始傳輸數據
SPI_RW(reg); // 選擇寄存器
reg_val = SPI_RW(0); // 然后從該寄存器讀數據 為什么送一個0就可以讀回一個數據
CSN = 1;
// CSN拉高,結束數據傳輸
return(reg_val); // 返回寄存器數據
}
/**************************************************/
/**************************************************
函數:SPI_Read_Buf()
描述:
從reg寄存器讀出bytes個字節,通常用來讀取接收通道
數據或接收/發送地址
/**************************************************/
uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes)
{
uchar status, i;
CSN = 0; // CSN置低,開始傳輸數據
status = SPI_RW(reg); // 選擇寄存器,同時返回狀態字
for(i=0; i<bytes; i++)
pBuf[ i] = SPI_RW(0); // 逐個字節從nRF24L01讀出
CSN = 1; // CSN拉高,結束數據傳輸
return(status); // 返回狀態寄存器
}
/**************************************************/
/**************************************************
函數:SPI_Write_Buf()
描述:
把pBuf緩存中的數據寫入到nRF24L01,通常用來寫入發
射通道數據或接收/發送地址
/**************************************************/
uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes)
{
uchar status, i;
CSN = 0; // CSN置低,開始傳輸數據
status = SPI_RW(reg); // 選擇寄存器,同時返回狀態字
for(i=0; i<bytes; i++)
SPI_RW(pBuf[ i]); // 逐個字節寫入nRF24L01
CSN = 1; // CSN拉高,結束數據傳輸
return(status); // 返回狀態寄存器
}
/**************************************************/
/**************************************************
函數:RX_Mode()
描述:
這個函數設置nRF24L01為接收模式,等待接收發送設備的數據包
/**************************************************/
void RX_Mode(void)
{
CE = 0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
// CRC使能,16位CRC校驗,上電,接收模式
CE = 1; // 拉高CE啟動接收設備
}
/**************************************************/
/**************************************************
函數:TX_Mode()
描述:
這個函數設置nRF24L01為發送模式,(CE=1持續至少10us),
130us后啟動發射,數據發送結束后,發送模塊自動轉入接收
模式等待應答信號。
/**************************************************/
void TX_Mode(uchar * BUF)
{
CE = 0;
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
// 寫入發送地址 (與接收地址一樣)
SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);
// 寫數據包到TX FIFO(前以定義BUF數組發送數據4字節,寫數據用于發送模式)
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
// CRC使能,16位CRC校驗,上電
CE = 1;
}
/**************************************************/
/*********
*****************************************
函數: init_io()
描述:
初始化IO
/**************************************************/
void init_io(void)
{
CE = 0; // 待機
CSN = 1; // SPI禁止
SCK = 0; // SPI時鐘置低
IRQ = 1; // 中斷復位
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);
// 為了應答接收設備,接收通道0地址和發送地址相同 (發射端設置0通道接收應答信號)
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自動應答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);
// 自動重發延時等待250us+86us,自動重發10次
SPI_RW_Reg(WRITE_REG + RF_CH, 10);
// 選擇射頻通道0x40
SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);
// 接收通道0選擇和發送通道相同有效數據寬度
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
// 數據傳輸率1Mbps,發射功率0dBm,低噪聲放大器增益
}
/**************************************************/
/**************************************************
函數:CheckButtons()
描述:
檢查按鍵是否按下,按下則發送一字節數據
/**************************************************/
void CheckButtons()
{
if(!P3_7) // 讀取P3^0狀態
{
delay_ms(10);
if(!P3_7) // 讀取P3^0狀態
{
TX_BUF[0]=x ; // 數據送到緩存 (uchar DATA = 0x01;)
TX_BUF[1]=y;
TX_BUF[2]=z ; // 數據送到緩存 (uchar DATA = 0x01;)
TX_BUF[3]=m;
DisplayOneChar(4,0,table[x%16]);
DisplayOneChar(4,1,table[y%16]);
x++;y++;z+=2;m+=3;
RX_Mode(); // 設置為接收模式
while(!P3_7);
}
}
}
/**************************************************/
void Init_T0 (void)
{
TMOD = 0x01;
TH0 = (65536-50000) /256;
TL0 = (65536-50000) %256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
/**************************************************
函數:main()
描述:
主函數
/**************************************************/
void main(void)
{ qq=0;init_io(); // 初始化IO
LCDInit();
Init_T0();
RX_Mode(); // 設置為接收模式
DisplayListChar(1,0,"Xt=");
DisplayListChar(1,1,"Yt=");
DisplayListChar(7,0,"Xr=");
DisplayListChar(7,1,"Yr=");
while(1)
{
CheckButtons();
}
}
/**************************************************/
void Time0_ISR(void) interrupt 1
{
TH0 = (65536-30000) /256;
TL0 = (65536-30000) %256;
SPI_RW(FLUSH_TX);
TX_Mode(TX_BUF); // 把nRF24L01設置為發送模式并發送數據
// Check_ACK(1); // 等待發送完畢,清除TX FIFO
// SPI_RW(FLUSH_TX);
sta = SPI_Read(STATUS); // 讀狀態寄存器
if(RX_DR) // 判斷是否接受到數據
{
SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH);
// 從RX FIFO讀出數據
flag = 1;
}
SPI_RW_Reg(WRITE_REG + STATUS, sta); // 清除RX_DS中斷標志
if(flag) // 接受完成
{
flag = 0; // 清標志
DisplayOneChar(10,0,table[RX_BUF[1]%16]);
DisplayOneChar(10,1,table[RX_BUF[2]%16]);
}
}
復制代碼
作者:
yzwzfyz
時間:
2017-8-5 21:57
程序是自己寫的?
NRF24L01通訊原理清楚?
作者:
xiaofang
時間:
2017-8-6 09:32
yzwzfyz 發表于 2017-8-5 21:57
程序是自己寫的?
NRF24L01通訊原理清楚?
nrf24l01是網上找的,自己根據自己的理解改了一部分,lcd顯示自己寫的
作者:
zhangyun_mcu
時間:
2017-8-6 10:17
先看看有沒有發送出來。把其中一個設置成接收模式,初始化后中斷腳為高,接收到數據中斷為低。
作者:
Y891530061
時間:
2017-8-6 11:00
LCD顯示能用嗎?用用其他程序試試,或者先不用顯示,用幾個小燈接在扣上看看,數據是不是傳輸成功了
作者:
Y891530061
時間:
2017-8-6 11:02
回復我怎么看不到啊
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产亚洲精品久久久久动
|
九九天堂网
|
九九热这里
|
日韩网站在线观看
|
亚洲精品久久久久久国产精华液
|
国产日韩欧美
|
中文字幕乱码一区二区三区
|
成人a网
|
成人黄色网址大全
|
国产精品久久久久久久久久久免费看
|
天天拍天天操
|
日韩欧美视频免费在线观看
|
亚洲视频 欧美视频
|
一区二区精品电影
|
亚洲综合色
|
91精品国产91久久久久游泳池
|
欧美成人免费在线
|
精品久久香蕉国产线看观看亚洲
|
亚洲二区在线观看
|
我爱操
|
国产网站在线免费观看
|
午夜影院在线观看
|
国产精品成人在线播放
|
伊人春色在线
|
国产精品久久片
|
免费精品国产
|
国产传媒在线播放
|
成人免费在线
|
亚洲精品 在线播放
|
国产真实精品久久二三区
|
青青久久
|
天天天操
|
国产一区二区三区在线视频
|
精区3d动漫一品二品精区
|
国产91丝袜在线熟
|
成人免费视频一区二区
|
久久一
|
国产美女在线观看
|
九九热久久免费视频
|
亚洲视频一区二区三区
|
91免费版在线观看
|