main.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. /*
  2. * Project: Arrow
  3. * Author: curiousmuch
  4. */
  5. #include <stdio.h>
  6. #include "freertos/FreeRTOS.h"
  7. #include "freertos/task.h"
  8. #include "driver/gpio.h"
  9. #include "sdkconfig.h"
  10. // Includes for CC1120 Driver
  11. #include "driver/spi_master.h"
  12. #include "esp_err.h"
  13. #include "cc1120.h"
  14. #include "cc1120_protocol.h"
  15. // CC1120 - ESP32 I/O
  16. // NOTE: Logic Probe is connecting to RESET - Pin1
  17. #define CC1120_RESET 22
  18. #define CC1120_CS 5
  19. #define CC1120_SCLK 18
  20. #define CC1120_MOSI 23
  21. #define CC1120_MISO 19
  22. #define CC1120_GPIO0 36
  23. #define CC1120_GPIO0_RTC 0
  24. #define CC1120_GPIO2 39
  25. #define CC1120_GPIO2_RTC 3
  26. #define CC1120_GPIO3 34
  27. #define CC1120_GPIO3_RTC 4
  28. #define CC1120_WRITE_BIT 0
  29. #define CC1120_READ_BIT BIT(1)
  30. #define CC1120_BURST_BIT BIT(0)
  31. // Public Configurations for CC1120 SPI Driver
  32. spi_bus_config_t bus_config =
  33. {
  34. .miso_io_num = CC1120_MISO,
  35. .mosi_io_num = CC1120_MOSI,
  36. .sclk_io_num = CC1120_SCLK,
  37. .quadwp_io_num = -1,
  38. .quadhd_io_num = -1,
  39. .max_transfer_sz = 150
  40. };
  41. spi_device_interface_config_t interface_config =
  42. {
  43. .command_bits = 2,
  44. .address_bits = 6,
  45. .dummy_bits = 0,
  46. .mode = 0,
  47. .spics_io_num = CC1120_CS,
  48. .clock_speed_hz = (APB_CLK_FREQ/20),
  49. .flags = 0,
  50. .queue_size = 1
  51. };
  52. spi_device_handle_t spi;
  53. // Private CC1120 Driver Functions
  54. void cc1120_gpio_init(void)
  55. {
  56. gpio_config_t reset_pin_config =
  57. {
  58. .pin_bit_mask = (uint64_t)BIT64(CC1120_RESET),
  59. .mode = GPIO_MODE_OUTPUT,
  60. .pull_up_en = GPIO_PULLUP_DISABLE,
  61. .pull_down_en = GPIO_PULLDOWN_DISABLE,
  62. .intr_type = GPIO_INTR_DISABLE
  63. };
  64. gpio_config_t gpio_pin_config =
  65. {
  66. .pin_bit_mask = (uint64_t) (BIT64(CC1120_GPIO0)|BIT64(CC1120_GPIO2)|BIT64(CC1120_GPIO3)),
  67. .mode = GPIO_MODE_INPUT,
  68. .pull_up_en = GPIO_PULLUP_DISABLE,
  69. .pull_down_en = GPIO_PULLDOWN_DISABLE,
  70. .intr_type = GPIO_INTR_DISABLE
  71. };
  72. gpio_config(&reset_pin_config);
  73. gpio_config(&gpio_pin_config);
  74. gpio_set_level(CC1120_RESET, 1);
  75. }
  76. void cc1120_spi_init(void)
  77. {
  78. esp_err_t ret;
  79. ret = spi_bus_initialize(VSPI_HOST, &bus_config, 1); // this uses DMA channel 1
  80. ESP_ERROR_CHECK(ret);
  81. ret = spi_bus_add_device(VSPI_HOST, &interface_config, &spi);
  82. ESP_ERROR_CHECK(ret);
  83. }
  84. void cc1120_spi_write_byte(uint16_t addr, uint8_t data)
  85. {
  86. esp_err_t ret;
  87. spi_transaction_t tx_trans =
  88. {
  89. .flags = SPI_TRANS_USE_TXDATA,
  90. .cmd = CC1120_WRITE_BIT,
  91. .addr = addr,
  92. .length = 8,
  93. .rxlength = 0,
  94. .tx_data[0] = data
  95. };
  96. if ((addr & 0xFF00) != 0) // send data with extended address in command field
  97. {
  98. tx_trans.flags |= (SPI_TRANS_VARIABLE_CMD | SPI_TRANS_VARIABLE_ADDR);
  99. spi_transaction_ext_t tx_trans_ext =
  100. {
  101. .base = tx_trans,
  102. .command_bits = 2,
  103. .address_bits = 14
  104. };
  105. ret = spi_device_transmit(spi, (spi_transaction_t*)&tx_trans_ext);
  106. }
  107. else
  108. {
  109. ret = spi_device_transmit(spi, &tx_trans);
  110. }
  111. ESP_ERROR_CHECK(ret);
  112. }
  113. void cc1120_spi_write_bytes(uint16_t addr, uint8_t* data, uint8_t len)
  114. {
  115. esp_err_t ret;
  116. spi_transaction_t tx_trans =
  117. {
  118. .cmd = (CC1120_WRITE_BIT | CC1120_BURST_BIT),
  119. .addr = addr,
  120. .length = 8*len,
  121. .tx_buffer = data
  122. };
  123. if ((addr & 0xFF00) != 0) // send data with extended address in command field
  124. {
  125. tx_trans.flags |= (SPI_TRANS_VARIABLE_CMD | SPI_TRANS_VARIABLE_ADDR);
  126. spi_transaction_ext_t tx_trans_ext =
  127. {
  128. .base = tx_trans,
  129. .command_bits = 2,
  130. .address_bits = 14
  131. };
  132. ret = spi_device_transmit(spi, (spi_transaction_t*)&tx_trans_ext);
  133. }
  134. else
  135. {
  136. ret = spi_device_transmit(spi, &tx_trans);
  137. }
  138. ESP_ERROR_CHECK(ret);
  139. }
  140. void cc1120_spi_read_byte(uint16_t addr, uint8_t* data)
  141. {
  142. esp_err_t ret;
  143. spi_transaction_t rx_trans =
  144. {
  145. .cmd = CC1120_READ_BIT,
  146. .addr = addr,
  147. .length = 8,
  148. .rxlength = 8,
  149. .rx_buffer = data
  150. };
  151. if ((addr & 0xFF00) != 0) // read data with extended address in command field
  152. {
  153. rx_trans.flags |= (SPI_TRANS_VARIABLE_CMD | SPI_TRANS_VARIABLE_ADDR);
  154. spi_transaction_ext_t rx_trans_ext =
  155. {
  156. .base = rx_trans,
  157. .command_bits = 2,
  158. .address_bits = 14
  159. };
  160. ret = spi_device_transmit(spi, (spi_transaction_t*)&rx_trans_ext);
  161. }
  162. else
  163. {
  164. ret = spi_device_transmit(spi, &rx_trans);
  165. }
  166. ESP_ERROR_CHECK(ret);
  167. }
  168. void cc1120_spi_read_bytes(uint16_t addr, uint8_t* data, uint8_t len)
  169. {
  170. esp_err_t ret;
  171. spi_transaction_t rx_trans =
  172. {
  173. .cmd = (CC1120_READ_BIT | CC1120_BURST_BIT),
  174. .addr = addr,
  175. .length = 8*len,
  176. .rxlength = 8*len,
  177. .rx_buffer = data
  178. };
  179. if ((addr & 0xFF00) != 0) // read data with extended address in command field
  180. {
  181. rx_trans.flags |= (SPI_TRANS_VARIABLE_CMD | SPI_TRANS_VARIABLE_ADDR);
  182. spi_transaction_ext_t rx_trans_ext =
  183. {
  184. .base = rx_trans,
  185. .command_bits = 2,
  186. .address_bits = 14
  187. };
  188. ret = spi_device_transmit(spi, (spi_transaction_t*)&rx_trans_ext);
  189. }
  190. else
  191. {
  192. ret = spi_device_transmit(spi, &rx_trans);
  193. }
  194. ESP_ERROR_CHECK(ret);
  195. }
  196. rf_status_t cc1120_spi_strobe(uint8_t cmd)
  197. {
  198. esp_err_t ret;
  199. uint8_t temp=0;
  200. spi_transaction_t rx_trans =
  201. {
  202. .flags = (SPI_TRANS_USE_TXDATA | SPI_TRANS_VARIABLE_CMD | SPI_TRANS_VARIABLE_ADDR),
  203. .length = 8,
  204. .rxlength = 8,
  205. .rx_buffer = &temp,
  206. .tx_data[0] = cmd
  207. };
  208. spi_transaction_ext_t rx_trans_ext =
  209. {
  210. .base = rx_trans,
  211. .command_bits = 0,
  212. .address_bits = 0
  213. };
  214. ret = spi_device_transmit(spi, (spi_transaction_t*)&rx_trans_ext);
  215. ESP_ERROR_CHECK(ret);
  216. return (temp & 0xF0);
  217. }
  218. // Public CC1120 Driver Functions
  219. // These function should have there own error codes as they're dependent upon the radio and
  220. // not the ESP32 :)
  221. esp_err_t cc1120_radio_reset(void)
  222. {
  223. return ESP_OK;
  224. }
  225. esp_err_t cc1120_radio_frequency(uint32_t freq)
  226. {
  227. return ESP_OK;
  228. }
  229. esp_err_t cc1120_radio_sleep(void)
  230. {
  231. return ESP_OK;
  232. }
  233. esp_err_t cc1120_radio_power(uint8_t txPower)
  234. {
  235. return ESP_OK;
  236. }
  237. esp_err_t cc1120_radio_init(void)
  238. {
  239. cc1120_gpio_init();
  240. cc1120_spi_init();
  241. return ESP_OK;
  242. }
  243. void app_main()
  244. {
  245. cc1120_radio_init();
  246. uint8_t len, i;
  247. len = sizeof(CW_SETTINGS) / sizeof(cc1120_reg_settings_t);
  248. cc1120_spi_strobe(CC112X_SRES);
  249. vTaskDelay(500/portTICK_PERIOD_MS);
  250. //cc1120_spi_strobe(CC112X_SFSTXON);
  251. vTaskDelay(500/portTICK_PERIOD_MS);
  252. for (i=0;i<len;i++)
  253. {
  254. cc1120_spi_write_byte(CW_SETTINGS[i].addr, CW_SETTINGS[i].data);
  255. }
  256. vTaskDelay(500/portTICK_PERIOD_MS);
  257. cc1120_spi_strobe(CC112X_STX);
  258. while(1)
  259. {
  260. vTaskDelay(10/portTICK_PERIOD_MS);
  261. printf("Status: %x\n", cc1120_spi_strobe(CC112X_STX));
  262. printf("Status: %x\n", cc1120_spi_strobe(CC112X_SNOP));
  263. }
  264. }