RF24_regs.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. /*
  2. 25.10.2020 ad0x0
  3. */
  4. #include "RF24.h"
  5. //#include "../ad0x0_spi2.h"
  6. #include "../usart/ad0x0_usart.h"
  7. #include "../spi/ad0x0_spi_ext.h"
  8. #include <string.h>
  9. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  10. //хз, если я хочу записывать пачкой, то после чтения надо делать memcpy кроме 1го байта
  11. //volatile ad0x0_nrf24_spi_regs_t r_spi_regs;
  12. //volatile ad0x0_nrf24_regs_t r_regs;
  13. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  14. #define AD0X0_RF24_REG_POST_READ
  15. //void ce(uint8_t level){ HAL_GPIO_WritePin(AD_NFR24_CE_GPIO_Port, AD_NFR24_CE_Pin, (level ? GPIO_PIN_SET : GPIO_PIN_RESET)); }
  16. enum{
  17. xNRF24_READALL,
  18. xNRF24_READALL_LOOP,
  19. xNRF24_CE_HIGH,
  20. xNRF24_CE_LOW
  21. }ad0x0_regs_cb_t;
  22. void cb_rf24_set_ce(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
  23. ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
  24. HAL_GPIO_WritePin(p_ext->user_pointer1, p_ext->user_data0, _sf_id ? GPIO_PIN_SET : GPIO_PIN_RESET);
  25. }
  26. void rf24_set_ce(rf24_spi_regs_t *p, uint8_t _isHigh){
  27. uint8_t h_ext;
  28. ad0x0_spi_ext_t *p_spi_ext_t=NULL;
  29. p->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
  30. p_spi_ext_t->sf_id=_isHigh;
  31. p_spi_ext_t->user_data0 = p->CE_Pin;
  32. p_spi_ext_t->user_pointer1 = p->CE_GPIO_Port;
  33. p_spi_ext_t->_p_post_cb_func = cb_rf24_set_ce;
  34. p->ad0x0_spi_push(ADQS_USE_EXT,h_ext);
  35. }
  36. //init_spi_reg без s... s как доллар, как 1с.. как ass.. так ладно
  37. void init_spi_reg(rf24_spi_regs_t *p,p_rf24_spi_REG_t preg,uint8_t _radr){
  38. preg->pspi=p;
  39. preg->radr=_radr;
  40. preg->so=1;
  41. }
  42. void init_spi_reg5(rf24_spi_regs_t *p,p_rf24_spi_REG5_t preg,uint8_t _radr){
  43. preg->pspi=p;
  44. preg->radr=_radr;
  45. preg->so=5;
  46. }
  47. void init_spi_regs(rf24_spi_regs_t *p){
  48. memset((void*)p,0,sizeof(rf24_spi_regs_t));
  49. init_spi_reg(p, &p->_CONFIG,0x0);
  50. init_spi_reg(p, &p->_EN_AA,0x1);
  51. init_spi_reg(p, &p->_EN_RXADDR, 0x2);
  52. init_spi_reg(p, &p->_SETUP_AW, 0x3);
  53. init_spi_reg(p, &p->_SETUP_RETR, 0x4);
  54. init_spi_reg(p, &p->_RF_CH, 0x5);
  55. init_spi_reg(p, &p->_RF_SETUP, 0x6);
  56. init_spi_reg(p, &p->_STATUS, 0x7);
  57. init_spi_reg(p, &p->_OBSERVE_TX, 0x8);
  58. init_spi_reg(p, &p->_RPD, 0x9);
  59. init_spi_reg5(p, &p->_RX_ADDR_P0,0xA);
  60. init_spi_reg5(p, &p->_RX_ADDR_P1,0xB);
  61. init_spi_reg(p, &p->_RX_ADDR_P2, 0xC);
  62. init_spi_reg(p, &p->_RX_ADDR_P3, 0xD);
  63. init_spi_reg(p, &p->_RX_ADDR_P4, 0xE);
  64. init_spi_reg(p, &p->_RX_ADDR_P5, 0xF);
  65. init_spi_reg5(p, &p->_TX_ADDR, 0x10);
  66. init_spi_reg(p, &p->_RX_PW_P0, 0x11);
  67. init_spi_reg(p, &p->_RX_PW_P1, 0x12);
  68. init_spi_reg(p, &p->_RX_PW_P2, 0x13);
  69. init_spi_reg(p, &p->_RX_PW_P3, 0x14);
  70. init_spi_reg(p, &p->_RX_PW_P4, 0x15);
  71. init_spi_reg(p, &p->_RX_PW_P5, 0x16);
  72. init_spi_reg(p, &p->_FIFO_STATUS, 0x17);
  73. init_spi_reg(p, &p->_DYNPD, 0x1C);
  74. init_spi_reg(p, &p->_FEATURE, 0x1D);
  75. init_spi_reg(p, &p->_R_RX_PL_WID, R_RX_PL_WID);
  76. }
  77. void rf24_init_spi_regs(rf24_spi_regs_t *p){
  78. init_spi_regs(p);
  79. }
  80. void cb_read_all_regs(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
  81. ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
  82. read_all_regs_postprocess(p_ext->user_pointer0,p_ext->user_pointer1);
  83. }
  84. void read_all_regs(rf24_spi_regs_t *p_spi_regs, rf24_regs_t *pregs){
  85. read_register(&p_spi_regs->_CONFIG);
  86. read_register(&p_spi_regs->_EN_AA);
  87. read_register(&p_spi_regs->_EN_RXADDR);
  88. read_register(&p_spi_regs->_FIFO_STATUS);
  89. read_register(&p_spi_regs->_OBSERVE_TX);
  90. read_register(&p_spi_regs->_RF_CH);
  91. read_register(&p_spi_regs->_RF_SETUP);
  92. read_register(&p_spi_regs->_RPD);
  93. read_register5(&p_spi_regs->_RX_ADDR_P0);
  94. read_register5(&p_spi_regs->_RX_ADDR_P1);
  95. read_register(&p_spi_regs->_RX_ADDR_P2);
  96. read_register(&p_spi_regs->_RX_ADDR_P3);
  97. read_register(&p_spi_regs->_RX_ADDR_P4);
  98. read_register(&p_spi_regs->_RX_ADDR_P5);
  99. read_register(&p_spi_regs->_RX_PW_P0);
  100. read_register(&p_spi_regs->_RX_PW_P1);
  101. read_register(&p_spi_regs->_RX_PW_P2);
  102. read_register(&p_spi_regs->_RX_PW_P3);
  103. read_register(&p_spi_regs->_RX_PW_P4);
  104. read_register(&p_spi_regs->_RX_PW_P5);
  105. read_register(&p_spi_regs->_SETUP_AW);
  106. read_register(&p_spi_regs->_SETUP_RETR);
  107. read_register(&p_spi_regs->_STATUS);
  108. read_register5(&p_spi_regs->_TX_ADDR);
  109. read_register(&p_spi_regs->_DYNPD);
  110. read_register(&p_spi_regs->_FEATURE);
  111. read_register(&p_spi_regs->_R_RX_PL_WID);
  112. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  113. /*а вот ща очень внимательно!!!!!! вот как делать не рекомендуется*/
  114. uint8_t h_ext;
  115. ad0x0_spi_ext_t *p_spi_ext_t=NULL;
  116. p_spi_regs->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
  117. p_spi_ext_t->_p_post_cb_func = cb_read_all_regs;
  118. p_spi_ext_t->user_pointer0=p_spi_regs;
  119. p_spi_ext_t->user_pointer1=pregs;
  120. p_spi_regs->ad0x0_spi_push(ADQS_USE_EXT,h_ext);
  121. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  122. //ad0x0_spi2_push_ext_setfunc(xNRF24_READALL,ad0x0_regs_cb);
  123. }
  124. void read_all_regs_postprocess(rf24_spi_regs_t *p_spi_regs,rf24_regs_t *pregs){
  125. //не надо срать кирпичами про фор и как круто в одном цикле все перенести,
  126. //мож так длиннее, зато так все понятно -//
  127. pregs->_CONFIG = p_spi_regs->_CONFIG.value;
  128. pregs->_EN_AA = p_spi_regs->_EN_AA.value;
  129. pregs->_EN_RXADDR = p_spi_regs->_EN_RXADDR.value;
  130. pregs->_FIFO_STATUS = p_spi_regs->_FIFO_STATUS.value;
  131. pregs->_OBSERVE_TX = p_spi_regs->_OBSERVE_TX.value;
  132. pregs->_RF_CH = p_spi_regs->_RF_CH.value;
  133. pregs->_RF_SETUP = p_spi_regs->_RF_SETUP.value;
  134. pregs->_RPD = p_spi_regs->_RPD.value;
  135. memcpy((void*) pregs->_RX_ADDR_P0, (void*)p_spi_regs->_RX_ADDR_P0.value, 5);
  136. memcpy((void*) pregs->_RX_ADDR_P1, (void*)p_spi_regs->_RX_ADDR_P1.value, 5);
  137. pregs->_RX_ADDR_P2 = p_spi_regs->_RX_ADDR_P2.value;
  138. pregs->_RX_ADDR_P3 = p_spi_regs->_RX_ADDR_P3.value;
  139. pregs->_RX_ADDR_P4 = p_spi_regs->_RX_ADDR_P4.value;
  140. pregs->_RX_ADDR_P5 = p_spi_regs->_RX_ADDR_P5.value;
  141. pregs->_RX_PW_P0 = p_spi_regs->_RX_PW_P0.value;
  142. pregs->_RX_PW_P1 = p_spi_regs->_RX_PW_P1.value;
  143. pregs->_RX_PW_P2 = p_spi_regs->_RX_PW_P2.value;
  144. pregs->_RX_PW_P3 = p_spi_regs->_RX_PW_P3.value;
  145. pregs->_RX_PW_P4 = p_spi_regs->_RX_PW_P4.value;
  146. pregs->_RX_PW_P5 = p_spi_regs->_RX_PW_P5.value;
  147. pregs->_SETUP_AW = p_spi_regs->_SETUP_AW.value;
  148. pregs->_SETUP_RETR = p_spi_regs->_SETUP_RETR.value;
  149. pregs->_STATUS = p_spi_regs->_STATUS.value;
  150. memcpy((void*) pregs->_TX_ADDR, (void*)p_spi_regs->_TX_ADDR.value, 5);
  151. pregs->_DYNPD = p_spi_regs->_DYNPD.value;
  152. pregs->_FEATURE= p_spi_regs->_FEATURE.value;
  153. }
  154. void spi_cmd(rf24_spi_regs_t *p, uint8_t _val)
  155. {
  156. uint8_t h_ext;
  157. ad0x0_spi_ext_t *p_spi_ext_t=NULL;
  158. p->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
  159. p_spi_ext_t->user_data0=_val;
  160. p_spi_ext_t->pbuf_count=1;
  161. p_spi_ext_t->pbuf_rx=p_spi_ext_t->pbuf_tx=(uint8_t*)&p_spi_ext_t->user_data0;
  162. p_spi_ext_t->p_pre_SetTXRXBuf=EXT_SetTXRXBuf;
  163. p->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
  164. }
  165. void cb_read_register(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
  166. ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
  167. rf24_spi_REG_t *preg=(rf24_spi_REG_t*)(((ad0x0_spi_ext_t*)p_spi_ext_t)->user_pointer1);
  168. preg->value = (uint8_t)(p_ext->user_data0>>8);
  169. }
  170. void read_register(rf24_spi_REG_t *preg_radr)
  171. {
  172. uint8_t h_ext;
  173. if(preg_radr->so!=1)ad0x0_err();
  174. ad0x0_spi_ext_t *p_spi_ext_t=NULL;
  175. preg_radr->pspi->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
  176. p_spi_ext_t->user_data0=preg_radr->radr | (uint32_t)0xFF<<8;
  177. p_spi_ext_t->user_pointer1=preg_radr;
  178. p_spi_ext_t->_p_post_cb_func = cb_read_register;
  179. p_spi_ext_t->pbuf_count=preg_radr->so+1;
  180. p_spi_ext_t->pbuf_rx=p_spi_ext_t->pbuf_tx=(uint8_t*)&p_spi_ext_t->user_data0;
  181. p_spi_ext_t->p_pre_SetTXRXBuf=EXT_SetTXRXBuf;
  182. preg_radr->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
  183. /*preg_radr->wr = preg_radr->radr | 0x0;//ПРОВЕРИТЬ!!!!!!!!
  184. preg_radr->value=0xFF;
  185. ad0x0_spi2_push_txrx_dma_ext(&preg_radr->wr,&preg_radr->wr,1+preg_radr->so);*/
  186. }
  187. void cb_read_register5(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
  188. ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
  189. rf24_spi_REG5_t *preg5=(rf24_spi_REG5_t*)(((ad0x0_spi_ext_t*)p_spi_ext_t)->user_pointer1);
  190. //preg->value = (uint8_t)(p_ext->user_data0>>8);
  191. memcpy(preg5->value,((uint8_t*)(&p_ext->user_data0))+1,preg5->so);
  192. }
  193. void read_register5(rf24_spi_REG5_t *preg_radr)
  194. {
  195. uint8_t h_ext;
  196. if(preg_radr->so!=5)ad0x0_err();
  197. ad0x0_spi_ext_t *p_spi_ext_t=NULL;
  198. preg_radr->pspi->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
  199. //да я знаю, что через Ж... но мы 3 байта адреса читаем в дата0,и два в дата1
  200. p_spi_ext_t->user_data0=preg_radr->radr;// | (uint32_t)0xFF<<8;
  201. p_spi_ext_t->user_pointer1=preg_radr;
  202. p_spi_ext_t->_p_post_cb_func = cb_read_register5;
  203. p_spi_ext_t->pbuf_count=preg_radr->so+1;
  204. p_spi_ext_t->pbuf_rx=p_spi_ext_t->pbuf_tx=(uint8_t*)&p_spi_ext_t->user_data0;
  205. p_spi_ext_t->p_pre_SetTXRXBuf=EXT_SetTXRXBuf;
  206. preg_radr->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
  207. }
  208. void cb_write_register2(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t);
  209. void cb_write_register(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
  210. ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
  211. rf24_spi_REG_t *preg=(rf24_spi_REG_t*)(p_ext->user_pointer1);
  212. preg->value = _sf_id;
  213. #ifdef AD0X0_RF24_REG_POST_READ
  214. p_ext->reference_count++;
  215. p_ext->user_data0=preg->radr;
  216. p_ext->user_pointer1=preg;
  217. p_ext->_p_post_cb_func = cb_write_register2;
  218. #endif
  219. }
  220. #ifdef AD0X0_RF24_REG_POST_READ
  221. void cb_write_register2(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
  222. ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
  223. rf24_spi_REG_t *preg=(rf24_spi_REG_t*)(p_ext->user_pointer1);
  224. preg->value = (uint8_t)(p_ext->user_data0>>8);
  225. //чтобы сбросить бит, например TX_DS, надо записать в него 1.
  226. //по этому то что мы пишим будет иногда разнИца с тем, что читаем
  227. //здесь пока что перечитываем чисто в отладочных целях
  228. if(preg->value!=_sf_id){
  229. // ad0x0_err();
  230. }
  231. }
  232. #endif
  233. void write_register(rf24_spi_REG_t *preg_radr, uint8_t _val)
  234. {
  235. //*пишим, затем читаем и сравниваем записанное с прочитанным*/
  236. uint8_t h_ext;
  237. if(preg_radr->so!=1)ad0x0_err();
  238. ad0x0_spi_ext_t *p_spi_ext_t=NULL;
  239. preg_radr->pspi->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
  240. p_spi_ext_t->sf_id=_val;
  241. p_spi_ext_t->user_data0=(preg_radr->radr | 0x20) | (uint32_t)_val<<8;
  242. p_spi_ext_t->user_pointer1=preg_radr;
  243. p_spi_ext_t->_p_post_cb_func = cb_write_register;
  244. p_spi_ext_t->pbuf_count=preg_radr->so+1;
  245. p_spi_ext_t->pbuf_rx=p_spi_ext_t->pbuf_tx=(uint8_t*)&p_spi_ext_t->user_data0;
  246. p_spi_ext_t->p_pre_SetTXRXBuf=EXT_SetTXRXBuf;
  247. preg_radr->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
  248. /*я не просто так делал проверку записанного... отловились неочевидные ошибки*/
  249. #ifdef AD0X0_RF24_REG_POST_READ
  250. preg_radr->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
  251. #endif
  252. }
  253. //!5555555555555555555555555555555555555555555555
  254. void cb_write_register5_2(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t);
  255. void cb_write_register5(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
  256. ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
  257. rf24_spi_REG5_t *preg5=(rf24_spi_REG5_t*)(p_ext->user_pointer1);
  258. // memcpy(preg5->value,((uint8_t*)(&p_ext->user_data0))+1,preg5->so);
  259. #ifdef AD0X0_RF24_REG_POST_READ
  260. p_ext->reference_count++;
  261. p_ext->user_data0=preg5->radr;
  262. p_ext->user_pointer1=preg5;
  263. p_ext->_p_post_cb_func = cb_write_register5_2;
  264. #endif
  265. }
  266. #ifdef AD0X0_RF24_REG_POST_READ
  267. void cb_write_register5_2(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
  268. ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
  269. rf24_spi_REG5_t *preg5=(rf24_spi_REG5_t*)(p_ext->user_pointer1);
  270. //preg->value = (uint8_t)(p_ext->user_data0>>8);
  271. memcpy(preg5->value,((uint8_t*)(&p_ext->user_data0))+1,preg5->so);
  272. }
  273. #endif
  274. void write_register5(rf24_spi_REG5_t *preg_radr5, uint8_t *_buf5)
  275. {
  276. //*пишим, затем читаем и сравниваем записанное с прочитанным*/
  277. uint8_t h_ext;
  278. if(preg_radr5->so!=5)ad0x0_err();
  279. ad0x0_spi_ext_t *p_spi_ext_t=NULL;
  280. preg_radr5->pspi->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
  281. //p_spi_ext_t->sf_id=_val;
  282. p_spi_ext_t->user_data0=preg_radr5->radr | 0x20;
  283. //сохраняем значение буфера, наглейшим образом затирая часть p_spi_ext_t->user_data1
  284. memcpy(((uint8_t*)(&p_spi_ext_t->user_data0))+1,_buf5,preg_radr5->so);
  285. p_spi_ext_t->user_pointer1=preg_radr5;
  286. p_spi_ext_t->_p_post_cb_func = cb_write_register5;
  287. p_spi_ext_t->pbuf_count=preg_radr5->so+1;
  288. p_spi_ext_t->pbuf_rx=p_spi_ext_t->pbuf_tx=(uint8_t*)&p_spi_ext_t->user_data0;
  289. p_spi_ext_t->p_pre_SetTXRXBuf=EXT_SetTXRXBuf;
  290. preg_radr5->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
  291. /*я не просто так делал проверку записанного... отловились неочевидные ошибки*/
  292. #ifdef AD0X0_RF24_REG_POST_READ
  293. preg_radr5->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
  294. #endif
  295. }
  296. void cb_write_register_bit(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t);
  297. void cb_write_register_bit2(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t);
  298. #ifdef AD0X0_RF24_REG_POST_READ
  299. void cb_write_register_bit3(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t);
  300. #endif
  301. void cb_write_register_bit(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
  302. ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
  303. //ad0x0_spi_ext_t *p_ext1=ad0x0_spi_ext_get_pdesc(_sf_id);
  304. rf24_spi_REG_t *preg=(rf24_spi_REG_t*)(p_ext->user_pointer1);
  305. preg->value = (uint8_t)(p_ext->user_data0>>8);//прочитанный байт
  306. preg->value &= (uint8_t)(p_ext->user_data0>>24);//_and_mask
  307. preg->value |= (uint8_t)(p_ext->user_data0>>16);//_or_bits
  308. //модифицируем ячейку под следующую команду
  309. //preg->radr нужен новый, т.к. старый затерт записью сраного STATUS-регистра
  310. p_ext->user_data0 = (uint32_t)preg->value<<8 | (preg->radr | 0x20);
  311. p_ext->reference_count++;
  312. p_ext->_p_post_cb_func = cb_write_register_bit2;//тока теперь другой колбэк
  313. }
  314. void cb_write_register_bit2(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
  315. ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
  316. rf24_spi_REG_t *preg=(rf24_spi_REG_t*)(p_ext->user_pointer1);
  317. #ifdef AD0X0_RF24_REG_POST_READ
  318. //регистр записан, модифицируем под чтение с проверкой
  319. p_ext->reference_count++;//продлить жизнь на 1 цикл
  320. p_ext->_p_post_cb_func = cb_write_register_bit3;//тока теперь другой колбэк
  321. //p_ext->user_data0 &=0xFFFFFF00;//пихаем значения для операции чтения
  322. p_ext->user_data0 = preg->radr;
  323. #endif
  324. }
  325. #ifdef AD0X0_RF24_REG_POST_READ
  326. void cb_write_register_bit3(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
  327. ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
  328. rf24_spi_REG_t *preg=(rf24_spi_REG_t*)(p_ext->user_pointer1);
  329. //регистр прочитан
  330. preg->value = (uint8_t)(p_ext->user_data0>>8);
  331. //p_ext->reference_count++; все! жизнь не продляем, ее завалит построцесс
  332. //if(preg->value_r != (uint8_t)(p_ext->user_data0>>8)){ ad0x0_err(); }
  333. }
  334. #endif
  335. void write_register_bits(rf24_spi_REG_t *preg_radr, uint8_t _or_bits, uint8_t _and_mask)
  336. {
  337. if(preg_radr->so!=1)ad0x0_err();
  338. //что б понять, что тут ха херня, я пишу комменты для себя
  339. uint8_t h_ext;
  340. ad0x0_spi_ext_t *p_spi_ext_t=NULL;
  341. preg_radr->pspi->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
  342. //дальше полный изврат
  343. //читаем значение регистра и модифицируем, используя 1ю ячейку
  344. //p_spi_ext_t->sf_id=h_ext1;//ячейка для слудующей команды SPI, сюда положим модифицировнное значение регистра
  345. p_spi_ext_t->user_data0=preg_radr->radr | (uint32_t)0xFF00 | (uint32_t)_or_bits<<16 | (uint32_t)_and_mask<<24;
  346. p_spi_ext_t->user_pointer1=preg_radr;
  347. p_spi_ext_t->_p_post_cb_func = cb_write_register_bit;
  348. p_spi_ext_t->pbuf_count=preg_radr->so+1;
  349. p_spi_ext_t->pbuf_rx=p_spi_ext_t->pbuf_tx=(uint8_t*)&p_spi_ext_t->user_data0;
  350. p_spi_ext_t->p_pre_SetTXRXBuf=EXT_SetTXRXBuf;
  351. preg_radr->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
  352. /*если сейчас, поставить точку останова и прийти сюда,
  353. то preg_radr->value еще не будет нашим прочитанным из
  354. предыдущего пуша, т.к. он еще не выполнился
  355. То что нам нужно - это значение по адресу &preg_radr->value
  356. По этому мы вроде должны оперировать адресами, а не значениями
  357. Однако, в коллбэках у нас будут значения, по этому путем подмены
  358. указателей на коллбэки мы одной межкомандной-проститучной ячейкой
  359. выполним чтение-модификацию-запись-проверку
  360. 31.10.2020 - нахер проверку
  361. */
  362. preg_radr->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
  363. #ifdef AD0X0_RF24_REG_POST_READ
  364. preg_radr->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
  365. #endif
  366. }