ad0x0_i2c1.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. #include "main.h"
  2. #include "ad0x0_i2c1.h"
  3. #include "ad0x0_i2c_ext.h"
  4. //#include "stm8s_delay.h"
  5. #define I2CX ((I2C_TypeDef *)I2C1_BASE)
  6. //#undef AD0X0_I2C1_DBG
  7. //#define AD0X0_I2C1_DBG
  8. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  9. //ВАЖНО!!! если включить, то процессинг коллбэков передачи\приема будет работать
  10. //через очередь фриртоса (возникнут 15-40 мкс задержки через каждые 5-10 команд
  11. //(в видео рассказано должно быть))
  12. #define AD0X0_USE_I2C1_PROCESS_THROUGH_XQUEUE
  13. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  14. /*новая политика партии: включаем тока те ивенты, которые нужны для конкретных команд*/
  15. __weak void ad0x0_i2c1_err_cb(void);
  16. //void ad0x0_i2c1_process(void);
  17. void ad0x0_i2c1_err(void);
  18. void ad0x0_i2c1_err2(char *_str);
  19. void ad0x0_i2c1_pop(void);
  20. /*2do:
  21. Разобраться что вызывается из прерывания
  22. ad0x0_i2c1_push - вызывать только из задач. В колбэках незя
  23. */
  24. static ad0x0_i2c_desc_s i2c_desc;
  25. struct ad0x0_i2c_cmd_s ad0x0_i2c1_fifo[AD0X0_FIFO_COUNT];
  26. volatile struct ad0x0_i2c_cmd_s *ad0x0_i2c1_pcurhwi=0,*ad0x0_i2c1_pcurswi=0;
  27. volatile uint32_t ad0x0_i2c1_wait_cycles=0,ad0x0_i2c1_wait_cycles_push=0;
  28. uint8_t (*ad0x0_i2c1_pfunc)(void);
  29. //extern xSemaphoreHandle xSemI2C1_01;
  30. volatile xQueueHandle xqi2c1_01=NULL;
  31. xQueueHandle get_xqueue_i2c1(void){return xqi2c1_01;}
  32. void ad0x0_i2c1_restart(void);
  33. void ad0x0_i2c1_xqRecieveHandler(void){
  34. struct ad0x0_i2c_cmd_s *p=NULL;
  35. //Если в очереди нихера то выходим!!!!!!!!!!!!!!!!!!!!!!!!!
  36. //if(xQueueReceive(xqi2c1_01,&p,0) != pdPASS)return;
  37. xQueueReceive(xqi2c1_01,&p,portMAX_DELAY);
  38. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  39. uint8_t ctype=p->ctype & 0x3f;
  40. switch(ctype){
  41. case ADQ_DELAY_MS:
  42. osDelay(p->cbyte);
  43. ad0x0_i2c1_next(false);
  44. break;
  45. #ifdef AD0X0_USE_I2C1_PROCESS_THROUGH_XQUEUE
  46. case ADQ_HAL_ADDR_TX_BUF_SEQ_FIRST_EXT:
  47. case ADQ_HAL_ADDR_TX_BUF_STOP_EXT:
  48. if(!(ad0x0_i2c1_pcurhwi->cbyte & 0x80)){
  49. ad0x0_i2c_ext_post_process(&i2c_desc,ad0x0_i2c1_pcurhwi->cbyte);
  50. ad0x0_i2c1_pcurhwi->cbyte|=0x80;
  51. }
  52. ad0x0_i2c1_pop();
  53. if(!(ad0x0_i2c1_pcurhwi->ctype & ADQ_EMPTY)){//(очередь не пустая)
  54. ad0x0_i2c1_process(false);
  55. while(i2c_desc.last_hal_err!=HAL_OK){
  56. ad0x0_i2c1_pcurhwi->ctype &= ~ADQS_PROCESSED;
  57. ad0x0_i2c1_process(false);
  58. }
  59. }
  60. break;
  61. #endif
  62. default:
  63. ad0x0_err();
  64. }
  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(xqi2c1_01,(void*)&ad0x0_i2c1_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_i2c1_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(xqi2c1_01,(void*)&ad0x0_i2c1_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_i2c1_err2(str);
  96. }
  97. }
  98. }
  99. void ad0x0_i2c1_push(ADQ_t _ctype,uint8_t _cbyte){//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  100. #ifdef ADDBG4_HIGH
  101. ADDBG4_HIGH;
  102. #endif
  103. while(!(ad0x0_i2c1_pcurswi->ctype & ADQ_EMPTY)){
  104. osDelay(1);
  105. }
  106. if(ad0x0_i2c1_pcurswi->ctype & ADQ_EMPTY){
  107. __disable_irq();
  108. ad0x0_i2c1_pcurswi->ctype=_ctype;
  109. ad0x0_i2c1_pcurswi->cbyte=_cbyte;
  110. ad0x0_i2c1_pcurswi=ad0x0_i2c1_pcurswi->pnext;
  111. if((!(ad0x0_i2c1_pcurhwi->ctype & ADQ_PROCESSED)) ){
  112. ad0x0_i2c1_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_i2c1_pop(void){//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  124. if(!(ad0x0_i2c1_pcurhwi->ctype & ADQ_PROCESSED)){
  125. //попытка выкинуть необработанный элемент
  126. ad0x0_i2c1_err();
  127. }
  128. int was_masked=__disable_irq();
  129. switch(ad0x0_i2c1_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_i2c1_pcurhwi->cbyte & 0x80))
  136. {
  137. ad0x0_i2c_ext_release(ad0x0_i2c1_pcurhwi->cbyte);
  138. ad0x0_i2c1_pcurhwi->cbyte|=0x80;
  139. }
  140. break;
  141. case ADQ_DELAY_MS:
  142. break;
  143. }
  144. ad0x0_i2c1_pcurhwi->ctype|=0x80;//метим как выкинутую
  145. ad0x0_i2c1_pcurhwi=ad0x0_i2c1_pcurhwi->pnext;
  146. if(!was_masked)__enable_irq();
  147. }
  148. void ad0x0_i2c1_pop_all(void){//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  149. int was_masked=__disable_irq();
  150. while( !(ad0x0_i2c1_pcurhwi->ctype & ADQ_EMPTY) ){
  151. switch(ad0x0_i2c1_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_i2c1_pcurhwi->cbyte & 0x80))
  158. {
  159. ad0x0_i2c_ext_release(ad0x0_i2c1_pcurhwi->cbyte);
  160. ad0x0_i2c1_pcurhwi->cbyte|=0x80;
  161. }
  162. break;
  163. case ADQ_DELAY_MS:
  164. break;
  165. }
  166. ad0x0_i2c1_pcurhwi->ctype|=ADQ_EMPTY;//метим как выкинутую
  167. ad0x0_i2c1_pcurhwi=ad0x0_i2c1_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_i2c1_next(uint8_t _from_isr){
  176. ad0x0_i2c1_pop();
  177. if(!(ad0x0_i2c1_pcurhwi->ctype & (ADQ_EMPTY|ADQS_PROCESSED))){//(очередь не пустая)
  178. ad0x0_i2c1_process(_from_isr);
  179. }
  180. }
  181. void ad0x0_i2c1_process(uint8_t _from_isr){
  182. #ifdef AD0X0_I2C1_DBG
  183. ADDBG2_HIGH;
  184. #endif
  185. uint8_t cb;
  186. int was_masked=__disable_irq();
  187. if(ad0x0_i2c1_pcurhwi->ctype & (ADQ_EMPTY|ADQ_PROCESSED)){//(очередь не пустая)
  188. //ad0x0_err();
  189. __enable_irq();
  190. return;
  191. }
  192. ad0x0_i2c1_pcurhwi->ctype|=ADQ_PROCESSED;//метим как обработанную
  193. __enable_irq();
  194. //тут мы шото меняем какие то флаги, а затем ждем прерывания для текущей команды
  195. //если тип не впишится в свитч, то комнда либо отброшена, либо обработана ранее
  196. switch(ad0x0_i2c1_pcurhwi->ctype & 0x3f){
  197. case ADQ_HAL_ADDR_TX_BUF_SEQ_FIRST_EXT:
  198. if(!(ad0x0_i2c1_pcurhwi->cbyte & 0x80))ad0x0_i2c_ext_pre_process(&i2c_desc,ad0x0_i2c1_pcurhwi->cbyte);
  199. 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);
  200. if(HAL_OK != i2c_desc.last_hal_err){
  201. i2c_desc.last_hal_state=HAL_I2C_GetState(i2c_desc.phi2c);
  202. }
  203. break;
  204. case ADQ_HAL_ADDR_RX_BUF_SEQ_LAST_EXT:
  205. if(!(ad0x0_i2c1_pcurhwi->cbyte & 0x80)){
  206. ad0x0_i2c_ext_pre_process(&i2c_desc,ad0x0_i2c1_pcurhwi->cbyte);
  207. }
  208. 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);
  209. //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);
  210. if(HAL_OK != i2c_desc.last_hal_err){
  211. i2c_desc.last_hal_state=HAL_I2C_GetState(i2c_desc.phi2c);
  212. }
  213. break;
  214. case ADQ_HAL_ADDR_TX_BUF_STOP_EXT:
  215. if(!(ad0x0_i2c1_pcurhwi->cbyte & 0x80)){
  216. ad0x0_i2c_ext_pre_process(&i2c_desc,ad0x0_i2c1_pcurhwi->cbyte);
  217. }
  218. 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);
  219. if(HAL_OK != i2c_desc.last_hal_err){
  220. i2c_desc.last_hal_state=HAL_I2C_GetState(i2c_desc.phi2c);
  221. }
  222. break;
  223. case ADQ_DELAY_MS:
  224. //set_events(0);
  225. //HAL_Delay(ad0x0_i2c1_pcurhwi->cbyte);
  226. #ifdef INC_FREERTOS_H
  227. //osDelay(ad0x0_i2c1_pcurhwi->cbyte);
  228. //задача, в которую это придет, затормозится на скока надо и вызовет поп и процесс
  229. xqSendProcess(_from_isr);
  230. #else
  231. ad0x0_timman_add(ad0x0_spi1_pcurhwi->cbyte,ad0x0_spi1_next);
  232. #endif
  233. break;
  234. case ADQ_USE_EXT:
  235. cb=ad0x0_i2c1_pcurhwi->cbyte;
  236. ad0x0_i2c1_pcurhwi->cbyte|=0x80;
  237. ad0x0_i2c_ext_pre_process(&i2c_desc,cb);
  238. ad0x0_i2c_ext_post_process(&i2c_desc,cb);
  239. xqSendProcess(_from_isr);
  240. /*ad0x0_i2c1_pop();
  241. if(!(ad0x0_i2c1_pcurhwi->ctype & (ADQ_EMPTY|ADQS_PROCESSED))){//(очередь не пустая)
  242. ad0x0_i2c1_process(_from_isr);
  243. }*/
  244. break;
  245. default:
  246. ad0x0_i2c1_err();
  247. //__ASM("nop");
  248. }
  249. if(_from_isr)i2c_desc.last_hwi_process_tick=xTaskGetTickCountFromISR();else i2c_desc.last_hwi_process_tick=xTaskGetTickCount();
  250. //while(herr);
  251. #ifdef AD0X0_I2C1_DBG
  252. ADDBG2_LOW;
  253. #endif
  254. }
  255. /*void ad0x0_i2c1_irq_err(void){
  256. //я бы это не обрабатывал, если бы не пидорский гироскоп, который не прислал нак при адресе...
  257. //метим команду как необработанную и пробуем по новой
  258. uint8_t ctypex=ad0x0_i2c1_pcurhwi->ctype;
  259. uint32_t sr1=0;//,sr2=0;
  260. sr1=I2CX->SR1;//
  261. I2CX->SR2;//
  262. if(sr1 & I2C_SR1_ARLO){
  263. I2CX->SR1 &= ~I2C_SR1_ARLO;
  264. }else
  265. switch(ctypex & 0x3f){
  266. case ADQ_START_ADDR:
  267. if(sr1 & I2C_SR1_AF){
  268. __disable_irq();
  269. I2CX->SR1&= ~I2C_SR1_AF;
  270. I2CX->CR1 |= I2C_CR1_STOP;
  271. while((I2CX->CR1 & I2C_CR1_STOP));
  272. ad0x0_i2c1_pcurhwi->ctype&=~ADQ_PROCESSED;//метим как НЕ обработанную
  273. ad0x0_i2c1_process();
  274. }
  275. break;
  276. case ADQ_RX_PBUF_STOP_EXT:
  277. if(sr1 & I2C_SR1_BERR){
  278. __disable_irq();
  279. I2CX->SR1&= ~I2C_SR1_BERR;
  280. I2CX->CR1 |= I2C_CR1_STOP;
  281. while((I2CX->CR1 & I2C_CR1_STOP));
  282. ad0x0_i2c1_pcurhwi->ctype&=~ADQ_PROCESSED;//метим как НЕ обработанную
  283. ad0x0_i2c1_process();
  284. }
  285. break;
  286. default:
  287. ad0x0_i2c1_err();
  288. }
  289. }*/
  290. void ad0x0_i2c1_MasterRxCpltCallback(void){
  291. AD_I2C_INT_HIGH
  292. uint8_t ctypex=ad0x0_i2c1_pcurhwi->ctype;
  293. switch(ctypex & 0x3f){
  294. case ADQ_HAL_ADDR_RX_BUF_SEQ_FIRST_EXT:
  295. case ADQ_HAL_ADDR_RX_BUF_SEQ_LAST_EXT:
  296. #ifdef AD0X0_USE_I2C1_PROCESS_THROUGH_XQUEUE
  297. xqSendProcess(true);//так правильно, но медленно
  298. #else
  299. if(!(ad0x0_i2c1_pcurhwi->cbyte & 0x80)){
  300. ad0x0_i2c_ext_post_process(&i2c_desc,ad0x0_i2c1_pcurhwi->cbyte);
  301. ad0x0_i2c1_pcurhwi->cbyte|=0x80;
  302. }
  303. ad0x0_i2c1_pop();
  304. if(!(ad0x0_i2c1_pcurhwi->ctype & ADQ_EMPTY)){//(очередь не пустая)
  305. ad0x0_i2c1_process(true);
  306. }
  307. #endif
  308. break;
  309. default:
  310. ad0x0_i2c1_err();
  311. }
  312. AD_I2C_INT_LOW
  313. }
  314. void ad0x0_i2c1_MasterTxCpltCallback(void){
  315. AD_I2C_INT_HIGH
  316. uint8_t ctypex=ad0x0_i2c1_pcurhwi->ctype;
  317. switch(ctypex & 0x3f){
  318. case ADQ_HAL_ADDR_TX_BUF_SEQ_FIRST_EXT:
  319. case ADQ_HAL_ADDR_TX_BUF_STOP_EXT:
  320. if(!(ad0x0_i2c1_pcurhwi->cbyte & 0x80)){
  321. ad0x0_i2c_ext_post_process(&i2c_desc,ad0x0_i2c1_pcurhwi->cbyte);
  322. ad0x0_i2c1_pcurhwi->cbyte|=0x80;
  323. }
  324. #ifdef AD0X0_USE_I2C1_PROCESS_THROUGH_XQUEUE
  325. //if(ad0x0_i2c1_pcurhwi->pnext->ctype == ADQS_USE_EXT ){
  326. if(1){
  327. xqSendProcess(true);//так правильно, но медленно
  328. }else{
  329. ad0x0_i2c1_pop();
  330. NVIC_SetPendingIRQ(I2C1_EV_IRQn);
  331. }
  332. #else
  333. ad0x0_i2c1_pop();
  334. if(!(ad0x0_i2c1_pcurhwi->ctype & ADQ_EMPTY)){//(очередь не пустая)
  335. ad0x0_i2c1_process(true);
  336. }
  337. #endif
  338. break;
  339. default:
  340. ad0x0_i2c1_err();
  341. }
  342. AD_I2C_INT_LOW
  343. }
  344. void ad0x0_i2c1_ErrorCallback(void){
  345. uint8_t ctypex=ad0x0_i2c1_pcurhwi->ctype;
  346. HAL_I2C_StateTypeDef hstate=HAL_I2C_GetState(i2c_desc.phi2c);
  347. uint32_t herr=HAL_I2C_GetError(i2c_desc.phi2c);
  348. switch(ctypex & 0x3f){
  349. case ADQ_HAL_ADDR_TX_BUF_SEQ_FIRST_EXT:
  350. case ADQ_HAL_ADDR_TX_BUF_STOP_EXT:
  351. case ADQ_HAL_ADDR_RX_BUF_SEQ_LAST_EXT:
  352. case ADQ_HAL_ADDR_RX_BUF_SEQ_FIRST_EXT:
  353. //ad0x0_i2c1_pcurhwi->ctype&=~ADQ_PROCESSED;//метим как НЕ обработанную
  354. //ad0x0_i2c1_process();
  355. //ad0x0_i2c_ext_release(ad0x0_i2c1_pcurhwi->cbyte);
  356. ad0x0_i2c1_restart();
  357. break;
  358. default:
  359. ad0x0_i2c1_err();
  360. }
  361. if(hstate==0){
  362. }
  363. }
  364. void ad0x0_i2c1_restart(void){
  365. ad0x0_i2c1_err();
  366. /*i2c_desc.is_i2c_restarting=1;
  367. if(i2c_desc.pfunc_on_error)i2c_desc.pfunc_on_error();
  368. ad0x0_timman_remove(ad0x0_i2c1_next);
  369. ad0x0_i2c1_pop_all();
  370. I2C1->CR1 &= ~(I2C_CR1_SWRST);
  371. HAL_I2C_DeInit(i2c_desc.phi2c);
  372. HAL_I2C_Init(i2c_desc.phi2c);
  373. i2c_desc.is_i2c_restarting=0;
  374. if(i2c_desc.pfunc_on_i2c_restart)i2c_desc.pfunc_on_i2c_restart();*/
  375. }
  376. void ad0x0_i2c1_AbortCpltCallback(void){
  377. uint8_t ctypex=ad0x0_i2c1_pcurhwi->ctype;
  378. ad0x0_i2c1_err();
  379. ad0x0_i2c1_pop();
  380. if(!(ad0x0_i2c1_pcurhwi->ctype & ADQ_EMPTY)){//(очередь не пустая)
  381. ad0x0_i2c1_process(true);
  382. }
  383. //xqSendProcess();
  384. }
  385. uint8_t ad0x0_i2c1_is_queue_ready(void){
  386. //return ((ad0x0_i2c1_pcurhwi->ctype & ADQ_EMPTY) && (ad0x0_i2c1_pcurhwi->pnext->ctype & ADQ_EMPTY) && !(I2CX->SR1 & I2C_SR2_BUSY));
  387. return ((ad0x0_i2c1_pcurhwi->ctype & ADQ_EMPTY) && (ad0x0_i2c1_pcurhwi->pnext->ctype & ADQ_EMPTY) && !i2c_desc.is_i2c_restarting);
  388. }
  389. void ad0x0_i2c1_initq(void){
  390. ad0x0_i2c1_pcurhwi=ad0x0_i2c1_pcurswi=ad0x0_i2c1_fifo;
  391. ad0x0_i2c1_fifo[AD0X0_FIFO_COUNT-1].pnext=ad0x0_i2c1_fifo;
  392. ad0x0_i2c1_fifo[AD0X0_FIFO_COUNT-1].ctype=ADQ_EMPTY;
  393. ad0x0_i2c1_fifo[AD0X0_FIFO_COUNT-1].cbyte=0;
  394. for(uint16_t i=0;i<=AD0X0_FIFO_COUNT-2;i++){
  395. ad0x0_i2c1_fifo[i].pnext=ad0x0_i2c1_fifo+i+1;
  396. ad0x0_i2c1_fifo[i].ctype=ADQ_EMPTY;
  397. ad0x0_i2c1_fifo[i].cbyte=0;
  398. }
  399. }
  400. void ad0x0_i2c1_err(void){
  401. ad0x0_err();
  402. }
  403. void ad0x0_i2c1_init(I2C_HandleTypeDef *_phi2c) {
  404. memset(&i2c_desc,0,sizeof(ad0x0_i2c_desc_s));
  405. i2c_desc.phi2c=_phi2c;
  406. i2c_desc.i2cx=I2CX;
  407. i2c_desc.perrfunc=ad0x0_err;
  408. ad0x0_i2c1_initq();
  409. i2c_desc.last_hwi_process_tick=HAL_GetTick();
  410. xqi2c1_01 = xQueueCreate(1,sizeof(struct ad0x0_i2c_cmd_s *));
  411. if(!xqi2c1_01)ad0x0_err();
  412. //I2CX->CR1 |= I2C_CR1_PE;
  413. //I2CX->CR2 |= (I2C_CR2_ITEVTEN|I2C_CR2_ITBUFEN);
  414. //pins configuing in cubemx...main.c
  415. }
  416. void ad0x0_i2c1_set_restart_func(void (*_pfunc_on_error)(void), void (*_pfunc_on_i2c_restart)(void))
  417. {
  418. i2c_desc.pfunc_on_error=_pfunc_on_error;
  419. i2c_desc.pfunc_on_i2c_restart=_pfunc_on_i2c_restart;
  420. }
  421. void ad0x0_i2c1_deinit(void) {
  422. //I2CX->CR2 &= ~(I2C_CR2_ITERREN|I2C_CR2_ITEVTEN|I2C_CR2_ITBUFEN);
  423. I2CX->CR1 &= ~I2C_CR1_PE;
  424. while(I2CX->CR1 & I2C_CR1_PE);
  425. ad0x0_i2c1_initq();
  426. I2CX->CR1 |= I2C_CR1_PE;
  427. vQueueDelete(xqi2c1_01);
  428. xqi2c1_01=NULL;
  429. //I2CX->CR2 |= (I2C_CR2_ITEVTEN|I2C_CR2_ITBUFEN);
  430. //pins configuing in cubemx...main.c
  431. }
  432. uint8_t ad0x0_i2c1_get_ext_async2(uint8_t *_p_out_handle,void **_p_out_i2c_ext_t){
  433. while( !ad0x0_i2c_ext_get(_p_out_handle, (ad0x0_i2c_ext_t**)_p_out_i2c_ext_t) ){
  434. __enable_irq();
  435. ad0x0_i2c1_wait_cycles++;
  436. osDelay(1);
  437. }
  438. return 1;
  439. }
  440. uint8_t ad0x0_i2c1_get_ext_setbuf(uint8_t *_tx_pbuf,uint8_t *_rx_pbuf, uint8_t _count){
  441. //c_enter_ext++;
  442. uint8_t i;
  443. ad0x0_i2c_ext_t *pf;
  444. ad0x0_i2c1_get_ext_async2(&i,(void**)&pf);
  445. // if(pf->pSetTXRXBuf ||pf->_p_cb_func|| pf->calls_count)ad0x0_i2c1_err();//УБРАТЬ
  446. pf->pbuf_tx=_tx_pbuf;
  447. pf->pbuf_rx=_rx_pbuf;
  448. pf->pbuf_count=_count;
  449. //pf->i2c=I2;
  450. pf->p_pre_SetTXRXBuf=EXT_SetTXRXBuf_i2c;//ну я хз, пока делаем так... ПЕРЕДЕЛАТЬ!!!!!!
  451. return i;
  452. //ad0x0_i2c1_push(ADQ_USE_EXT,i);
  453. //c_enter_ext--;
  454. }
  455. void ad0x0_i2c1_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)){
  456. //c_enter_ext++;
  457. uint8_t i;
  458. ad0x0_i2c_ext_t *pf;
  459. ad0x0_i2c1_get_ext_async2(&i,(void**)&pf);
  460. pf->sf_id=_sf_id;
  461. pf->_p_post_cb_func=_p_cb_func;//ну я хз, пока делаем так... ПЕРЕДЕЛАТЬ!!!!!!
  462. //pf->=SPIX;
  463. ad0x0_i2c1_push(ADQ_USE_EXT,i);
  464. //c_enter_ext--;
  465. }
  466. void ad0x0_i2c1_err2(char *_str){
  467. if(strcmp(_str,"suka")==0){
  468. __ASM("nop");
  469. }
  470. ad0x0_i2c1_err();
  471. }