7924c632860833b2e7e91905ec0c0c786449b5e8.svn-base 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. C51 COMPILER V9.53.0.0 NRF24L01 09/28/2018 11:35:59 PAGE 1
  2. C51 COMPILER V9.53.0.0, COMPILATION OF MODULE NRF24L01
  3. OBJECT MODULE PLACED IN .\Output\nrf24l01.obj
  4. COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE ..\..\Code\User\Driver\nrf24l01.c LARGE OPTIMIZE(0,SPEED) BROWSE INCDIR(
  5. -../../Code/Include;../../Code/User;../../Code/User/Common;../../Code/User/Driver) DEFINE(FOSC_160000=1) DEBUG OBJECTEXTE
  6. -ND PRINT(.\Output\LST\nrf24l01.lst) TABS(2) OBJECT(.\Output\nrf24l01.obj)
  7. line level source
  8. 1 #include "nrf24l01.h"
  9. 2 const u8 TX_ADDRESS [TX_ADR_WIDTH]={0x60,0x20,0x30,0x40,0x50}; //发送地址
  10. 3
  11. 4 const u8 RX_ADDRESS0[RX_ADR_WIDTH]={0x10,0x20,0x30,0x40,0x50}; //接收地址
  12. 5 const u8 RX_ADDRESS1[RX_ADR_WIDTH]={0x20,0x20,0x30,0x40,0x50}; //接收地址
  13. 6 const u8 RX_ADDRESS2[1 ]={0x30}; //接收地址
  14. 7 const u8 RX_ADDRESS3[1 ]={0x40}; //接收地址
  15. 8 const u8 RX_ADDRESS4[1 ]={0x50}; //接收地址
  16. 9 const u8 RX_ADDRESS5[1 ]={0x60}; //接收地址
  17. 10
  18. 11
  19. 12
  20. 13 /*************************************************
  21. 14 * 函数名称:InitNrf24L01
  22. 15 * 功能描述:初始NRF24L01,包括对IRQ引脚的初始化
  23. 16 * 输入参数:无
  24. 17 * 输出参数:无
  25. 18 * 返回值: 返回0成功,返回1失败
  26. 19 **************************************************/
  27. 20 u8 InitNrf24L01(void)
  28. 21 {
  29. 22 1 #if 0
  30. GPIO_InitTypeDef GPIO_InitStructure;
  31. //使能GPIO 的时钟
  32. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE);
  33. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10|GPIO_Pin_11;
  34. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  35. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  36. GPIO_Init(GPIOB, &GPIO_InitStructure);
  37. //
  38. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
  39. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  40. GPIO_Init(GPIOA, &GPIO_InitStructure);
  41. #endif
  42. 35 1 //芯片失能
  43. 36 1 NRF_CE_H;
  44. 37 1 //没有中断
  45. 38 1 IRQ_H;
  46. 39 1 //SPI失能
  47. 40 1 CSN_H;
  48. 41 1 //MUC对nrf的中断配置
  49. 42 1 NrfIsrCfg();
  50. 43 1 return Nrf24L01Check();
  51. 44 1 }
  52. 45
  53. 46 /*************************************************
  54. 47 * 函数名称:SpiReadWriteByte
  55. 48 * 功能描述:主、从机交换8位数据
  56. 49 * 输入参数:- TxData:主机发送的数据
  57. 50 * 输出参数:无
  58. 51 * 返回值: 从机发送的数据
  59. 52 **************************************************/
  60. 53 #if 0
  61. C51 COMPILER V9.53.0.0 NRF24L01 09/28/2018 11:35:59 PAGE 2
  62. u8 SpiReadWriteByte(u8 TxData)
  63. {
  64. u8 i;
  65. NRF_SCK_L;//拉低时钟
  66. for(i=0;i<8;i++)
  67. {
  68. if(TxData & 0x80)
  69. MOSI_H;
  70. else
  71. MOSI_L;
  72. //移空最低位,丢弃最高位
  73. TxData = (TxData << 1);
  74. //写从设备
  75. NRF_SCK_H;
  76. //读从设备
  77. if(READ_MISO)
  78. //保存读取的数据
  79. TxData |= 0x01;
  80. //拉低时钟线.完成一次数据交换(SR和BUF)
  81. NRF_SCK_L;
  82. }
  83. return(TxData);
  84. }
  85. #else
  86. 78 unsigned char SpiReadWriteByte ( unsigned char byte )
  87. 79 {
  88. 80 1 unsigned char i;
  89. 81 1 SPDR = byte; //写寄存器
  90. 82 1
  91. 83 1 for ( i = 0; i < 255; i++ )
  92. 84 1 {
  93. 85 2 if ( SPSR & SET_BIT7 )
  94. 86 2 {
  95. 87 3 break; //等待传输
  96. 88 3 }
  97. 89 2 }
  98. 90 1
  99. 91 1 SPSR &= ~SET_BIT7;
  100. 92 1 byte = SPDR; //读寄存器
  101. 93 1 return byte;
  102. 94 1 }
  103. 95 #endif
  104. 96
  105. 97 /*************************************************
  106. 98 * 函数名称:Nrf24l01ReadWriteBus
  107. 99 * 功能描述:主、从机交换多个字节数据
  108. 100 * 输入参数:- cmd:指令;
  109. 101 - data:主机发送的数据
  110. 102 * 输出参数:- data:从机发送的数据
  111. 103 * 返回值: 无
  112. 104 **************************************************/
  113. 105 void Nrf24l01ReadWriteBus(u8 cmd,u8 Data[],u8 cnt)
  114. 106 {
  115. 107 1 //1、使能SPI传输
  116. 108 1 //2、发送指令
  117. 109 1 //3、发送、接收数据
  118. 110 1 //4、失能SPI传输
  119. 111 1 u8 i;
  120. 112 1 CSN_L;
  121. 113 1 SpiReadWriteByte(cmd);
  122. 114 1 for(i = 0; i < cnt; i++)
  123. 115 1 {
  124. C51 COMPILER V9.53.0.0 NRF24L01 09/28/2018 11:35:59 PAGE 3
  125. 116 2 Data[i] = SpiReadWriteByte(Data[i]);
  126. 117 2 }
  127. 118 1 CSN_H;
  128. 119 1 }
  129. 120 /*************************************************
  130. 121 * 函数名称:Nrf24L01Check
  131. 122 * 功能描述:检测NRF24L01是否存在
  132. 123 * 输入参数:无
  133. 124 * 输出参数:无
  134. 125 * 返回值: 返回0存在,返回1不存在
  135. 126 **************************************************/
  136. 127 u8 Nrf24L01Check(void)
  137. 128 {
  138. 129 1 u8 a[5]={0XA0,0XA1,0XA2,0XA3,0XA4};
  139. 130 1 u8 b[5];
  140. 131 1 u8 i;
  141. 132 1 for(i=0;i<5;i++)b[i]=a[i];
  142. 133 1 //写入5个字节.
  143. 134 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+TX_ADDR,a,5);
  144. 135 1 //读出写入的5个字节
  145. 136 1 Nrf24l01ReadWriteBus(SPI_READ_REG+TX_ADDR,a,5);
  146. 137 1 for(i=0;i<5;i++)
  147. 138 1 {
  148. 139 2 if(a[i]!=b[i]) break;
  149. 140 2 }
  150. 141 1 if(i!=5) return 1; //NRF24L01不在位
  151. 142 1 return 0; //NRF24L01在位
  152. 143 1 }
  153. 144 /*************************************************
  154. 145 * 函数名称:Nrf24L01SendPacket
  155. 146 * 功能描述:启动NRF24L01发送一次数据
  156. 147 * 输入参数:- tx_buf:要发送的数据
  157. 148 * 输出参数:无
  158. 149 * 返回值: 无
  159. 150 **************************************************/
  160. 151 void Nrf24L01SendPacket(u8 *tx_buf)
  161. 152 {
  162. 153 1 u8 result,Data[TX_PLOAD_WIDTH];
  163. 154 1 //失能芯片,进入配置模式
  164. 155 1 NRF_CE_L;
  165. 156 1 //数据复制,不希望原数据被更改
  166. 157 1 for(result=0;result<TX_PLOAD_WIDTH;result++)
  167. 158 1 Data[result]=tx_buf[result];
  168. 159 1 //写数据到发送缓冲区TX BUF 32个字节
  169. 160 1 Nrf24l01ReadWriteBus(WR_TX_PLOAD,Data,TX_PLOAD_WIDTH);
  170. 161 1 //使能芯片,启动发送
  171. 162 1 NRF_CE_H;
  172. 163 1 }
  173. 164
  174. 165 /*************************************************
  175. 166 * 函数名称:Nrf24l01GetPacketHandler
  176. 167 * 功能描述:NRF24L01接收数据中断处理函数
  177. 168 * 输入参数:- rx_buf:接收数据的数组
  178. 169 * 输出参数:- rx_buf: 接收到的数据
  179. 170 * 返回值: 接收的通道号
  180. 171 **************************************************/
  181. 172 u8 Nrf24l01GetPacketHandler(u8 *rx_buf)
  182. 173 {
  183. 174 1 u8 result,channel;
  184. 175 1 //读取状态寄存器的值
  185. 176 1 Nrf24l01ReadWriteBus(SPI_READ_REG+STATUS,&result,1);
  186. 177 1 //得到接收的通道号
  187. C51 COMPILER V9.53.0.0 NRF24L01 09/28/2018 11:35:59 PAGE 4
  188. 178 1 channel=((result&(7<<1))>>1);
  189. 179 1 //读取数据
  190. 180 1 Nrf24l01ReadWriteBus(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);
  191. 181 1 //清除中断标志位
  192. 182 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+STATUS,&result,1);
  193. 183 1 //清空接收FIFO,读取之后自动清空,若不读取,必须清空, 否则nrf24l01无法正常工作:不能产生中断信号
  194. 184 1 //Nrf24l01ReadWriteBus(FLUSH_RX,&result,1);
  195. 185 1 //返回接收的通道号
  196. 186 1 return channel;
  197. 187 1 }
  198. 188
  199. 189 /*************************************************
  200. 190 * 函数名称:Nrf24l01SendSuccessHandler
  201. 191 * 功能描述:发送数据成功中断处理函数
  202. 192 * 输入参数:无
  203. 193 * 输出参数:无
  204. 194 * 返回值: 无
  205. 195 **************************************************/
  206. 196 void Nrf24l01SendSuccessHandler(void)
  207. 197 {
  208. 198 1 u8 Data;
  209. 199 1 //读取状态寄存器
  210. 200 1 Nrf24l01ReadWriteBus(SPI_READ_REG+STATUS,&Data,1);
  211. 201 1 //清除所有中断标志位
  212. 202 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+STATUS,&Data,1);
  213. 203 1 //清除TX FIFO寄存器,发送成功,自动清除
  214. 204 1 // Nrf24l01ReadWriteBus(FLUSH_TX,&data,1);
  215. 205 1 }
  216. 206
  217. 207 /*************************************************
  218. 208 * 函数名称:Nrf24l01SendFailHandler
  219. 209 * 功能描述:发送数据失败中断处理函数
  220. 210 * 输入参数:无
  221. 211 * 输出参数:无
  222. 212 * 返回值: 无
  223. 213 **************************************************/
  224. 214 void Nrf24l01SendFailHandler(void)
  225. 215 {
  226. 216 1 u8 Data;
  227. 217 1 //读取状态寄存器
  228. 218 1 Nrf24l01ReadWriteBus(SPI_READ_REG+STATUS,&Data,1);
  229. 219 1 //清除所有中断标志位
  230. 220 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+STATUS,&Data,1);
  231. 221 1 //清除TX FIFO寄存器,发送失败,必须手动清除,否则nrf24l01不能正常工作
  232. 222 1 Nrf24l01ReadWriteBus(FLUSH_TX,&Data,1);
  233. 223 1 }
  234. 224
  235. 225 /*************************************************
  236. 226 * 函数名称:Nrf24l01GetMode
  237. 227 * 功能描述:配置NRF24L01到接收模式
  238. 228 * 输入参数:无
  239. 229 * 输出参数:无
  240. 230 * 返回值: 无
  241. 231 **************************************************/
  242. 232 void Nrf24l01GetMode(void)
  243. 233 {
  244. 234 1 u8 Data[RX_ADR_WIDTH],i;
  245. 235 1 //芯片失能,模块进入配置模式
  246. 236 1 NRF_CE_L;
  247. 237 1 //写RX节点地址,注意,是先写低位地址的,通道0可以拥有独立的40位地址。通道1-5的最低位字节地址不一样,其
  248. -他必须一样
  249. 238 1 for(i=0;i<RX_ADR_WIDTH;i++)
  250. C51 COMPILER V9.53.0.0 NRF24L01 09/28/2018 11:35:59 PAGE 5
  251. 239 1 Data[i]=RX_ADDRESS0[i];
  252. 240 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_ADDR_P0,Data,RX_ADR_WIDTH);
  253. 241 1 for(i=0;i<RX_ADR_WIDTH;i++)
  254. 242 1 Data[i]=RX_ADDRESS1[i];
  255. 243 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_ADDR_P1,Data,RX_ADR_WIDTH);
  256. 244 1
  257. 245 1 Data[0]=RX_ADDRESS2[0];
  258. 246 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_ADDR_P2,Data,1);
  259. 247 1 Data[0]=RX_ADDRESS3[0];
  260. 248 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_ADDR_P3,Data,1);
  261. 249 1 Data[0]=RX_ADDRESS4[0];
  262. 250 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_ADDR_P4,Data,1);
  263. 251 1 Data[0]=RX_ADDRESS5[0];
  264. 252 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_ADDR_P5,Data,1);
  265. 253 1
  266. 254 1 //使能通道0-5的自动应答,根据手册默认都是是开启的,实际测试发现并没有,可能是其他因素所致
  267. 255 1 Data[0] = 0x3f;
  268. 256 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+EN_AA,Data,1);
  269. 257 1
  270. 258 1 //使能通道0-5的接收地址,通道0,1默认的开启的
  271. 259 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+EN_RXADDR,Data,1);
  272. 260 1 Data[0] = 0x3f;
  273. 261 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+EN_RXADDR,Data,1);
  274. 262 1
  275. 263 1 //选择通道0的有效数据宽度
  276. 264 1 Data[0] = RX_PLOAD_WIDTH;
  277. 265 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_PW_P0,Data,1);
  278. 266 1 //选择通道1的有效数据宽度
  279. 267 1 Data[0] = RX_PLOAD_WIDTH;
  280. 268 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_PW_P1,Data,1);
  281. 269 1 //选择通道2的有效数据宽度
  282. 270 1 Data[0] = RX_PLOAD_WIDTH;
  283. 271 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_PW_P2,Data,1);
  284. 272 1 //选择通道3的有效数据宽度
  285. 273 1 Data[0] = RX_PLOAD_WIDTH;
  286. 274 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_PW_P3,Data,1);
  287. 275 1 //选择通道4的有效数据宽度
  288. 276 1 Data[0] = RX_PLOAD_WIDTH;
  289. 277 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_PW_P4,Data,1);
  290. 278 1 //选择通道5的有效数据宽度
  291. 279 1 Data[0] = RX_PLOAD_WIDTH;
  292. 280 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_PW_P5,Data,1);
  293. 281 1
  294. 282 1
  295. 283 1 //射频通道0-6位
  296. 284 1 Data[0] = 0x4f;
  297. 285 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RF_CH,Data,1);
  298. 286 1 //0db增益,2Mbps,低噪声增益开启
  299. 287 1 Data[0]=0;
  300. 288 1 //bit3:产生速率,1->2Mbps 0->1Mbps
  301. 289 1 Data[0]|=1<<3;
  302. 290 1 //bit2-bit1:发射功率,
  303. 291 1 //00:-18dBm 01:-12dBm 10:-6dBm 11:0dBm
  304. 292 1 Data[0]|=0<<1;
  305. 293 1 //bit0:低噪声放大器增益,1开启0关闭
  306. 294 1 Data[0]|=0<<0;
  307. 295 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RF_SETUP,Data,1);
  308. 296 1 Data[0]=0;
  309. 297 1 //bit6:接收中断,1屏蔽,0不屏蔽
  310. 298 1 Data[0]|=0<<6;
  311. 299 1 //bit5:发送中断,1屏蔽,0不屏蔽
  312. 300 1 Data[0]|=0<<5;
  313. C51 COMPILER V9.53.0.0 NRF24L01 09/28/2018 11:35:59 PAGE 6
  314. 301 1 //bit4:达到最大重发中断,1屏蔽,0不屏蔽
  315. 302 1 Data[0]|=0<<4;
  316. 303 1 //bit3:CRC使能,1使能,0不使能
  317. 304 1 Data[0]|=1<<3;
  318. 305 1 //bit2:CRC模式,1->16位CRC校验,0->8位CRC校验
  319. 306 1 Data[0]|=1<<2;
  320. 307 1 //bit1:1上电0掉电
  321. 308 1 Data[0]|=1<<1;
  322. 309 1 //bit0:1接收模式0发送模式
  323. 310 1 Data[0]|=1<<0;
  324. 311 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+CONFIG, Data,1);
  325. 312 1 //必须先清空接收FIFO否则nrf不能产生中断信号
  326. 313 1 //如果此时mcu使用接收中断的方式处理,就无法进
  327. 314 1 //入中断,IRQ一直保持低电平或高电平,若清除了
  328. 315 1 //标志位,就一直保持高电平,否则一直保持低电
  329. 316 1 //平。若使用查询方式,那么不必执行清空接收
  330. 317 1 //FIFO但有可能第一次接收到错误的数据
  331. 318 1 Nrf24l01ReadWriteBus(FLUSH_RX,Data,1);
  332. 319 1 //读取状态寄存器的值
  333. 320 1 Nrf24l01ReadWriteBus(SPI_READ_REG+STATUS,Data,1);
  334. 321 1 //清除所有的标志位,否则进入工作模式后IRQ一直为低
  335. 322 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+STATUS,Data,1);
  336. 323 1 //芯片使能,进入接收模式
  337. 324 1 NRF_CE_H;
  338. 325 1 }
  339. 326
  340. 327 /*************************************************
  341. 328 * 函数名称:Nrf24l01SendMode
  342. 329 * 功能描述:配置NRF24L01到发送模式
  343. 330 * 输入参数:无
  344. 331 * 输出参数:无
  345. 332 * 返回值: 无
  346. 333 **************************************************/
  347. 334 void Nrf24l01SendMode(void)
  348. 335 {//
  349. 336 1 u8 Data[TX_ADR_WIDTH],i;
  350. 337 1 //地址复制,不希望原数据被更改
  351. 338 1 for(i=0;i<TX_ADR_WIDTH;i++)
  352. 339 1 Data[i]=TX_ADDRESS[i];
  353. 340 1 //失能芯片,进入配置模式
  354. 341 1 NRF_CE_L;
  355. 342 1 //写TX节点地址
  356. 343 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+TX_ADDR,Data,TX_ADR_WIDTH);
  357. 344 1 //设置RX节点地址,一定是使用通道0的,在发送端,规定使用通道0发送数据和接收应答信号,
  358. 345 1 //收发地址是一样的才能正确应答
  359. 346 1 for(i=0;i<TX_ADR_WIDTH;i++)
  360. 347 1 Data[i]=TX_ADDRESS[i];
  361. 348 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RX_ADDR_P0,Data,TX_ADR_WIDTH);
  362. 349 1 //使能通道0的自动应答
  363. 350 1 Data[0]=1;
  364. 351 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+EN_AA,Data,1);
  365. 352 1 //使能通道0的接收地址
  366. 353 1 Data[0]=1;
  367. 354 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+EN_RXADDR,Data,1);
  368. 355 1 //设置自动重发间隔时间,最大自动重发次数
  369. 356 1 Data[0]=0x0;
  370. 357 1 //bit7-bit4:自动重发延时,250*x+86us
  371. 358 1 Data[0]|=(0<<4);
  372. 359 1 //bit3-bit0:自动重发次数
  373. 360 1 Data[0]|=(15<<0);
  374. 361 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+SETUP_RETR,Data,1);
  375. 362 1 //设置RF通道bit0-bit6 实际通信频率=RF_CH+2400 (MHz)
  376. C51 COMPILER V9.53.0.0 NRF24L01 09/28/2018 11:35:59 PAGE 7
  377. 363 1 Data[0]=0x4f;
  378. 364 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RF_CH,Data,1);
  379. 365 1 //0db增益,2Mbps,低噪声增益开启
  380. 366 1 Data[0]=0;
  381. 367 1 //bit3:产生速率,1->2Mbps 0->1Mbps
  382. 368 1 Data[0]|=1<<3;
  383. 369 1 //bit2-bit1:发射功率,
  384. 370 1 //00:-18dBm 01:-12dBm 10:-6dBm 11:0dBm
  385. 371 1 Data[0]|=0<<1;
  386. 372 1 //bit0:低噪声放大器增益,1开启0关闭
  387. 373 1 Data[0]|=0<<0;
  388. 374 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+RF_SETUP,Data,1);
  389. 375 1 Data[0]=0;
  390. 376 1 //bit6:接收中断,1屏蔽,0不屏蔽
  391. 377 1 Data[0]|=0<<6;
  392. 378 1 //bit5:发送中断,1屏蔽,0不屏蔽
  393. 379 1 Data[0]|=0<<5;
  394. 380 1 //bit4:达到最大重发中断,1屏蔽,0不屏蔽
  395. 381 1 Data[0]|=0<<4;
  396. 382 1 //bit3:CRC使能,1使能,0不使能
  397. 383 1 Data[0]|=1<<3;
  398. 384 1 //bit2:CRC模式,1->16位CRC校验,0->8位CRC校验
  399. 385 1 Data[0]|=1<<2;
  400. 386 1 //bit1:1上电0掉电
  401. 387 1 Data[0]|=1<<1;
  402. 388 1 //bit0:1接收模式0发送模式
  403. 389 1 Data[0]|=0<<0;
  404. 390 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+CONFIG,Data,1);
  405. 391 1 //清空发送FIFO
  406. 392 1 Nrf24l01ReadWriteBus(FLUSH_TX,Data,1);
  407. 393 1 //读取状态寄存器
  408. 394 1 Nrf24l01ReadWriteBus(SPI_READ_REG+STATUS,Data,1);
  409. 395 1 //清除所有中断标志位
  410. 396 1 Nrf24l01ReadWriteBus(SPI_WRITE_REG+STATUS,Data,1);
  411. 397 1 //芯片使能,进入发送模式
  412. 398 1 NRF_CE_H;
  413. 399 1 }
  414. 400
  415. 401 /*************************************************
  416. 402 * 函数名称:NrfIsrCfg
  417. 403 * 功能描述:配置NRF24L01 IRQ引脚中断io
  418. 404 * 输入参数:无
  419. 405 * 输出参数:无
  420. 406 * 返回值: 无
  421. 407 **************************************************/
  422. 408 void NrfIsrCfg(void)
  423. 409 {
  424. 410 1 #if 0
  425. //1、时钟使能。
  426. //2、muc外部中断引脚的配置
  427. //3、中断优先级的配置
  428. GPIO_InitTypeDef GPIO_InitStructure;
  429. EXTI_InitTypeDef EXTI_InitStruct;
  430. NVIC_InitTypeDef NVIC_InitStruct;
  431. //清除中断标志位
  432. EXTI_ClearITPendingBit(0x1f<<5);
  433. //开启复用功能时钟和io时钟
  434. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,ENABLE);
  435. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
  436. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
  437. GPIO_Init(GPIOA,&GPIO_InitStructure);
  438. //配置中断源
  439. C51 COMPILER V9.53.0.0 NRF24L01 09/28/2018 11:35:59 PAGE 8
  440. GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource6);
  441. //外部中断线配置
  442. EXTI_InitStruct.EXTI_Line=EXTI_Line6;
  443. EXTI_InitStruct.EXTI_LineCmd=ENABLE;
  444. EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
  445. EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿触发
  446. EXTI_Init( &EXTI_InitStruct);
  447. //优先级配置
  448. NVIC_InitStruct.NVIC_IRQChannel=EXTI9_5_IRQn;
  449. NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
  450. NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0x3;
  451. NVIC_InitStruct.NVIC_IRQChannelSubPriority=0x3;
  452. NVIC_Init(&NVIC_InitStruct);
  453. #else
  454. 439 1 /*
  455. 440 1 NRF24L01_Interrupt_P03
  456. 441 1
  457. 442 1 PIPEN 中断使能
  458. 443 1 PINEN 正反向特性
  459. 444 1 PICON 触发方式(电平或边沿检测)
  460. 445 1 PIF 中断标志
  461. 446 1 */
  462. 447 1 //P0M1|=SET_BIT3;P0M2&=~SET_BIT3; //input
  463. 448 1 PICON &= ~ ( SET_BIT0 | SET_BIT1 );
  464. 449 1 PICON |= ( 0x00 ); //[1:0]=0.端口0
  465. 450 1 PICON |= SET_BIT5; //通道3=1.边沿触发
  466. 451 1 PINEN |= SET_BIT3; // 1 = 低电平/ 下降沿触发中断
  467. 452 1 PIPEN &= ~SET_BIT3; //0 = 关闭中断(高电平/ 上升沿触发中断)
  468. 453 1 EIE |= SET_BIT1; //管脚中断,最多8个,中断号7
  469. 454 1 EA = 1; // 总中断
  470. 455 1 #endif
  471. 456 1 }
  472. 457
  473. 458
  474. 459
  475. 460 static u8 rx_data[33];
  476. 461 static u8 channel;
  477. 462 #if 0
  478. void EXTI9_5_IRQHandler()
  479. {
  480. u8 Data;
  481. //判断中断源
  482. if(RESET != EXTI_GetITStatus(EXTI_Line6))
  483. {
  484. //读取nrf24l01的状态寄存器
  485. Nrf24l01ReadWriteBus(SPI_READ_REG+STATUS,&data,1);
  486. if(Data&(1<<4))
  487. {
  488. Nrf24l01SendFailHandler();
  489. printf("达到最大重发数中断\r\n");
  490. }
  491. if(Data&(1<<5))
  492. {
  493. printf("数据发送完成中断\r\n");
  494. Nrf24l01SendSuccessHandler();
  495. }
  496. if(Data&(1<<6))
  497. {
  498. channel = Nrf24l01GetPacketHandler(rx_data);
  499. printf("接收数据中断 接收的数据威:%s 接收通道为%d\r\n",rx_data,channel);
  500. }
  501. }
  502. C51 COMPILER V9.53.0.0 NRF24L01 09/28/2018 11:35:59 PAGE 9
  503. //清除EXTI中断标志位
  504. EXTI_ClearITPendingBit(EXTI_Line6);
  505. }
  506. #else
  507. 491 //NRF24L01中断处理:当状态寄存器中 TX_DS、 RX_DR 或 MAX_RT 为高时触发中断。
  508. 492 #ifdef N76E003_IAR
  509. #pragma vector=0x3B
  510. __interrupt void NRF24L01_Handler ( void )
  511. #else
  512. 496 void NRF24L01_Handler ( void ) interrupt 7 //interrupt address is 0x001B
  513. 497 #endif
  514. 498 {
  515. 499 1 u8 Data;
  516. 500 1 clr_EPI; //关闭管脚中断7
  517. 501 1
  518. 502 1 //判断中断源
  519. 503 1 if(PIF&SET_BIT3)
  520. 504 1 {
  521. 505 2 //读取nrf24l01的状态寄存器
  522. 506 2 Nrf24l01ReadWriteBus(SPI_READ_REG+STATUS,&Data,1);
  523. 507 2 if(Data&(1<<4))
  524. 508 2 {
  525. 509 3 Nrf24l01SendFailHandler();
  526. 510 3 //printf("达到最大重发数中断\r\n");
  527. 511 3 }
  528. 512 2 if(Data&(1<<5))
  529. 513 2 {
  530. 514 3 Nrf24l01SendSuccessHandler();
  531. 515 3 //printf("数据发送完成中断\r\n");
  532. 516 3 }
  533. 517 2 if(Data&(1<<6))
  534. 518 2 {
  535. 519 3 channel = Nrf24l01GetPacketHandler(rx_data);
  536. 520 3 //printf("接收数据中断 接收的数据威:%s 接收通道为%d\r\n",rx_data,channel);
  537. 521 3 }
  538. 522 2 }
  539. 523 1 PIF = 0x00; //清除全部标志
  540. 524 1
  541. 525 1 set_EPI; //开启管脚中断7
  542. 526 1 }
  543. 527 #endif
  544. MODULE INFORMATION: STATIC OVERLAYABLE
  545. CODE SIZE = 2037 ----
  546. CONSTANT SIZE = 5 ----
  547. XDATA SIZE = 128 ----
  548. PDATA SIZE = ---- ----
  549. DATA SIZE = ---- ----
  550. IDATA SIZE = ---- ----
  551. BIT SIZE = ---- ----
  552. END OF MODULE INFORMATION.
  553. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)