ad0x0_i2c.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #ifndef AD0X0_I2C_H
  2. #define AD0X0_I2C_H
  3. #include "main.h"
  4. // ************************** I2C Configuration Variables **************************
  5. /* definition of fast or default standard mode (bus speed up to 400 or 100 kHz) */
  6. #define AD0X0_I2C_EXT_COUNT 32
  7. //#define FAST_I2C_MODE
  8. #define AD0X0_FIFO_COUNT 32
  9. #define AD0X0_I2C_DBG
  10. /* definition of 10-bit or default 7-bit slave address */
  11. //#define TEN_BITS_ADDRESS
  12. /* uncomment next line when stop request is required between device address sent and read data */
  13. //#define NO_RESTART
  14. #ifdef TEN_BITS_ADDRESS
  15. #define SLAVE_ADDRESS 0x3F0
  16. #else
  17. #define SLAVE_ADDRESS 0x3C
  18. #endif
  19. /*
  20. очередь - кольцевой бл. буфер с командами и данными для моего движка i2c на прер-ях
  21. В общем теория с очердью такая: мы можем их разные делать для разной отрисовки,
  22. для чтения гироскопа... метить cbyte |=0x80 и подсовывать когда надо на обработку..
  23. Можно так же перескоки с очереди на очередь предусмотреть, типа дочитал гироскоп, погнал рисовать
  24. на экране. С экраном вообще надо сделать чтобы коды символов передавались, а он их писАл пачками
  25. за один старт-рестарт-данные стоп.
  26. */
  27. //#undef AD0X0_I2C_DBG_CO
  28. //2do переделать нахер под тайпдеф
  29. //ADQ_ это замена ad0x0_queue_ - это б писанина излишняя
  30. typedef enum{
  31. /*ADQ_START_ADDR = (uint8_t)0x1,
  32. ADQ_STOP = (uint8_t)0x2,
  33. ADQ_TX = (uint8_t)0x0,
  34. ADQ_TX_STOP = (uint8_t)0x4,
  35. ADQ_TX_LRB_STOP = (uint8_t)0xA,
  36. ADQ_RX_STOP = (uint8_t)0x5,
  37. ADQ_RX_PBUF_STOP_EXT = (uint8_t)0xB, //прочитать в пбуф. кол-во cbyte
  38. ADQ_TX_PBUF_STOP_EXT = (uint8_t)0x8,*/
  39. ADQ_USE_EXT = (uint8_t)0x6, //[15:8]
  40. ADQ_HAL_ADDR_TX_BUF_SEQ_FIRST_EXT = (uint8_t)0xE,
  41. ADQ_HAL_ADDR_RX_BUF_SEQ_FIRST_EXT = (uint8_t)0xF,
  42. //ADQ_HAL_ADDR_TX_BUF_SEQ_LAST_EXT = (uint8_t)0x10,
  43. ADQ_HAL_ADDR_RX_BUF_SEQ_LAST_EXT = (uint8_t)0x11,
  44. ADQ_HAL_ADDR_TX_BUF_STOP_EXT = (uint8_t)0x12,
  45. ADQ_DBG_XXX = (uint8_t)0xD, //[7:0]
  46. // ADQ_LRB_MODIFY_APPLY_MASK = (uint8_t)0xC, //прочитанный байт &= cbyte
  47. // ADQ_LRB_MODIFY_APPLY_OR = (uint8_t)0x7, //прочитанный байт |= cbyte
  48. ADQ_DELAY_MS = (uint8_t)0x9,
  49. ADQ_PROCESSED = (uint8_t)0x40,//6й бит
  50. ADQ_EMPTY = (uint8_t)0x80 //7й бит
  51. } ADQ_t;
  52. /*#define AD_START_ADDR 0x1
  53. #define AD_STOP 0x2
  54. #define AD_TX 0x0
  55. #define AD_TX_STOP 0x4
  56. #define AD_TXLAST_STOP 0x8
  57. #define AD_RX_STOP 0x5
  58. #define AD_RX_PBUF_STOP 0xB //прочитать в пбуф. кол-во cbyte
  59. #define AD_SET_PBUF_H 0xC //[15:8]
  60. #define AD_SET_PBUF_L 0xD //[7:0]
  61. #define AD_SET_PBUF_HH 0xE //[31:24] блин ну адреса 0x4000, 0x2000 в зависимости от типа памяти
  62. #define AD_SET_PBUF_HL 0xF //[23:16] в общем пока делаю весь указатель (ad0x0 23082020)
  63. #define AD_MODIFY_APPLY_MASK 0x6 //прочитанный байт &= cbyte
  64. #define AD_MODIFY_APPLY_OR 0x7 //прочитанный байт |= cbyte
  65. #define AD_DELAY_MS 0x9
  66. #define AD_Q_PROCESSED 0x40//6й бит
  67. #define AD_Q_EMPTY 0x80//7й бит*/
  68. //#define AD0X0_I2C2_DBG
  69. #define AD_DBG_S1_Pin GPIO_PIN_1
  70. #define AD_DBG_S1_GPIO_Port GPIOA
  71. #ifdef AD0X0_I2C2_DBG
  72. #define AD_I2C_INT_HIGH AD_DBG_S1_GPIO_Port->ODR |= AD_DBG_S1_Pin;
  73. #else
  74. #define AD_I2C_INT_HIGH ;
  75. #endif
  76. #ifdef AD0X0_I2C2_DBG
  77. #define AD_I2C_INT_LOW AD_DBG_S1_GPIO_Port->ODR &= ~AD_DBG_S1_Pin;
  78. #else
  79. #define AD_I2C_INT_LOW ;
  80. #endif
  81. #ifdef AD0X0_I2C2_DBG
  82. #define ADDBG2_HIGH AD_DBG_S2_GPIO_Port->ODR |= AD_DBG_S2_Pin;
  83. #else
  84. #define ADDBG2_HIGH ;
  85. #endif
  86. #ifdef AD0X0_I2C2_DBG
  87. #define ADDBG2_LOW AD_DBG_S2_GPIO_Port->ODR &= ~AD_DBG_S2_Pin;//*/
  88. #else
  89. #define ADDBG2_LOW ;
  90. #endif
  91. /*void HAL_I2C_MasterRxCpltCallback (I2C_HandleTypeDef * hi2c){
  92. if(hi2c->Instance==hi2c1.Instance){
  93. ad0x0_i2c1_MasterRxCpltCallback();
  94. }else ad0x0_i2c2_MasterRxCpltCallback();
  95. }
  96. void HAL_I2C_MasterTxCpltCallback (I2C_HandleTypeDef * hi2c){
  97. if(hi2c->Instance==hi2c1.Instance){
  98. ad0x0_i2c1_MasterTxCpltCallback();
  99. }else ad0x0_i2c2_MasterTxCpltCallback();
  100. }
  101. void HAL_I2C_ErrorCallback (I2C_HandleTypeDef * hi2c){
  102. if(hi2c->Instance==hi2c1.Instance){
  103. ad0x0_i2c1_ErrorCallback();
  104. }else ad0x0_i2c2_ErrorCallback();
  105. }
  106. void HAL_I2C_AbortCpltCallback (I2C_HandleTypeDef * hi2c){
  107. if(hi2c->Instance==hi2c1.Instance){
  108. ad0x0_i2c1_AbortCpltCallback();
  109. }else ad0x0_i2c2_AbortCpltCallback();*/
  110. // ************************* Function Declaration ***************************
  111. struct ad0x0_i2c_cmd_s{
  112. ADQ_t ctype;//
  113. //u8 processed=ctypex & 0x40;//b 0100 0000
  114. //u8 dropped=ctypex & 0x80;//b 1000 0000
  115. uint8_t cbyte;
  116. struct ad0x0_i2c_cmd_s *pnext;
  117. #ifdef AD0X0_I2C_DBG_CO
  118. uint8_t co;
  119. #endif
  120. };
  121. typedef struct {
  122. /* //u8 processed=ctypex & 0x40;//b 0100 0000
  123. //u8 dropped=ctypex & 0x80;//b 1000 0000*/
  124. I2C_TypeDef *i2cx;
  125. I2C_HandleTypeDef *phi2c;
  126. uint8_t addr_w,addr_r;
  127. uint8_t *rx_pbuf,*tx_pbuf;
  128. uint16_t pbuf_counter;//установочные
  129. volatile uint8_t *rx_pbuf_cur,*tx_pbuf_cur;//текущие
  130. uint16_t pbuf_counter_cur;
  131. uint8_t rx_last_byte;
  132. volatile void (*pfunc)(void);
  133. void (*perrfunc)(void);
  134. void (*pfunc_on_error)(void);
  135. void (*pfunc_on_i2c_restart)(void);
  136. uint8_t err_ovrflow;
  137. volatile uint8_t insint;
  138. volatile uint32_t last_hwi_process_tick;
  139. uint32_t last_hal_err;
  140. HAL_I2C_StateTypeDef last_hal_state;
  141. uint8_t is_i2c_restarting;
  142. }ad0x0_i2c_desc_s;
  143. #endif