ad0x0_i2c2.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. #include "main.h"
  2. #include "ad0x0_i2c2.h"
  3. #include "ad0x0_i2c_ext.h"
  4. //#include "stm8s_delay.h"
  5. #define I2CX ((I2C_TypeDef *)I2C2_BASE)
  6. //#undef AD0X0_I2C2_DBG
  7. //#define AD0X0_I2C2_DBG
  8. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  9. //ВАЖНО!!! если включить, то процессинг коллбэков передачи\приема будет работать
  10. //через очередь фриртоса (возникнут 50-80 мкс задержки через каждые 5-10 команд
  11. //(в видео рассказано должно быть))
  12. //#define AD0X0_USE_I2C2_PROCESS_THROUGH_XQUEUE
  13. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  14. /*новая политика партии: включаем тока те ивенты, которые нужны для конкретных команд*/
  15. __weak void ad0x0_i2c2_err_cb(void);
  16. //void ad0x0_i2c2_process(void);
  17. void ad0x0_i2c2_err(void);
  18. void ad0x0_i2c2_err2(char *_str);
  19. void ad0x0_i2c2_pop(void);
  20. /*2do:
  21. Разобраться что вызывается из прерывания
  22. ad0x0_i2c2_push - вызывать только из задач. В колбэках незя
  23. */
  24. static ad0x0_i2c_desc_s i2c_desc;
  25. struct ad0x0_i2c_cmd_s ad0x0_i2c2_fifo[AD0X0_FIFO_COUNT];
  26. volatile struct ad0x0_i2c_cmd_s *ad0x0_i2c2_pcurhwi=0,*ad0x0_i2c2_pcurswi=0;
  27. volatile uint32_t ad0x0_i2c2_wait_cycles=0,ad0x0_i2c2_wait_cycles_push=0;
  28. uint8_t (*ad0x0_i2c2_pfunc)(void);
  29. //extern xSemaphoreHandle xSemI2C2_01;
  30. volatile xQueueHandle xqi2c2_01=NULL;
  31. void ad0x0_i2c2_restart(void);
  32. xQueueHandle get_xqueue_i2c2(void){return xqi2c2_01;}
  33. void ad0x0_i2c2_xqRecieveHandler(void){
  34. struct ad0x0_i2c_cmd_s *p=NULL;
  35. //Если в очереди нихера то выходим!!!!!!!!!!!!!!!!!!!!!!!!!
  36. if(xQueueReceive(xqi2c2_01,&p,0) != pdPASS)return;
  37. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  38. uint8_t ctype=p->ctype & 0x3f;
  39. switch(ctype){
  40. case ADQ_DELAY_MS:
  41. osDelay(p->cbyte);
  42. ad0x0_i2c2_next(false);
  43. break;
  44. #ifdef AD0X0_USE_I2C2_PROCESS_THROUGH_XQUEUE
  45. case ADQ_HAL_ADDR_TX_BUF_SEQ_FIRST_EXT:
  46. case ADQ_HAL_ADDR_TX_BUF_STOP_EXT:
  47. if(!(ad0x0_i2c2_pcurhwi->cbyte & 0x80)){
  48. ad0x0_i2c_ext_post_process(&i2c_desc,ad0x0_i2c2_pcurhwi->cbyte);
  49. ad0x0_i2c2_pcurhwi->cbyte|=0x80;
  50. }
  51. ad0x0_i2c2_pop();
  52. if(!(ad0x0_i2c2_pcurhwi->ctype & ADQ_EMPTY)){//(очередь не пустая)
  53. ad0x0_i2c2_process(false);
  54. }
  55. break;
  56. #endif
  57. default:
  58. ad0x0_err();
  59. }
  60. }
  61. static void set_events(uint16_t _ev){
  62. //строка ниже, попробую перевести ее: "выключаем биты, которые надо выставить, кроме тех, которые должны остаться"
  63. // I2CX->CR2 &= (~(I2C_CR2_ITEVTEN|I2C_CR2_ITBUFEN)) | _ev;
  64. // I2CX->CR2 |= _ev | I2C_CR2_ITERREN;
  65. }
  66. /*эта тема не отлаживалась, ПРОВЕРИТЬ!!!!!!*/
  67. static portFORCE_INLINE void xqSendProcess(uint8_t _from_isr){
  68. char str[10];
  69. static portBASE_TYPE xHigherPriorityTaskWoken;
  70. __enable_irq();
  71. if(_from_isr){
  72. xHigherPriorityTaskWoken=false;
  73. BaseType_t res=xQueueSendFromISR(xqi2c2_01,(void*)&ad0x0_i2c2_pcurhwi,&xHigherPriorityTaskWoken);
  74. if(res==pdTRUE){
  75. __asm("nop");
  76. //portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
  77. }else
  78. if(res==errQUEUE_FULL){
  79. sprintf(str,"%d",(int)res);
  80. ad0x0_i2c2_err2(str);
  81. }
  82. if( xHigherPriorityTaskWoken )
  83. {
  84. /* Actual macro used here is port specific. */
  85. portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
  86. }
  87. }else{
  88. BaseType_t res=xQueueSend(xqi2c2_01,(void*)&ad0x0_i2c2_pcurhwi,100);
  89. if(res==pdTRUE){
  90. __asm("nop");
  91. //taskYIELD();
  92. }else
  93. if(res==errQUEUE_FULL){
  94. sprintf(str,"%d",(int)res);
  95. ad0x0_i2c2_err2(str);
  96. }
  97. }
  98. }
  99. void ad0x0_i2c2_push(ADQ_t _ctype,uint8_t _cbyte){//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  100. #ifdef ADDBG4_HIGH
  101. ADDBG4_HIGH;
  102. #endif
  103. while(!(ad0x0_i2c2_pcurswi->ctype & ADQ_EMPTY)){
  104. osDelay(1);
  105. }
  106. if(ad0x0_i2c2_pcurswi->ctype & ADQ_EMPTY){
  107. __disable_irq();
  108. ad0x0_i2c2_pcurswi->ctype=_ctype;
  109. ad0x0_i2c2_pcurswi->cbyte=_cbyte;
  110. ad0x0_i2c2_pcurswi=ad0x0_i2c2_pcurswi->pnext;
  111. if((!(ad0x0_i2c2_pcurhwi->ctype & ADQ_PROCESSED)) ){
  112. ad0x0_i2c2_process(false);
  113. }
  114. __enable_irq();
  115. //xqSendProcess();
  116. //ADQ_I2C_EV_ENABLE;
  117. }else ad0x0_err();
  118. //ADQ_I2C_EV_ENABLE;
  119. #ifdef ADDBG4_HIGH
  120. ADDBG4_LOW;
  121. #endif
  122. }
  123. void ad0x0_i2c2_pop(void){//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  124. if(!(ad0x0_i2c2_pcurhwi->ctype & ADQ_PROCESSED)){
  125. //попытка выкинуть необработанный элемент
  126. ad0x0_i2c2_err();
  127. }
  128. int was_masked=__disable_irq();
  129. switch(ad0x0_i2c2_pcurhwi->ctype & 0x3f){
  130. case ADQ_HAL_ADDR_TX_BUF_SEQ_FIRST_EXT:
  131. case ADQ_HAL_ADDR_RX_BUF_SEQ_LAST_EXT:
  132. case ADQ_HAL_ADDR_RX_BUF_SEQ_FIRST_EXT:
  133. case ADQ_HAL_ADDR_TX_BUF_STOP_EXT:
  134. case ADQ_USE_EXT:
  135. if(!(ad0x0_i2c2_pcurhwi->cbyte & 0x80))
  136. {
  137. ad0x0_i2c_ext_release(ad0x0_i2c2_pcurhwi->cbyte);
  138. ad0x0_i2c2_pcurhwi->cbyte|=0x80;
  139. }
  140. break;
  141. case ADQ_DELAY_MS:
  142. break;
  143. }
  144. ad0x0_i2c2_pcurhwi->ctype|=0x80;//метим как выкинутую
  145. ad0x0_i2c2_pcurhwi=ad0x0_i2c2_pcurhwi->pnext;
  146. if(!was_masked)__enable_irq();
  147. }
  148. void ad0x0_i2c2_pop_all(void){//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  149. int was_masked=__disable_irq();
  150. while( !(ad0x0_i2c2_pcurhwi->ctype & ADQ_EMPTY) ){
  151. switch(ad0x0_i2c2_pcurhwi->ctype & 0x3f){
  152. case ADQ_HAL_ADDR_TX_BUF_SEQ_FIRST_EXT:
  153. case ADQ_HAL_ADDR_RX_BUF_SEQ_LAST_EXT:
  154. case ADQ_HAL_ADDR_RX_BUF_SEQ_FIRST_EXT:
  155. case ADQ_HAL_ADDR_TX_BUF_STOP_EXT:
  156. case ADQ_USE_EXT:
  157. if(!(ad0x0_i2c2_pcurhwi->cbyte & 0x80))
  158. {
  159. ad0x0_i2c_ext_release(ad0x0_i2c2_pcurhwi->cbyte);
  160. ad0x0_i2c2_pcurhwi->cbyte|=0x80;
  161. }
  162. break;
  163. case ADQ_DELAY_MS:
  164. break;
  165. }
  166. ad0x0_i2c2_pcurhwi->ctype|=ADQ_EMPTY;//метим как выкинутую
  167. ad0x0_i2c2_pcurhwi=ad0x0_i2c2_pcurhwi->pnext;
  168. }
  169. if(ad0x0_i2c_ext_get_count()){
  170. ad0x0_i2c_ext_get_count();
  171. ad0x0_err();
  172. }
  173. if(!was_masked)__enable_irq();
  174. }
  175. void ad0x0_i2c2_next(uint8_t _from_isr){
  176. ad0x0_i2c2_pop();
  177. if(!(ad0x0_i2c2_pcurhwi->ctype & (ADQ_EMPTY|ADQS_PROCESSED))){//(очередь не пустая)
  178. ad0x0_i2c2_process(_from_isr);
  179. }
  180. }
  181. void ad0x0_i2c2_process(uint8_t _from_isr){
  182. int was_masked=__disable_irq();
  183. if(ad0x0_i2c2_pcurhwi->ctype & (ADQ_EMPTY|ADQS_PROCESSED)){//(очередь не пустая)
  184. //ad0x0_err();
  185. __enable_irq();
  186. return;
  187. }
  188. //тут мы шото меняем какие то флаги, а затем ждем прерывания для текущей команды
  189. #ifdef AD0X0_I2C2_DBG
  190. ADDBG2_HIGH;
  191. #endif
  192. //если тип не впишится в свитч, то комнда либо отброшена, либо обработана ранее
  193. switch(ad0x0_i2c2_pcurhwi->ctype){
  194. case ADQ_HAL_ADDR_TX_BUF_SEQ_FIRST_EXT:
  195. if(!(ad0x0_i2c2_pcurhwi->cbyte & 0x80))ad0x0_i2c_ext_pre_process(&i2c_desc,ad0x0_i2c2_pcurhwi->cbyte);
  196. i2c_desc.last_hal_err=HAL_I2C_Master_Seq_Transmit_IT(i2c_desc.phi2c, i2c_desc.addr_w, i2c_desc.tx_pbuf, i2c_desc.pbuf_counter,I2C_FIRST_FRAME);
  197. if(HAL_OK != i2c_desc.last_hal_err){
  198. i2c_desc.last_hal_state=HAL_I2C_GetState(i2c_desc.phi2c);
  199. }
  200. ad0x0_i2c2_pcurhwi->ctype|=ADQ_PROCESSED;//метим как обработанную
  201. __enable_irq();
  202. break;
  203. case ADQ_HAL_ADDR_RX_BUF_SEQ_LAST_EXT:
  204. if(!(ad0x0_i2c2_pcurhwi->cbyte & 0x80)){
  205. ad0x0_i2c_ext_pre_process(&i2c_desc,ad0x0_i2c2_pcurhwi->cbyte);
  206. }
  207. i2c_desc.last_hal_err=HAL_I2C_Master_Seq_Receive_IT(i2c_desc.phi2c, i2c_desc.addr_r, i2c_desc.rx_pbuf, i2c_desc.pbuf_counter,I2C_LAST_FRAME);
  208. //i2c_desc.last_hal_err=HAL_I2C_Master_Receive_IT(i2c_desc.phi2c, i2c_desc.addr_r, i2c_desc.rx_pbuf, i2c_desc.pbuf_counter);
  209. if(HAL_OK != i2c_desc.last_hal_err){
  210. i2c_desc.last_hal_state=HAL_I2C_GetState(i2c_desc.phi2c);
  211. }
  212. ad0x0_i2c2_pcurhwi->ctype|=ADQ_PROCESSED;//метим как обработанную
  213. __enable_irq();
  214. break;
  215. case ADQ_HAL_ADDR_TX_BUF_STOP_EXT:
  216. if(!(ad0x0_i2c2_pcurhwi->cbyte & 0x80)){
  217. ad0x0_i2c_ext_pre_process(&i2c_desc,ad0x0_i2c2_pcurhwi->cbyte);
  218. }
  219. i2c_desc.last_hal_err=HAL_I2C_Master_Transmit_IT(i2c_desc.phi2c, i2c_desc.addr_w, i2c_desc.tx_pbuf, i2c_desc.pbuf_counter);
  220. if(HAL_OK != i2c_desc.last_hal_err){
  221. i2c_desc.last_hal_state=HAL_I2C_GetState(i2c_desc.phi2c);
  222. }
  223. ad0x0_i2c2_pcurhwi->ctype|=ADQ_PROCESSED;//метим как обработанную
  224. __enable_irq();
  225. break;
  226. case ADQ_DELAY_MS:
  227. //set_events(0);
  228. //HAL_Delay(ad0x0_i2c2_pcurhwi->cbyte);
  229. ad0x0_i2c2_pcurhwi->ctype|=ADQ_PROCESSED;//метим как обработанную
  230. __enable_irq();
  231. #ifdef INC_FREERTOS_H
  232. //osDelay(ad0x0_i2c2_pcurhwi->cbyte);
  233. //задача, в которую это придет, затормозится на скока надо и вызовет поп и процесс
  234. xqSendProcess(_from_isr);
  235. #else
  236. ad0x0_timman_add(ad0x0_spi1_pcurhwi->cbyte,ad0x0_spi1_next);
  237. #endif
  238. break;
  239. case ADQ_USE_EXT:
  240. if(ad0x0_i2c2_pcurhwi->ctype & ADQ_PROCESSED){__enable_irq();ad0x0_i2c2_err();}
  241. else{
  242. ad0x0_i2c2_pcurhwi->ctype|=ADQ_PROCESSED;//метим как обработанную
  243. __enable_irq();
  244. uint8_t cb=ad0x0_i2c2_pcurhwi->cbyte;
  245. ad0x0_i2c2_pcurhwi->cbyte|=0x80;
  246. ad0x0_i2c_ext_pre_process(&i2c_desc,cb);
  247. ad0x0_i2c_ext_post_process(&i2c_desc,cb);
  248. ad0x0_i2c2_pop();
  249. if(!(ad0x0_i2c2_pcurhwi->ctype & (ADQ_EMPTY|ADQS_PROCESSED))){//(очередь не пустая)
  250. ad0x0_i2c2_process(_from_isr);
  251. }
  252. //xqSendProcess();
  253. }
  254. //__enable_irq();
  255. break;
  256. default:
  257. ad0x0_i2c2_err();
  258. //__ASM("nop");
  259. }
  260. i2c_desc.last_hwi_process_tick=HAL_GetTick();
  261. //while(herr);
  262. #ifdef AD0X0_I2C2_DBG
  263. ADDBG2_LOW;
  264. #endif
  265. }
  266. /*void ad0x0_i2c2_irq_err(void){
  267. //я бы это не обрабатывал, если бы не пидорский гироскоп, который не прислал нак при адресе...
  268. //метим команду как необработанную и пробуем по новой
  269. uint8_t ctypex=ad0x0_i2c2_pcurhwi->ctype;
  270. uint32_t sr1=0;//,sr2=0;
  271. sr1=I2CX->SR1;//
  272. I2CX->SR2;//
  273. if(sr1 & I2C_SR1_ARLO){
  274. I2CX->SR1 &= ~I2C_SR1_ARLO;
  275. }else
  276. switch(ctypex & 0x3f){
  277. case ADQ_START_ADDR:
  278. if(sr1 & I2C_SR1_AF){
  279. __disable_irq();
  280. I2CX->SR1&= ~I2C_SR1_AF;
  281. I2CX->CR1 |= I2C_CR1_STOP;
  282. while((I2CX->CR1 & I2C_CR1_STOP));
  283. ad0x0_i2c2_pcurhwi->ctype&=~ADQ_PROCESSED;//метим как НЕ обработанную
  284. ad0x0_i2c2_process();
  285. }
  286. break;
  287. case ADQ_RX_PBUF_STOP_EXT:
  288. if(sr1 & I2C_SR1_BERR){
  289. __disable_irq();
  290. I2CX->SR1&= ~I2C_SR1_BERR;
  291. I2CX->CR1 |= I2C_CR1_STOP;
  292. while((I2CX->CR1 & I2C_CR1_STOP));
  293. ad0x0_i2c2_pcurhwi->ctype&=~ADQ_PROCESSED;//метим как НЕ обработанную
  294. ad0x0_i2c2_process();
  295. }
  296. break;
  297. default:
  298. ad0x0_i2c2_err();
  299. }
  300. }*/
  301. void ad0x0_i2c2_MasterRxCpltCallback(void){
  302. AD_I2C_INT_HIGH
  303. uint8_t ctypex=ad0x0_i2c2_pcurhwi->ctype;
  304. switch(ctypex & 0x3f){
  305. case ADQ_HAL_ADDR_RX_BUF_SEQ_FIRST_EXT:
  306. case ADQ_HAL_ADDR_RX_BUF_SEQ_LAST_EXT:
  307. #ifdef AD0X0_USE_I2C2_PROCESS_THROUGH_XQUEUE
  308. xqSendProcess(true);
  309. #else
  310. if(!(ad0x0_i2c2_pcurhwi->cbyte & 0x80)){
  311. ad0x0_i2c_ext_post_process(&i2c_desc,ad0x0_i2c2_pcurhwi->cbyte);
  312. ad0x0_i2c2_pcurhwi->cbyte|=0x80;
  313. }
  314. ad0x0_i2c2_pop();
  315. if(!(ad0x0_i2c2_pcurhwi->ctype & ADQ_EMPTY)){//(очередь не пустая)
  316. ad0x0_i2c2_process(true);
  317. }
  318. #endif
  319. break;
  320. default:
  321. ad0x0_i2c2_err();
  322. }
  323. AD_I2C_INT_LOW
  324. }
  325. void ad0x0_i2c2_MasterTxCpltCallback(void){
  326. AD_I2C_INT_HIGH
  327. uint8_t ctypex=ad0x0_i2c2_pcurhwi->ctype;
  328. switch(ctypex & 0x3f){
  329. case ADQ_HAL_ADDR_TX_BUF_SEQ_FIRST_EXT:
  330. case ADQ_HAL_ADDR_TX_BUF_STOP_EXT:
  331. if(!(ad0x0_i2c2_pcurhwi->cbyte & 0x80)){
  332. ad0x0_i2c_ext_post_process(&i2c_desc,ad0x0_i2c2_pcurhwi->cbyte);
  333. ad0x0_i2c2_pcurhwi->cbyte|=0x80;
  334. }
  335. #ifdef AD0X0_USE_I2C2_PROCESS_THROUGH_XQUEUE
  336. xqSendProcess(true);
  337. #else
  338. ad0x0_i2c2_pop();
  339. if(!(ad0x0_i2c2_pcurhwi->ctype & ADQ_EMPTY)){//(очередь не пустая)
  340. ad0x0_i2c2_process(true);
  341. }
  342. #endif
  343. break;
  344. default:
  345. ad0x0_i2c2_err();
  346. }
  347. AD_I2C_INT_LOW
  348. }
  349. void ad0x0_i2c2_ErrorCallback(void){
  350. uint8_t ctypex=ad0x0_i2c2_pcurhwi->ctype;
  351. HAL_I2C_StateTypeDef hstate=HAL_I2C_GetState(i2c_desc.phi2c);
  352. uint32_t herr=HAL_I2C_GetError(i2c_desc.phi2c);
  353. switch(ctypex & 0x3f){
  354. case ADQ_HAL_ADDR_TX_BUF_SEQ_FIRST_EXT:
  355. case ADQ_HAL_ADDR_TX_BUF_STOP_EXT:
  356. case ADQ_HAL_ADDR_RX_BUF_SEQ_LAST_EXT:
  357. case ADQ_HAL_ADDR_RX_BUF_SEQ_FIRST_EXT:
  358. //ad0x0_i2c2_pcurhwi->ctype&=~ADQ_PROCESSED;//метим как НЕ обработанную
  359. //ad0x0_i2c2_process();
  360. //ad0x0_i2c_ext_release(ad0x0_i2c2_pcurhwi->cbyte);
  361. ad0x0_i2c2_restart();
  362. break;
  363. default:
  364. ad0x0_i2c2_err();
  365. }
  366. if(hstate==0){
  367. }
  368. }
  369. void ad0x0_i2c2_restart(void){
  370. ad0x0_i2c2_err();
  371. /*i2c_desc.is_i2c_restarting=1;
  372. if(i2c_desc.pfunc_on_error)i2c_desc.pfunc_on_error();
  373. ad0x0_timman_remove(ad0x0_i2c2_next);
  374. ad0x0_i2c2_pop_all();
  375. I2C2->CR1 &= ~(I2C_CR1_SWRST);
  376. HAL_I2C_DeInit(i2c_desc.phi2c);
  377. HAL_I2C_Init(i2c_desc.phi2c);
  378. i2c_desc.is_i2c_restarting=0;
  379. if(i2c_desc.pfunc_on_i2c_restart)i2c_desc.pfunc_on_i2c_restart();*/
  380. }
  381. void ad0x0_i2c2_AbortCpltCallback(void){
  382. uint8_t ctypex=ad0x0_i2c2_pcurhwi->ctype;
  383. ad0x0_i2c2_err();
  384. ad0x0_i2c2_pop();
  385. if(!(ad0x0_i2c2_pcurhwi->ctype & ADQ_EMPTY)){//(очередь не пустая)
  386. ad0x0_i2c2_process(true);
  387. }
  388. //xqSendProcess();
  389. }
  390. uint8_t ad0x0_i2c2_is_queue_ready(void){
  391. //return ((ad0x0_i2c2_pcurhwi->ctype & ADQ_EMPTY) && (ad0x0_i2c2_pcurhwi->pnext->ctype & ADQ_EMPTY) && !(I2CX->SR1 & I2C_SR2_BUSY));
  392. return ((ad0x0_i2c2_pcurhwi->ctype & ADQ_EMPTY) && (ad0x0_i2c2_pcurhwi->pnext->ctype & ADQ_EMPTY) && !i2c_desc.is_i2c_restarting);
  393. }
  394. void ad0x0_i2c2_initq(void){
  395. ad0x0_i2c2_pcurhwi=ad0x0_i2c2_pcurswi=ad0x0_i2c2_fifo;
  396. ad0x0_i2c2_fifo[AD0X0_FIFO_COUNT-1].pnext=ad0x0_i2c2_fifo;
  397. ad0x0_i2c2_fifo[AD0X0_FIFO_COUNT-1].ctype=ADQ_EMPTY;
  398. ad0x0_i2c2_fifo[AD0X0_FIFO_COUNT-1].cbyte=0;
  399. for(uint16_t i=0;i<=AD0X0_FIFO_COUNT-2;i++){
  400. ad0x0_i2c2_fifo[i].pnext=ad0x0_i2c2_fifo+i+1;
  401. ad0x0_i2c2_fifo[i].ctype=ADQ_EMPTY;
  402. ad0x0_i2c2_fifo[i].cbyte=0;
  403. }
  404. }
  405. void ad0x0_i2c2_err(void){
  406. ad0x0_err();
  407. }
  408. void ad0x0_i2c2_init(I2C_HandleTypeDef *_phi2c) {
  409. memset(&i2c_desc,0,sizeof(ad0x0_i2c_desc_s));
  410. i2c_desc.phi2c=_phi2c;
  411. i2c_desc.i2cx=I2CX;
  412. i2c_desc.perrfunc=ad0x0_err;
  413. ad0x0_i2c2_initq();
  414. i2c_desc.last_hwi_process_tick=HAL_GetTick();
  415. xqi2c2_01 = xQueueCreate(1,sizeof(struct ad0x0_i2c_cmd_s *));
  416. if(!xqi2c2_01)ad0x0_err();
  417. //I2CX->CR1 |= I2C_CR1_PE;
  418. //I2CX->CR2 |= (I2C_CR2_ITEVTEN|I2C_CR2_ITBUFEN);
  419. //pins configuing in cubemx...main.c
  420. }
  421. void ad0x0_i2c2_set_restart_func(void (*_pfunc_on_error)(void), void (*_pfunc_on_i2c_restart)(void))
  422. {
  423. i2c_desc.pfunc_on_error=_pfunc_on_error;
  424. i2c_desc.pfunc_on_i2c_restart=_pfunc_on_i2c_restart;
  425. }
  426. void ad0x0_i2c2_deinit(void) {
  427. //I2CX->CR2 &= ~(I2C_CR2_ITERREN|I2C_CR2_ITEVTEN|I2C_CR2_ITBUFEN);
  428. I2CX->CR1 &= ~I2C_CR1_PE;
  429. while(I2CX->CR1 & I2C_CR1_PE);
  430. ad0x0_i2c2_initq();
  431. I2CX->CR1 |= I2C_CR1_PE;
  432. //I2CX->CR2 |= (I2C_CR2_ITEVTEN|I2C_CR2_ITBUFEN);
  433. //pins configuing in cubemx...main.c
  434. }
  435. uint8_t ad0x0_i2c2_get_ext_async2(uint8_t *_p_out_handle,void **_p_out_i2c_ext_t){
  436. while( !ad0x0_i2c_ext_get(_p_out_handle, (ad0x0_i2c_ext_t**)_p_out_i2c_ext_t) ){
  437. __enable_irq();
  438. set_events(I2C_CR2_ITEVTEN|I2C_CR2_ITBUFEN);
  439. ad0x0_i2c2_wait_cycles++;
  440. osDelay(1);
  441. }
  442. return 1;
  443. }
  444. uint8_t ad0x0_i2c2_get_ext_setbuf(uint8_t *_tx_pbuf,uint8_t *_rx_pbuf, uint8_t _count){
  445. //c_enter_ext++;
  446. uint8_t i;
  447. ad0x0_i2c_ext_t *pf;
  448. ad0x0_i2c2_get_ext_async2(&i,(void**)&pf);
  449. // if(pf->pSetTXRXBuf ||pf->_p_cb_func|| pf->calls_count)ad0x0_i2c2_err();//УБРАТЬ
  450. pf->pbuf_tx=_tx_pbuf;
  451. pf->pbuf_rx=_rx_pbuf;
  452. pf->pbuf_count=_count;
  453. //pf->i2c=I2;
  454. pf->p_pre_SetTXRXBuf=EXT_SetTXRXBuf_i2c;//ну я хз, пока делаем так... ПЕРЕДЕЛАТЬ!!!!!!
  455. return i;
  456. //ad0x0_i2c2_push(ADQ_USE_EXT,i);
  457. //c_enter_ext--;
  458. }
  459. void ad0x0_i2c2_push_ext_setfunc(uint8_t _sf_id,void (*_p_cb_func)(uint8_t _sf_id,ad0x0_i2c_desc_s *pdi2c,void *p_i2c_ext_t)){
  460. //c_enter_ext++;
  461. uint8_t i;
  462. ad0x0_i2c_ext_t *pf;
  463. ad0x0_i2c2_get_ext_async2(&i,(void**)&pf);
  464. pf->sf_id=_sf_id;
  465. pf->_p_post_cb_func=_p_cb_func;//ну я хз, пока делаем так... ПЕРЕДЕЛАТЬ!!!!!!
  466. //pf->=SPIX;
  467. ad0x0_i2c2_push(ADQ_USE_EXT,i);
  468. //c_enter_ext--;
  469. }
  470. void ad0x0_i2c2_err2(char *_str){
  471. if(strcmp(_str,"suka")==0){
  472. __ASM("nop");
  473. }
  474. ad0x0_i2c2_err();
  475. }