久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2863|回復: 5
收起左側

兩片NRF24L01無法實現通信 大神們幫我看看,兩天了!

[復制鏈接]
ID:225049 發表于 2017-8-5 19:33 | 顯示全部樓層 |閱讀模式
兩片NRF24L01無法實現通信
  1. #include <STC12C5A60S2.H>

  2. #include"LCD1602display.h"

  3. // Define interface to nRF24L01

  4. // Define SPI pinssbit qq=P3^4;

  5. sbit CE = P2^1; // Chip Enable pin signal (output)

  6. sbit CSN = P2^2; // Slave Select pin, (output to CSN, nRF24L01)

  7. sbit SCK = P2^3; // Master Out, Slave In pin (output)

  8. sbit MOSI = P2^4; // Serial Clock pin, (output)

  9. sbit MISO = P2^5; // Master In, Slave Out pin (input)

  10. sbit IRQ = P2^6; // Interrupt signal, from nRF24L01 (input)

  11. sbit P3_7=P3^2;

  12. // SPI(nRF24L01) commands

  13. #define READ_REG 0x00 // Define read command to register

  14. #define WRITE_REG 0x20 // Define write command to register

  15. #define RD_RX_PLOAD 0x61 // Define RX payload register address

  16. #define WR_TX_PLOAD 0xA0 // Define TX payload register address

  17. #define FLUSH_TX 0xE1 // Define flush TX register command

  18. #define FLUSH_RX 0xE2 // Define flush RX register command

  19. #define REUSE_TX_PL 0xE3 // Define reuse TX payload register command

  20. #define NOP 0xFF // Define No Operation, might be used to read status register

  21. // SPI(nRF24L01) registers(addresses)

  22. #define CONFIG 0x00 // 'Config' register address

  23. #define EN_AA 0x01 // 'Enable Auto Acknowledgment' register address

  24. #define EN_RXADDR 0x02 // 'Enabled RX addresses' register address

  25. #define SETUP_AW 0x03 // 'Setup address width' register address

  26. #define SETUP_RETR 0x04 // 'Setup Auto. Retrans' register address

  27. #define RF_CH 0x05 // 'RF channel' register address

  28. #define RF_SETUP 0x06 // 'RF setup' register address

  29. #define STATUS 0x07 // 'Status' register address

  30. #define OBSERVE_TX 0x08 // 'Observe TX' register address

  31. #define CD 0x09 // 'Carrier Detect' register address

  32. #define RX_ADDR_P0 0x0A // 'RX address pipe0' register address

  33. #define RX_ADDR_P1 0x0B // 'RX address pipe1' register address

  34. #define RX_ADDR_P2 0x0C // 'RX address pipe2' register address

  35. #define RX_ADDR_P3 0x0D // 'RX address pipe3' register address

  36. #define RX_ADDR_P4 0x0E // 'RX address pipe4' register address

  37. #define RX_ADDR_P5 0x0F // 'RX address pipe5' register address

  38. #define TX_ADDR 0x10 // 'TX address' register address

  39. #define RX_PW_P0 0x11 // 'RX payload width, pipe0' register address

  40. #define RX_PW_P1 0x12 // 'RX payload width, pipe1' register address

  41. #define RX_PW_P2 0x13 // 'RX payload width, pipe2' register address

  42. #define RX_PW_P3 0x14 // 'RX payload width, pipe3' register address

  43. #define RX_PW_P4 0x15 // 'RX payload width, pipe4' register address

  44. #define RX_PW_P5 0x16 // 'RX payload width, pipe5' register address

  45. #define FIFO_STATUS 0x17 // 'FIFO Status Register' register address

  46. #define uchar unsigned char



  47. /***************************************************/

  48. #define TX_ADR_WIDTH 5 // 5字節寬度的發送/接收地址

  49. #define TX_PLOAD_WIDTH 4 // 數據通道有效數據寬度

  50. uchar code table[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};

  51. uchar code

  52. TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};

  53. // 定義一個靜態發送地址,該地址是指通道0的地址嗎??

  54. uchar RX_BUF[TX_PLOAD_WIDTH]; //是否以確定發送與接收的數據寬度一樣??

  55. uchar TX_BUF[TX_PLOAD_WIDTH]; //是否以確定發送與接收的數據寬度一樣??

  56. uchar flag; //該字符的作用???

  57. uchar x=0,y=0,z=0,m=0; //為什么設置為這個數字

  58. uchar bdata sta;

  59. sbit RX_DR        = sta^6;

  60. sbit TX_DS        = sta^5;

  61. sbit MAX_RT = sta^4;

  62. /**************************************************/

  63. /**************************************************

  64. 函數:delay_ms()

  65. 描述:

  66. 延遲x毫秒

  67. /**************************************************/

  68. void delay_ms(uchar x)

  69. {

  70. uchar i, j;

  71. i = 0;

  72. for(i=0; i<x; i++)

  73. {

  74. j = 250;

  75. while(--j);

  76. j = 250;

  77. while(--j);

  78. }

  79. }

  80. /**************************************************/

  81. /**************************************************

  82. 函數:SPI_RW()

  83. 描述:

  84. 根據SPI協議,寫一字節數據到nRF24L01,同時從nRF24L01

  85. 讀出一字節

  86. /**************************************************/

  87. //是不是接收端與發射端都要用到這個函數,讀出的字節是否為狀態字

  88. uchar SPI_RW(uchar byte)

  89. {

  90. uchar i;

  91. for(i=0; i<8; i++) // 循環8次

  92. {

  93. MOSI = (byte & 0x80); // byte最高位輸出到MOSI

  94. byte <<= 1; // 低一位移位到最高位

  95. SCK = 1; // 拉高SCK,nRF24L01從MOSI讀入1位數據,同時從MISO輸出1位數據

  96. byte |= MISO; // 讀MISO到byte最低位

  97. SCK = 0; // SCK置低

  98. }

  99. return(byte); // 返回讀出的一字節

  100. }

  101. /**************************************************/

  102. /**************************************************

  103. 函數:SPI_RW_Reg()

  104. 描述:寫數據value到reg寄存器

  105. 是不是通過寫地址確定寄存器,然后向其寫數據??

  106. /**************************************************/

  107. uchar SPI_RW_Reg(uchar reg, uchar value)

  108. {

  109. uchar status;

  110. CSN = 0; // CSN置低,開始傳輸數據

  111. status = SPI_RW(reg); // 選擇寄存器,同時返回狀態字

  112. SPI_RW(value); // 然后寫數據到該寄存器

  113. CSN = 1; // CSN拉高,結束數據傳輸

  114. return(status); // 返回狀態寄存器

  115. }

  116. /**************************************************/

  117. /**************************************************

  118. 函數:SPI_Read()

  119. 描述:

  120. 從reg寄存器讀一字節

  121. /**************************************************/

  122. uchar SPI_Read(uchar reg)

  123. {

  124. uchar reg_val;

  125. CSN = 0; // CSN置低,開始傳輸數據

  126. SPI_RW(reg); // 選擇寄存器

  127. reg_val = SPI_RW(0); // 然后從該寄存器讀數據 為什么送一個0就可以讀回一個數據

  128. CSN = 1;

  129. // CSN拉高,結束數據傳輸

  130. return(reg_val); // 返回寄存器數據

  131. }

  132. /**************************************************/

  133. /**************************************************

  134. 函數:SPI_Read_Buf()

  135. 描述:

  136. 從reg寄存器讀出bytes個字節,通常用來讀取接收通道

  137. 數據或接收/發送地址

  138. /**************************************************/

  139. uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes)

  140. {

  141. uchar status, i;

  142. CSN = 0; // CSN置低,開始傳輸數據

  143. status = SPI_RW(reg); // 選擇寄存器,同時返回狀態字

  144. for(i=0; i<bytes; i++)

  145. pBuf[ i] = SPI_RW(0); // 逐個字節從nRF24L01讀出

  146. CSN = 1; // CSN拉高,結束數據傳輸

  147. return(status); // 返回狀態寄存器

  148. }

  149. /**************************************************/

  150. /**************************************************

  151. 函數:SPI_Write_Buf()

  152. 描述:

  153. 把pBuf緩存中的數據寫入到nRF24L01,通常用來寫入發

  154. 射通道數據或接收/發送地址

  155. /**************************************************/

  156. uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes)

  157. {

  158. uchar status, i;

  159. CSN = 0; // CSN置低,開始傳輸數據

  160. status = SPI_RW(reg); // 選擇寄存器,同時返回狀態字

  161. for(i=0; i<bytes; i++)

  162. SPI_RW(pBuf[ i]); // 逐個字節寫入nRF24L01

  163. CSN = 1; // CSN拉高,結束數據傳輸

  164. return(status); // 返回狀態寄存器

  165. }

  166. /**************************************************/

  167. /**************************************************

  168. 函數:RX_Mode()

  169. 描述:

  170. 這個函數設置nRF24L01為接收模式,等待接收發送設備的數據包

  171. /**************************************************/

  172. void RX_Mode(void)

  173. {

  174. CE = 0;

  175. SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);

  176. // CRC使能,16位CRC校驗,上電,接收模式

  177. CE = 1; // 拉高CE啟動接收設備

  178. }

  179. /**************************************************/

  180. /**************************************************

  181. 函數:TX_Mode()

  182. 描述:

  183. 這個函數設置nRF24L01為發送模式,(CE=1持續至少10us),

  184. 130us后啟動發射,數據發送結束后,發送模塊自動轉入接收

  185. 模式等待應答信號。

  186. /**************************************************/

  187. void TX_Mode(uchar * BUF)

  188. {

  189. CE = 0;

  190. SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);

  191. // 寫入發送地址 (與接收地址一樣)

  192. SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);

  193. // 寫數據包到TX FIFO(前以定義BUF數組發送數據4字節,寫數據用于發送模式)

  194. SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);

  195. // CRC使能,16位CRC校驗,上電

  196. CE = 1;

  197. }

  198. /**************************************************/

  199. /*********

  200. *****************************************

  201. 函數: init_io()

  202. 描述:

  203. 初始化IO

  204. /**************************************************/

  205. void init_io(void)

  206. {

  207. CE = 0; // 待機

  208. CSN = 1; // SPI禁止

  209. SCK = 0; // SPI時鐘置低

  210. IRQ = 1; // 中斷復位

  211. SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);

  212. // 寫入發送地址 (與接收地址一樣)

  213. SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);

  214. // 為了應答接收設備,接收通道0地址和發送地址相同 (發射端設置0通道接收應答信號)

  215. SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自動應答

  216. SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0

  217. SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);

  218. // 自動重發延時等待250us+86us,自動重發10次

  219. SPI_RW_Reg(WRITE_REG + RF_CH, 10);

  220. // 選擇射頻通道0x40

  221. SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);

  222. // 接收通道0選擇和發送通道相同有效數據寬度

  223. SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);

  224. // 數據傳輸率1Mbps,發射功率0dBm,低噪聲放大器增益

  225. }

  226. /**************************************************/

  227. /**************************************************

  228. 函數:CheckButtons()

  229. 描述:

  230. 檢查按鍵是否按下,按下則發送一字節數據

  231. /**************************************************/

  232. void CheckButtons()

  233. {

  234. if(!P3_7)        // 讀取P3^0狀態

  235. {

  236. delay_ms(10);

  237. if(!P3_7)        // 讀取P3^0狀態

  238. {

  239. TX_BUF[0]=x ; // 數據送到緩存 (uchar DATA = 0x01;)

  240. TX_BUF[1]=y;

  241. TX_BUF[2]=z ; // 數據送到緩存 (uchar DATA = 0x01;)

  242. TX_BUF[3]=m;

  243. DisplayOneChar(4,0,table[x%16]);

  244. DisplayOneChar(4,1,table[y%16]);

  245. x++;y++;z+=2;m+=3;

  246. RX_Mode();        // 設置為接收模式

  247. while(!P3_7);

  248. }

  249. }

  250. }

  251. /**************************************************/

  252. void Init_T0 (void)

  253. {

  254. TMOD = 0x01;

  255. TH0 = (65536-50000) /256;

  256. TL0 = (65536-50000) %256;

  257. EA = 1;

  258. ET0 = 1;

  259. TR0 = 1;

  260. }

  261. /**************************************************

  262. 函數:main()

  263. 描述:

  264. 主函數

  265. /**************************************************/

  266. void main(void)

  267. { qq=0;init_io();        // 初始化IO

  268. LCDInit();

  269. Init_T0();

  270. RX_Mode();        // 設置為接收模式

  271. DisplayListChar(1,0,"Xt=");

  272. DisplayListChar(1,1,"Yt=");

  273. DisplayListChar(7,0,"Xr=");

  274. DisplayListChar(7,1,"Yr=");

  275. while(1)

  276. {

  277. CheckButtons();



  278. }

  279. }

  280. /**************************************************/

  281. void Time0_ISR(void) interrupt 1

  282. {

  283. TH0 = (65536-30000) /256;

  284. TL0 = (65536-30000) %256;

  285. SPI_RW(FLUSH_TX);

  286. TX_Mode(TX_BUF);        // 把nRF24L01設置為發送模式并發送數據

  287. //        Check_ACK(1); // 等待發送完畢,清除TX FIFO

  288. //        SPI_RW(FLUSH_TX);

  289. sta = SPI_Read(STATUS);        // 讀狀態寄存器

  290. if(RX_DR)        // 判斷是否接受到數據

  291. {

  292. SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH);

  293. // 從RX FIFO讀出數據

  294. flag = 1;

  295. }

  296. SPI_RW_Reg(WRITE_REG + STATUS, sta); // 清除RX_DS中斷標志

  297. if(flag)        // 接受完成

  298. {

  299. flag = 0;        // 清標志

  300. DisplayOneChar(10,0,table[RX_BUF[1]%16]);

  301. DisplayOneChar(10,1,table[RX_BUF[2]%16]);

  302. }

  303. }
