找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1155|回复: 0
收起左侧

STC5A60S2+nrf24l01芯片代码

[复制链接]
ID:485556 发表于 2019-3-14 20:46 | 显示全部楼层 |阅读模式
前几日从某宝平台购得一nrf24l01据悉为台产芯片
使用单片机为STC5A60S2
代码如下,仅供参考

  1. #include "STC5A60S2.H"

  2. #include <intrins.h>

  3. #include <string.h>

  4. #include "NRF_24L01.h"

  5. #include "UART.H"

  6. #define uchar unsigned char


  7. uchar const TX_ADDRESS[TX_ADR_WIDTH]  = {0x34,0x43,0x10,0x10,0x01}; // Define a static TX address

  8. uchar rx_buf[TX_PLOAD_WIDTH];

  9. uchar tx_buf[TX_PLOAD_WIDTH];

  10. uchar flag;



  11. /**************************************************/



  12. //sbit LED1= P3^7;
  13. /**************************************************/
  14. unsigned char        bdata sta;

  15. sbit        RX_DR        =sta^6;

  16. sbit        TX_DS        =sta^5;

  17. sbit        MAX_RT        =sta^4;
  18. /**************************************************/

  19. /**************************************************
  20. Function: init_io();
  21. Description:
  22.   flash led one time,chip enable(ready to TX or RX Mode),
  23.   Spi disable,Spi clock line init high
  24. /**************************************************/
  25. #define KEY 0xaa
  26. void init_nrf24l01_io(void)
  27. {
  28.         CE=0;                        // chip enable
  29.         CSN=1;                        // Spi disable        
  30.         SCK=0;                        // Spi clock line init high
  31. }
  32. /**************************************************/

  33. /**************************************************
  34. Function: Inituart();

  35. Description:
  36.   set uart working mode
  37. /**************************************************/


  38. void delay_ms(unsigned int _ms)
  39. {
  40.   for(_ms;_ms;_ms--)
  41.   {
  42.     _delay_us(1000);
  43.   }
  44. }
  45. /**************************************************/

  46. /**************************************************
  47. Function: SPI_RW();

  48. Description:
  49.   Writes one byte to nRF24L01, and return the byte read
  50.   from nRF24L01 during write, according to SPI protocol
  51. /**************************************************/
  52. bdata unsigned char st=0;
  53. sbit st_1=st^0;
  54. sbit st_2=st^1;
  55. sbit st_3=st^2;
  56. sbit st_4=st^3;
  57. sbit st_5=st^4;
  58. sbit st_6=st^5;
  59. sbit st_7=st^6;
  60. sbit st_8=st^7;
  61. bdata unsigned char st1=0;
  62. sbit st_11=st1^0;
  63. sbit st_12=st1^1;
  64. sbit st_13=st1^2;
  65. sbit st_14=st1^3;
  66. sbit st_15=st1^4;
  67. sbit st_16=st1^5;
  68. sbit st_17=st1^6;
  69. sbit st_18=st1^7;
  70. /*
  71. uchar SPI_RW(uchar byte)
  72. {
  73.         uchar bit_ctr;
  74.            for(bit_ctr=0;bit_ctr<8;bit_ctr++)   // output 8-bit
  75.            {
  76.                    MOSI = (byte & 0x80);         // output 'byte', MSB to MOSI
  77.                    byte = (byte << 1);           // shift next bit into MSB..
  78.                    SCK = 1;                      // Set SCK high..
  79.                 MISO=1;
  80.                    byte |= MISO;                         // capture current MISO bit
  81.                    SCK = 0;                              // ..then set SCK low again
  82.            }
  83.     return(byte);                             // return read byte
  84. }
  85. */

  86. uchar SPI_RW(uchar byte)
  87. {
  88.         //uchar bit_ctr;

  89.     st=byte;

  90.     MOSI=st_8;
  91.     SCK = 1;
  92.     st_18=MISO;
  93.     SCK = 0;

  94.     MOSI=st_7;
  95.     SCK = 1;
  96.     st_17=MISO;
  97.     SCK = 0;

  98.     MOSI=st_6;
  99.     SCK = 1;
  100.     st_16=MISO;
  101.     SCK = 0;

  102.     MOSI=st_5;
  103.     SCK = 1;
  104.     st_15=MISO;
  105.     SCK = 0;

  106.     MOSI=st_4;
  107.     SCK = 1;
  108.     st_14=MISO;
  109.     SCK = 0;

  110.     MOSI=st_3;
  111.     SCK = 1;
  112.     st_13=MISO;
  113.     SCK = 0;

  114.     MOSI=st_2;
  115.     SCK = 1;
  116.     st_12=MISO;
  117.     SCK = 0;

  118.     MOSI=st_1;
  119.     SCK = 1;
  120.     st_11=MISO;
  121.     SCK = 0;


  122.     return(st1);                             // return read byte
  123. }
  124. /**************************************************/

  125. /**************************************************
  126. Function: SPI_RW_Reg();

  127. Description:
  128.   Writes value 'value' to register 'reg'
  129. /**************************************************/
  130. uchar SPI_RW_Reg(BYTE reg, BYTE value)
  131. {
  132.         uchar status;
  133.           CSN = 0;                   // CSN low, init SPI transaction
  134.           status = SPI_RW(reg);      // select register
  135.           SPI_RW(value);             // ..and write value to it..
  136.           CSN = 1;                   // CSN high again
  137.           return(status);            // return nRF24L01 status byte
  138. }
  139. /**************************************************/

  140. /**************************************************
  141. Function: SPI_Read();

  142. Description:
  143.   Read one byte from nRF24L01 register, 'reg'
  144. /**************************************************/
  145. BYTE SPI_Read(BYTE reg)
  146. {
  147.         BYTE reg_val;

  148.           CSN = 0;                // CSN low, initialize SPI communication...
  149.           SPI_RW(reg);            // Select register to read from..
  150.           reg_val = SPI_RW(0);    // ..then read registervalue
  151.           CSN = 1;                // CSN high, terminate SPI communication

  152.           return(reg_val);        // return register value
  153. }
  154. /**************************************************/

  155. /**************************************************
  156. Function: SPI_Read_Buf();

  157. Description:
  158.   Reads 'bytes' #of bytes from register 'reg'
  159.   Typically used to read RX payload, Rx/Tx address
  160. /**************************************************/
  161. uchar SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)
  162. {
  163.         uchar status,byte_ctr;

  164.           CSN = 0;                                    // Set CSN low, init SPI tranaction
  165.           status = SPI_RW(reg);                       // Select register to write to and read status byte

  166.           for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
  167.             pBuf[byte_ctr] = SPI_RW(0);    // Perform SPI_RW to read byte from nRF24L01

  168.           CSN = 1;                           // Set CSN high again

  169.           return(status);                    // return nRF24L01 status byte
  170. }
  171. /**************************************************/

  172. /**************************************************
  173. Function: SPI_Write_Buf();

  174. Description:
  175.   Writes contents of buffer '*pBuf' to nRF24L01
  176.   Typically used to write TX payload, Rx/Tx address
  177. /**************************************************/
  178. uchar SPI_Write_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)
  179. {
  180.         uchar status,byte_ctr;

  181.           CSN = 0;                   // Set CSN low, init SPI tranaction
  182.           status = SPI_RW(reg);    // Select register to write to and read status byte
  183.           for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // then write all byte in buffer(*pBuf)
  184.             SPI_RW(*pBuf++);
  185.           CSN = 1;                 // Set CSN high again
  186.           return(status);          // return nRF24L01 status byte
  187. }
  188. /**************************************************/

  189. /**************************************************
  190. Function: RX_Mode();

  191. Description:
  192.   This function initializes one nRF24L01 device to
  193.   RX Mode, set RX address, writes RX payload width,
  194.   select RF channel, datarate & LNA HCURR.
  195.   After init, CE is toggled high, which means that
  196.   this device is now ready to receive a datapacket.
  197. /**************************************************/
  198. void power_off()
  199. {
  200.                                   CE=0;
  201.                                 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0D);
  202.                                 CE=1;
  203.                                 _delay_us(20);
  204. }
  205. void ifnnrf_rx_mode(void)
  206. {
  207.     power_off();
  208.         CE=0;
  209.           SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // Use the same address on the RX device as the TX device

  210.           SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // Enable Auto.Ack:Pipe0
  211.           SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0
  212.           SPI_RW_Reg(WRITE_REG + RF_CH, 40);        // Select RF channel 40
  213.           SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // Select same RX payload width as TX Payload width
  214.           SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
  215.           SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);     // Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX. RX_DR enabled..

  216.           CE = 1; // Set CE pin high to enable RX device

  217.   //  This device is now ready to receive one packet of 16 bytes payload from a TX device sending to address
  218.   //  '3443101001', with auto acknowledgment, retransmit count of 10, RF channel 40 and datarate = 2Mbps.

  219. }
  220. /**************************************************/

  221. /**************************************************
  222. Function: TX_Mode();

  223. Description:
  224.   This function initializes one nRF24L01 device to
  225.   TX mode, set TX address, set RX address for auto.ack,
  226.   fill TX payload, select RF channel, datarate & TX pwr.
  227.   PWR_UP is set, CRC(2 bytes) is enabled, & PRIM:TX.

  228.   ToDo: One high pulse(>10us) on CE will now send this
  229.   packet and expext an acknowledgment from the RX device.
  230. /**************************************************/
  231. void ifnnrf_tx_mode(void)
  232. {
  233.     power_off();
  234.         CE=0;
  235.         
  236.           SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // Writes TX_Address to nRF24L01
  237.           SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack
  238.           SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // Writes data to TX payload

  239.           SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // Enable Auto.Ack:Pipe0
  240.           SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0
  241.           SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...
  242.           SPI_RW_Reg(WRITE_REG + RF_CH, 40);        // Select RF channel 40
  243.           SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
  244.           SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);     // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. MAX_RT & TX_DS enabled..
  245.         CE=1;

  246. }

  247. void SPI_CLR_Reg(BYTE R_T)
  248. {
  249.           CSN = 0;
  250.         if(R_T==1)                  // CSN low, init SPI transaction
  251.           SPI_RW(FLUSH_TX);             // ..and write value to it..
  252.         else
  253.         SPI_RW(FLUSH_RX);             // ..and write value to it..
  254.           CSN = 1;                   // CSN high again
  255. }

  256. void ifnnrf_CLERN_ALL()
  257. {
  258.   SPI_CLR_Reg(0);
  259.   SPI_CLR_Reg(1);
  260.   SPI_RW_Reg(WRITE_REG+STATUS,0xff);
  261.   IRQ=1;
  262. }

复制代码




24L01_20KB_PS.rar

112.64 KB, 下载次数: 8, 下载积分: 黑币 -5

全部程序

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表