Naze32 clone with Frysky receiver
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cc2500.h 8.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #ifndef _IFACE_CC2500_H_
  2. #define _IFACE_CC2500_H_
  3. #include <stdint.h>
  4. enum {
  5. CC2500_00_IOCFG2 = 0x00, // GDO2 output pin configuration
  6. CC2500_01_IOCFG1 = 0x01, // GDO1 output pin configuration
  7. CC2500_02_IOCFG0 = 0x02, // GDO0 output pin configuration
  8. CC2500_03_FIFOTHR = 0x03, // RX FIFO and TX FIFO thresholds
  9. CC2500_04_SYNC1 = 0x04, // Sync word, high byte
  10. CC2500_05_SYNC0 = 0x05, // Sync word, low byte
  11. CC2500_06_PKTLEN = 0x06, // Packet length
  12. CC2500_07_PKTCTRL1 = 0x07, // Packet automation control
  13. CC2500_08_PKTCTRL0 = 0x08, // Packet automation control
  14. CC2500_09_ADDR = 0x09, // Device address
  15. CC2500_0A_CHANNR = 0x0A, // Channel number
  16. CC2500_0B_FSCTRL1 = 0x0B, // Frequency synthesizer control
  17. CC2500_0C_FSCTRL0 = 0x0C, // Frequency synthesizer control
  18. CC2500_0D_FREQ2 = 0x0D, // Frequency control word, high byte
  19. CC2500_0E_FREQ1 = 0x0E, // Frequency control word, middle byte
  20. CC2500_0F_FREQ0 = 0x0F, // Frequency control word, low byte
  21. CC2500_10_MDMCFG4 = 0x10, // Modem configuration
  22. CC2500_11_MDMCFG3 = 0x11, // Modem configuration
  23. CC2500_12_MDMCFG2 = 0x12, // Modem configuration
  24. CC2500_13_MDMCFG1 = 0x13, // Modem configuration
  25. CC2500_14_MDMCFG0 = 0x14, // Modem configuration
  26. CC2500_15_DEVIATN = 0x15, // Modem deviation setting
  27. CC2500_16_MCSM2 = 0x16, // Main Radio Cntrl State Machine config
  28. CC2500_17_MCSM1 = 0x17, // Main Radio Cntrl State Machine config
  29. CC2500_18_MCSM0 = 0x18, // Main Radio Cntrl State Machine config
  30. CC2500_19_FOCCFG = 0x19, // Frequency Offset Compensation config
  31. CC2500_1A_BSCFG = 0x1A, // Bit Synchronization configuration
  32. CC2500_1B_AGCCTRL2 = 0x1B, // AGC control
  33. CC2500_1C_AGCCTRL1 = 0x1C, // AGC control
  34. CC2500_1D_AGCCTRL0 = 0x1D, // AGC control
  35. CC2500_1E_WOREVT1 = 0x1E, // High byte Event 0 timeout
  36. CC2500_1F_WOREVT0 = 0x1F, // Low byte Event 0 timeout
  37. CC2500_20_WORCTRL = 0x20, // Wake On Radio control
  38. CC2500_21_FREND1 = 0x21, // Front end RX configuration
  39. CC2500_22_FREND0 = 0x22, // Front end TX configuration
  40. CC2500_23_FSCAL3 = 0x23, // Frequency synthesizer calibration
  41. CC2500_24_FSCAL2 = 0x24, // Frequency synthesizer calibration
  42. CC2500_25_FSCAL1 = 0x25, // Frequency synthesizer calibration
  43. CC2500_26_FSCAL0 = 0x26, // Frequency synthesizer calibration
  44. CC2500_27_RCCTRL1 = 0x27, // RC oscillator configuration
  45. CC2500_28_RCCTRL0 = 0x28, // RC oscillator configuration
  46. CC2500_29_FSTEST = 0x29, // Frequency synthesizer cal control
  47. CC2500_2A_PTEST = 0x2A, // Production test
  48. CC2500_2B_AGCTEST = 0x2B, // AGC test
  49. CC2500_2C_TEST2 = 0x2C, // Various test settings
  50. CC2500_2D_TEST1 = 0x2D, // Various test settings
  51. CC2500_2E_TEST0 = 0x2E, // Various test settings
  52. // Status registers
  53. CC2500_30_PARTNUM = 0x30, // Part number
  54. CC2500_31_VERSION = 0x31, // Current version number
  55. CC2500_32_FREQEST = 0x32, // Frequency offset estimate
  56. CC2500_33_LQI = 0x33, // Demodulator estimate for link quality
  57. CC2500_34_RSSI = 0x34, // Received signal strength indication
  58. CC2500_35_MARCSTATE = 0x35, // Control state machine state
  59. CC2500_36_WORTIME1 = 0x36, // High byte of WOR timer
  60. CC2500_37_WORTIME0 = 0x37, // Low byte of WOR timer
  61. CC2500_38_PKTSTATUS = 0x38, // Current GDOx status and packet status
  62. CC2500_39_VCO_VC_DAC = 0x39, // Current setting from PLL cal module
  63. CC2500_3A_TXBYTES = 0x3A, // Underflow and # of bytes in TXFIFO
  64. CC2500_3B_RXBYTES = 0x3B, // Overflow and # of bytes in RXFIFO
  65. // Multi byte memory locations
  66. CC2500_3E_PATABLE = 0x3E,
  67. CC2500_3F_TXFIFO = 0x3F,
  68. CC2500_3F_RXFIFO = 0x3F,
  69. };
  70. // Definitions for burst/single access to registers
  71. #define CC2500_WRITE_SINGLE 0x00
  72. #define CC2500_WRITE_BURST 0x40
  73. #define CC2500_READ_SINGLE 0x80
  74. #define CC2500_READ_BURST 0xC0
  75. // Strobe commands
  76. #define CC2500_SRES 0x30 // Reset chip.
  77. #define CC2500_SFSTXON 0x31 // Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1).
  78. // If in RX/TX: Go to a wait state where only the synthesizer is
  79. // running (for quick RX / TX turnaround).
  80. #define CC2500_SXOFF 0x32 // Turn off crystal oscillator.
  81. #define CC2500_SCAL 0x33 // Calibrate frequency synthesizer and turn it off
  82. // (enables quick start).
  83. #define CC2500_SRX 0x34 // Enable RX. Perform calibration first if coming from IDLE and
  84. // MCSM0.FS_AUTOCAL=1.
  85. #define CC2500_STX 0x35 // In IDLE state: Enable TX. Perform calibration first if
  86. // MCSM0.FS_AUTOCAL=1. If in RX state and CCA is enabled:
  87. // Only go to TX if channel is clear.
  88. #define CC2500_SIDLE 0x36 // Exit RX / TX, turn off frequency synthesizer and exit
  89. // Wake-On-Radio mode if applicable.
  90. #define CC2500_SAFC 0x37 // Perform AFC adjustment of the frequency synthesizer
  91. #define CC2500_SWOR 0x38 // Start automatic RX polling sequence (Wake-on-Radio)
  92. #define CC2500_SPWD 0x39 // Enter power down mode when CSn goes high.
  93. #define CC2500_SFRX 0x3A // Flush the RX FIFO buffer.
  94. #define CC2500_SFTX 0x3B // Flush the TX FIFO buffer.
  95. #define CC2500_SWORRST 0x3C // Reset real time clock.
  96. #define CC2500_SNOP 0x3D // No operation. May be used to pad strobe commands to two
  97. // bytes for simpler software.
  98. //----------------------------------------------------------------------------------
  99. // Chip Status Byte
  100. //----------------------------------------------------------------------------------
  101. // Bit fields in the chip status byte
  102. #define CC2500_STATUS_CHIP_RDYn_BM 0x80
  103. #define CC2500_STATUS_STATE_BM 0x70
  104. #define CC2500_STATUS_FIFO_BYTES_AVAILABLE_BM 0x0F
  105. // Chip states
  106. #define CC2500_STATE_IDLE 0x00
  107. #define CC2500_STATE_RX 0x10
  108. #define CC2500_STATE_TX 0x20
  109. #define CC2500_STATE_FSTXON 0x30
  110. #define CC2500_STATE_CALIBRATE 0x40
  111. #define CC2500_STATE_SETTLING 0x50
  112. #define CC2500_STATE_RX_OVERFLOW 0x60
  113. #define CC2500_STATE_TX_UNDERFLOW 0x70
  114. //----------------------------------------------------------------------------------
  115. // Other register bit fields
  116. //----------------------------------------------------------------------------------
  117. #define CC2500_LQI_CRC_OK_BM 0x80
  118. #define CC2500_LQI_EST_BM 0x7F
  119. void cc2500ReadRegisterMulti(uint8_t address, uint8_t data[], uint8_t length);
  120. void cc2500WriteRegisterMulti(uint8_t address, const uint8_t data[], uint8_t length);
  121. uint8_t cc2500ReadReg(uint8_t address);
  122. void cc2500WriteReg(uint8_t address, uint8_t data);
  123. void cc2500Strobe(uint8_t address);
  124. void cc2500ResetChip(void);
  125. inline void cc2500ReadFifo(uint8_t *dpbuffer, int len) {
  126. cc2500ReadRegisterMulti(CC2500_3F_RXFIFO | CC2500_READ_BURST, dpbuffer, len);
  127. }
  128. inline void cc2500WriteFifo(uint8_t *dpbuffer, uint8_t len) {
  129. cc2500Strobe(CC2500_SFTX); // 0x3B
  130. cc2500WriteRegisterMulti(CC2500_3F_TXFIFO, dpbuffer, len);
  131. cc2500Strobe(CC2500_STX); // 0x35
  132. }
  133. #endif