復制代碼





回復

使用道具 舉報

ID:123289 發表于 2017-8-5 21:57 | 顯示全部樓層
程序是自己寫的?
NRF24L01通訊原理清楚?
回復

使用道具 舉報

ID:225049 發表于 2017-8-6 09:32 | 顯示全部樓層
yzwzfyz 發表于 2017-8-5 21:57
程序是自己寫的?
NRF24L01通訊原理清楚?

nrf24l01是網上找的,自己根據自己的理解改了一部分,lcd顯示自己寫的
回復

使用道具 舉報

ID:225125 發表于 2017-8-6 10:17 | 顯示全部樓層
先看看有沒有發送出來。把其中一個設置成接收模式,初始化后中斷腳為高,接收到數據中斷為低。
回復

使用道具 舉報

ID:225145 發表于 2017-8-6 11:00 | 顯示全部樓層
LCD顯示能用嗎?用用其他程序試試,或者先不用顯示,用幾個小燈接在扣上看看,數據是不是傳輸成功了
回復

使用道具 舉報

ID:225145 發表于 2017-8-6 11:02 | 顯示全部樓層
回復我怎么看不到啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品欧美激情精品一区 | 亚洲国产中文字幕 | 黄色在线免费观看 | 国产免费让你躁在线视频 | 精品国产乱码一区二区三 | 成人精品一区二区三区中文字幕 | 在线观看亚洲专区 | 中文字幕亚洲在线 | 成人免费毛片片v | 天天干天天插天天 | 亚洲欧洲综合av | 性国产丰满麻豆videosex | 亚洲一区二区精品视频 | 国产精品久久九九 | 伊人手机在线视频 | 国产激情在线 | 亚洲在线看 | 国产日韩精品久久 | 2020亚洲天堂 | 福利在线观看 | 中文字幕在线观看视频网站 | 欧美精品区 | 亚洲一区毛片 | 精品国产免费一区二区三区五区 | 91九色porny首页最多播放 | 亚洲三级在线观看 | 色婷婷精品国产一区二区三区 | 午夜小电影 | 亚洲国产一区在线 | 亚洲欧美激情四射 | 欧美乱淫视频 | 中文字幕国产精品 | 青青操91 | 欧美成人猛片aaaaaaa | 亚洲一区在线日韩在线深爱 | 亚洲国产日韩一区 | h视频在线免费 | 日韩中文久久 | 精品欧美一区二区三区久久久 | 狼色网 | 午夜影院在线观看 |