123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427 |
- /*
- 25.10.2020 ad0x0
- */
- #include "RF24.h"
- //#include "../ad0x0_spi2.h"
- #include "../usart/ad0x0_usart.h"
- #include "../spi/ad0x0_spi_ext.h"
- #include <string.h>
- //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- //хз, если я хочу записывать пачкой, то после чтения надо делать memcpy кроме 1го байта
- //volatile ad0x0_nrf24_spi_regs_t r_spi_regs;
- //volatile ad0x0_nrf24_regs_t r_regs;
- //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- #define AD0X0_RF24_REG_POST_READ
- //void ce(uint8_t level){ HAL_GPIO_WritePin(AD_NFR24_CE_GPIO_Port, AD_NFR24_CE_Pin, (level ? GPIO_PIN_SET : GPIO_PIN_RESET)); }
- enum{
- xNRF24_READALL,
- xNRF24_READALL_LOOP,
- xNRF24_CE_HIGH,
- xNRF24_CE_LOW
- }ad0x0_regs_cb_t;
- void cb_rf24_set_ce(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
- ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
- HAL_GPIO_WritePin(p_ext->user_pointer1, p_ext->user_data0, _sf_id ? GPIO_PIN_SET : GPIO_PIN_RESET);
- }
- void rf24_set_ce(rf24_spi_regs_t *p, uint8_t _isHigh){
- uint8_t h_ext;
- ad0x0_spi_ext_t *p_spi_ext_t=NULL;
- p->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
- p_spi_ext_t->sf_id=_isHigh;
- p_spi_ext_t->user_data0 = p->CE_Pin;
- p_spi_ext_t->user_pointer1 = p->CE_GPIO_Port;
- p_spi_ext_t->_p_post_cb_func = cb_rf24_set_ce;
-
- p->ad0x0_spi_push(ADQS_USE_EXT,h_ext);
-
- }
- //init_spi_reg без s... s как доллар, как 1с.. как ass.. так ладно
- void init_spi_reg(rf24_spi_regs_t *p,p_rf24_spi_REG_t preg,uint8_t _radr){
- preg->pspi=p;
- preg->radr=_radr;
- preg->so=1;
- }
- void init_spi_reg5(rf24_spi_regs_t *p,p_rf24_spi_REG5_t preg,uint8_t _radr){
- preg->pspi=p;
- preg->radr=_radr;
- preg->so=5;
- }
- void init_spi_regs(rf24_spi_regs_t *p){
- memset((void*)p,0,sizeof(rf24_spi_regs_t));
- init_spi_reg(p, &p->_CONFIG,0x0);
- init_spi_reg(p, &p->_EN_AA,0x1);
- init_spi_reg(p, &p->_EN_RXADDR, 0x2);
- init_spi_reg(p, &p->_SETUP_AW, 0x3);
- init_spi_reg(p, &p->_SETUP_RETR, 0x4);
- init_spi_reg(p, &p->_RF_CH, 0x5);
- init_spi_reg(p, &p->_RF_SETUP, 0x6);
- init_spi_reg(p, &p->_STATUS, 0x7);
- init_spi_reg(p, &p->_OBSERVE_TX, 0x8);
- init_spi_reg(p, &p->_RPD, 0x9);
- init_spi_reg5(p, &p->_RX_ADDR_P0,0xA);
- init_spi_reg5(p, &p->_RX_ADDR_P1,0xB);
- init_spi_reg(p, &p->_RX_ADDR_P2, 0xC);
- init_spi_reg(p, &p->_RX_ADDR_P3, 0xD);
- init_spi_reg(p, &p->_RX_ADDR_P4, 0xE);
- init_spi_reg(p, &p->_RX_ADDR_P5, 0xF);
- init_spi_reg5(p, &p->_TX_ADDR, 0x10);
-
- init_spi_reg(p, &p->_RX_PW_P0, 0x11);
- init_spi_reg(p, &p->_RX_PW_P1, 0x12);
- init_spi_reg(p, &p->_RX_PW_P2, 0x13);
- init_spi_reg(p, &p->_RX_PW_P3, 0x14);
- init_spi_reg(p, &p->_RX_PW_P4, 0x15);
- init_spi_reg(p, &p->_RX_PW_P5, 0x16);
-
- init_spi_reg(p, &p->_FIFO_STATUS, 0x17);
- init_spi_reg(p, &p->_DYNPD, 0x1C);
- init_spi_reg(p, &p->_FEATURE, 0x1D);
-
- init_spi_reg(p, &p->_R_RX_PL_WID, R_RX_PL_WID);
-
-
- }
- void rf24_init_spi_regs(rf24_spi_regs_t *p){
- init_spi_regs(p);
- }
- void cb_read_all_regs(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
- ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
- read_all_regs_postprocess(p_ext->user_pointer0,p_ext->user_pointer1);
- }
- void read_all_regs(rf24_spi_regs_t *p_spi_regs, rf24_regs_t *pregs){
- read_register(&p_spi_regs->_CONFIG);
- read_register(&p_spi_regs->_EN_AA);
- read_register(&p_spi_regs->_EN_RXADDR);
- read_register(&p_spi_regs->_FIFO_STATUS);
- read_register(&p_spi_regs->_OBSERVE_TX);
- read_register(&p_spi_regs->_RF_CH);
- read_register(&p_spi_regs->_RF_SETUP);
- read_register(&p_spi_regs->_RPD);
- read_register5(&p_spi_regs->_RX_ADDR_P0);
- read_register5(&p_spi_regs->_RX_ADDR_P1);
- read_register(&p_spi_regs->_RX_ADDR_P2);
- read_register(&p_spi_regs->_RX_ADDR_P3);
- read_register(&p_spi_regs->_RX_ADDR_P4);
- read_register(&p_spi_regs->_RX_ADDR_P5);
- read_register(&p_spi_regs->_RX_PW_P0);
- read_register(&p_spi_regs->_RX_PW_P1);
- read_register(&p_spi_regs->_RX_PW_P2);
- read_register(&p_spi_regs->_RX_PW_P3);
- read_register(&p_spi_regs->_RX_PW_P4);
- read_register(&p_spi_regs->_RX_PW_P5);
- read_register(&p_spi_regs->_SETUP_AW);
- read_register(&p_spi_regs->_SETUP_RETR);
- read_register(&p_spi_regs->_STATUS);
- read_register5(&p_spi_regs->_TX_ADDR);
- read_register(&p_spi_regs->_DYNPD);
- read_register(&p_spi_regs->_FEATURE);
- read_register(&p_spi_regs->_R_RX_PL_WID);
- //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- /*а вот ща очень внимательно!!!!!! вот как делать не рекомендуется*/
- uint8_t h_ext;
- ad0x0_spi_ext_t *p_spi_ext_t=NULL;
- p_spi_regs->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
- p_spi_ext_t->_p_post_cb_func = cb_read_all_regs;
- p_spi_ext_t->user_pointer0=p_spi_regs;
- p_spi_ext_t->user_pointer1=pregs;
- p_spi_regs->ad0x0_spi_push(ADQS_USE_EXT,h_ext);
- //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- //ad0x0_spi2_push_ext_setfunc(xNRF24_READALL,ad0x0_regs_cb);
- }
- void read_all_regs_postprocess(rf24_spi_regs_t *p_spi_regs,rf24_regs_t *pregs){
- //не надо срать кирпичами про фор и как круто в одном цикле все перенести,
- //мож так длиннее, зато так все понятно -//
- pregs->_CONFIG = p_spi_regs->_CONFIG.value;
- pregs->_EN_AA = p_spi_regs->_EN_AA.value;
- pregs->_EN_RXADDR = p_spi_regs->_EN_RXADDR.value;
- pregs->_FIFO_STATUS = p_spi_regs->_FIFO_STATUS.value;
- pregs->_OBSERVE_TX = p_spi_regs->_OBSERVE_TX.value;
-
- pregs->_RF_CH = p_spi_regs->_RF_CH.value;
- pregs->_RF_SETUP = p_spi_regs->_RF_SETUP.value;
- pregs->_RPD = p_spi_regs->_RPD.value;
- memcpy((void*) pregs->_RX_ADDR_P0, (void*)p_spi_regs->_RX_ADDR_P0.value, 5);
- memcpy((void*) pregs->_RX_ADDR_P1, (void*)p_spi_regs->_RX_ADDR_P1.value, 5);
-
- pregs->_RX_ADDR_P2 = p_spi_regs->_RX_ADDR_P2.value;
- pregs->_RX_ADDR_P3 = p_spi_regs->_RX_ADDR_P3.value;
- pregs->_RX_ADDR_P4 = p_spi_regs->_RX_ADDR_P4.value;
- pregs->_RX_ADDR_P5 = p_spi_regs->_RX_ADDR_P5.value;
- pregs->_RX_PW_P0 = p_spi_regs->_RX_PW_P0.value;
-
- pregs->_RX_PW_P1 = p_spi_regs->_RX_PW_P1.value;
- pregs->_RX_PW_P2 = p_spi_regs->_RX_PW_P2.value;
- pregs->_RX_PW_P3 = p_spi_regs->_RX_PW_P3.value;
- pregs->_RX_PW_P4 = p_spi_regs->_RX_PW_P4.value;
- pregs->_RX_PW_P5 = p_spi_regs->_RX_PW_P5.value;
-
- pregs->_SETUP_AW = p_spi_regs->_SETUP_AW.value;
- pregs->_SETUP_RETR = p_spi_regs->_SETUP_RETR.value;
- pregs->_STATUS = p_spi_regs->_STATUS.value;
- memcpy((void*) pregs->_TX_ADDR, (void*)p_spi_regs->_TX_ADDR.value, 5);
- pregs->_DYNPD = p_spi_regs->_DYNPD.value;
-
- pregs->_FEATURE= p_spi_regs->_FEATURE.value;
- }
- void spi_cmd(rf24_spi_regs_t *p, uint8_t _val)
- {
- uint8_t h_ext;
- ad0x0_spi_ext_t *p_spi_ext_t=NULL;
- p->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
- p_spi_ext_t->user_data0=_val;
- p_spi_ext_t->pbuf_count=1;
- p_spi_ext_t->pbuf_rx=p_spi_ext_t->pbuf_tx=(uint8_t*)&p_spi_ext_t->user_data0;
- p_spi_ext_t->p_pre_SetTXRXBuf=EXT_SetTXRXBuf;
- p->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
- }
- void cb_read_register(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
- ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
- rf24_spi_REG_t *preg=(rf24_spi_REG_t*)(((ad0x0_spi_ext_t*)p_spi_ext_t)->user_pointer1);
- preg->value = (uint8_t)(p_ext->user_data0>>8);
- }
- void read_register(rf24_spi_REG_t *preg_radr)
- {
- uint8_t h_ext;
- if(preg_radr->so!=1)ad0x0_err();
- ad0x0_spi_ext_t *p_spi_ext_t=NULL;
- preg_radr->pspi->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
- p_spi_ext_t->user_data0=preg_radr->radr | (uint32_t)0xFF<<8;
- p_spi_ext_t->user_pointer1=preg_radr;
- p_spi_ext_t->_p_post_cb_func = cb_read_register;
-
- p_spi_ext_t->pbuf_count=preg_radr->so+1;
- p_spi_ext_t->pbuf_rx=p_spi_ext_t->pbuf_tx=(uint8_t*)&p_spi_ext_t->user_data0;
- p_spi_ext_t->p_pre_SetTXRXBuf=EXT_SetTXRXBuf;
- preg_radr->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
-
- /*preg_radr->wr = preg_radr->radr | 0x0;//ПРОВЕРИТЬ!!!!!!!!
- preg_radr->value=0xFF;
- ad0x0_spi2_push_txrx_dma_ext(&preg_radr->wr,&preg_radr->wr,1+preg_radr->so);*/
- }
- void cb_read_register5(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
- ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
- rf24_spi_REG5_t *preg5=(rf24_spi_REG5_t*)(((ad0x0_spi_ext_t*)p_spi_ext_t)->user_pointer1);
- //preg->value = (uint8_t)(p_ext->user_data0>>8);
- memcpy(preg5->value,((uint8_t*)(&p_ext->user_data0))+1,preg5->so);
- }
- void read_register5(rf24_spi_REG5_t *preg_radr)
- {
- uint8_t h_ext;
- if(preg_radr->so!=5)ad0x0_err();
- ad0x0_spi_ext_t *p_spi_ext_t=NULL;
- preg_radr->pspi->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
- //да я знаю, что через Ж... но мы 3 байта адреса читаем в дата0,и два в дата1
- p_spi_ext_t->user_data0=preg_radr->radr;// | (uint32_t)0xFF<<8;
- p_spi_ext_t->user_pointer1=preg_radr;
- p_spi_ext_t->_p_post_cb_func = cb_read_register5;
-
- p_spi_ext_t->pbuf_count=preg_radr->so+1;
- p_spi_ext_t->pbuf_rx=p_spi_ext_t->pbuf_tx=(uint8_t*)&p_spi_ext_t->user_data0;
- p_spi_ext_t->p_pre_SetTXRXBuf=EXT_SetTXRXBuf;
- preg_radr->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
- }
- void cb_write_register2(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t);
- void cb_write_register(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
- ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
- rf24_spi_REG_t *preg=(rf24_spi_REG_t*)(p_ext->user_pointer1);
- preg->value = _sf_id;
- #ifdef AD0X0_RF24_REG_POST_READ
- p_ext->reference_count++;
- p_ext->user_data0=preg->radr;
- p_ext->user_pointer1=preg;
- p_ext->_p_post_cb_func = cb_write_register2;
- #endif
- }
- #ifdef AD0X0_RF24_REG_POST_READ
- void cb_write_register2(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
- ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
- rf24_spi_REG_t *preg=(rf24_spi_REG_t*)(p_ext->user_pointer1);
- preg->value = (uint8_t)(p_ext->user_data0>>8);
-
- //чтобы сбросить бит, например TX_DS, надо записать в него 1.
- //по этому то что мы пишим будет иногда разнИца с тем, что читаем
- //здесь пока что перечитываем чисто в отладочных целях
- if(preg->value!=_sf_id){
- // ad0x0_err();
- }
- }
- #endif
- void write_register(rf24_spi_REG_t *preg_radr, uint8_t _val)
- {
- //*пишим, затем читаем и сравниваем записанное с прочитанным*/
- uint8_t h_ext;
- if(preg_radr->so!=1)ad0x0_err();
- ad0x0_spi_ext_t *p_spi_ext_t=NULL;
- preg_radr->pspi->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
- p_spi_ext_t->sf_id=_val;
- p_spi_ext_t->user_data0=(preg_radr->radr | 0x20) | (uint32_t)_val<<8;
- p_spi_ext_t->user_pointer1=preg_radr;
- p_spi_ext_t->_p_post_cb_func = cb_write_register;
-
- p_spi_ext_t->pbuf_count=preg_radr->so+1;
- p_spi_ext_t->pbuf_rx=p_spi_ext_t->pbuf_tx=(uint8_t*)&p_spi_ext_t->user_data0;
- p_spi_ext_t->p_pre_SetTXRXBuf=EXT_SetTXRXBuf;
- preg_radr->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
- /*я не просто так делал проверку записанного... отловились неочевидные ошибки*/
- #ifdef AD0X0_RF24_REG_POST_READ
- preg_radr->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
- #endif
- }
- //!5555555555555555555555555555555555555555555555
- void cb_write_register5_2(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t);
- void cb_write_register5(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
- ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
- rf24_spi_REG5_t *preg5=(rf24_spi_REG5_t*)(p_ext->user_pointer1);
-
- // memcpy(preg5->value,((uint8_t*)(&p_ext->user_data0))+1,preg5->so);
- #ifdef AD0X0_RF24_REG_POST_READ
- p_ext->reference_count++;
- p_ext->user_data0=preg5->radr;
- p_ext->user_pointer1=preg5;
- p_ext->_p_post_cb_func = cb_write_register5_2;
- #endif
- }
- #ifdef AD0X0_RF24_REG_POST_READ
- void cb_write_register5_2(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
- ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
- rf24_spi_REG5_t *preg5=(rf24_spi_REG5_t*)(p_ext->user_pointer1);
- //preg->value = (uint8_t)(p_ext->user_data0>>8);
- memcpy(preg5->value,((uint8_t*)(&p_ext->user_data0))+1,preg5->so);
- }
- #endif
- void write_register5(rf24_spi_REG5_t *preg_radr5, uint8_t *_buf5)
- {
- //*пишим, затем читаем и сравниваем записанное с прочитанным*/
- uint8_t h_ext;
- if(preg_radr5->so!=5)ad0x0_err();
- ad0x0_spi_ext_t *p_spi_ext_t=NULL;
- preg_radr5->pspi->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
- //p_spi_ext_t->sf_id=_val;
- p_spi_ext_t->user_data0=preg_radr5->radr | 0x20;
- //сохраняем значение буфера, наглейшим образом затирая часть p_spi_ext_t->user_data1
- memcpy(((uint8_t*)(&p_spi_ext_t->user_data0))+1,_buf5,preg_radr5->so);
- p_spi_ext_t->user_pointer1=preg_radr5;
- p_spi_ext_t->_p_post_cb_func = cb_write_register5;
-
- p_spi_ext_t->pbuf_count=preg_radr5->so+1;
- p_spi_ext_t->pbuf_rx=p_spi_ext_t->pbuf_tx=(uint8_t*)&p_spi_ext_t->user_data0;
- p_spi_ext_t->p_pre_SetTXRXBuf=EXT_SetTXRXBuf;
- preg_radr5->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
- /*я не просто так делал проверку записанного... отловились неочевидные ошибки*/
- #ifdef AD0X0_RF24_REG_POST_READ
- preg_radr5->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
- #endif
- }
- void cb_write_register_bit(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t);
- void cb_write_register_bit2(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t);
- #ifdef AD0X0_RF24_REG_POST_READ
- void cb_write_register_bit3(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t);
- #endif
- void cb_write_register_bit(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
- ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
- //ad0x0_spi_ext_t *p_ext1=ad0x0_spi_ext_get_pdesc(_sf_id);
- rf24_spi_REG_t *preg=(rf24_spi_REG_t*)(p_ext->user_pointer1);
- preg->value = (uint8_t)(p_ext->user_data0>>8);//прочитанный байт
- preg->value &= (uint8_t)(p_ext->user_data0>>24);//_and_mask
- preg->value |= (uint8_t)(p_ext->user_data0>>16);//_or_bits
- //модифицируем ячейку под следующую команду
- //preg->radr нужен новый, т.к. старый затерт записью сраного STATUS-регистра
- p_ext->user_data0 = (uint32_t)preg->value<<8 | (preg->radr | 0x20);
- p_ext->reference_count++;
- p_ext->_p_post_cb_func = cb_write_register_bit2;//тока теперь другой колбэк
- }
- void cb_write_register_bit2(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
- ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
- rf24_spi_REG_t *preg=(rf24_spi_REG_t*)(p_ext->user_pointer1);
- #ifdef AD0X0_RF24_REG_POST_READ
- //регистр записан, модифицируем под чтение с проверкой
- p_ext->reference_count++;//продлить жизнь на 1 цикл
- p_ext->_p_post_cb_func = cb_write_register_bit3;//тока теперь другой колбэк
- //p_ext->user_data0 &=0xFFFFFF00;//пихаем значения для операции чтения
- p_ext->user_data0 = preg->radr;
- #endif
- }
- #ifdef AD0X0_RF24_REG_POST_READ
- void cb_write_register_bit3(uint8_t _sf_id,ad0x0_spi_desc_s *pdspi,void *p_spi_ext_t){
- ad0x0_spi_ext_t *p_ext=(ad0x0_spi_ext_t*)p_spi_ext_t;
- rf24_spi_REG_t *preg=(rf24_spi_REG_t*)(p_ext->user_pointer1);
- //регистр прочитан
- preg->value = (uint8_t)(p_ext->user_data0>>8);
- //p_ext->reference_count++; все! жизнь не продляем, ее завалит построцесс
- //if(preg->value_r != (uint8_t)(p_ext->user_data0>>8)){ ad0x0_err(); }
- }
- #endif
- void write_register_bits(rf24_spi_REG_t *preg_radr, uint8_t _or_bits, uint8_t _and_mask)
- {
- if(preg_radr->so!=1)ad0x0_err();
- //что б понять, что тут ха херня, я пишу комменты для себя
- uint8_t h_ext;
- ad0x0_spi_ext_t *p_spi_ext_t=NULL;
- preg_radr->pspi->ad0x0_spi_get_ext_async2(&h_ext,(void**)&p_spi_ext_t);//получить ячейку, ассоциированную с командой в очереди
- //дальше полный изврат
-
- //читаем значение регистра и модифицируем, используя 1ю ячейку
- //p_spi_ext_t->sf_id=h_ext1;//ячейка для слудующей команды SPI, сюда положим модифицировнное значение регистра
- p_spi_ext_t->user_data0=preg_radr->radr | (uint32_t)0xFF00 | (uint32_t)_or_bits<<16 | (uint32_t)_and_mask<<24;
- p_spi_ext_t->user_pointer1=preg_radr;
- p_spi_ext_t->_p_post_cb_func = cb_write_register_bit;
-
- p_spi_ext_t->pbuf_count=preg_radr->so+1;
- p_spi_ext_t->pbuf_rx=p_spi_ext_t->pbuf_tx=(uint8_t*)&p_spi_ext_t->user_data0;
- p_spi_ext_t->p_pre_SetTXRXBuf=EXT_SetTXRXBuf;
- preg_radr->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
- /*если сейчас, поставить точку останова и прийти сюда,
- то preg_radr->value еще не будет нашим прочитанным из
- предыдущего пуша, т.к. он еще не выполнился
- То что нам нужно - это значение по адресу &preg_radr->value
- По этому мы вроде должны оперировать адресами, а не значениями
- Однако, в коллбэках у нас будут значения, по этому путем подмены
- указателей на коллбэки мы одной межкомандной-проститучной ячейкой
- выполним чтение-модификацию-запись-проверку
- 31.10.2020 - нахер проверку
- */
-
- preg_radr->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
- #ifdef AD0X0_RF24_REG_POST_READ
- preg_radr->pspi->ad0x0_spi_push(ADQS_TXRX_PBUF_DMA_EXT,h_ext);
- #endif
- }
|