one_wire.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837
  1. /**
  2. * @file module_one_wire.c
  3. * @author Juraj Dudak
  4. * @date 16 January, 2015
  5. * @version 1.0
  6. *
  7. * @brief Implementacia funkcii pre 1-Wire zbernicu.
  8. *
  9. */
  10. //----------------------------------------------------------------------
  11. // Include & define
  12. //----------------------------------------------------------------------
  13. #include "one_wire.h"
  14. #define TRUE 0x01 // konstanty v kniznici 1-wire
  15. #define FALSE 0x00
  16. /** @addtogroup Firmware
  17. * @{
  18. */
  19. /** @addtogroup Implementácia_MultiSlave
  20. * @{
  21. */
  22. /** @defgroup OneWire_modul
  23. * @brief Implementácia komunikácie na zbernici 1-wire
  24. * @{
  25. */
  26. //----------------------------------------------------------------------
  27. // Lokalne premenne
  28. //----------------------------------------------------------------------
  29. /**
  30. * SW driver pre zbernicu 1-wire. Obsahuje dátový buffer, časové konštanty,
  31. * príznaky komunikácie a stavové premenné.
  32. */
  33. oneWireDriver_typeDef oneWireDrv;
  34. /** Definícia pinov pre ovládanie zbernice 1-wire*/
  35. oneWirePin_typeDef oneWirePins;
  36. /** globalna hodnota CRC */
  37. uint8_t crc8_ow;
  38. /** Tabuľka pre výpočet súčtu CRC8 */
  39. static const uint8_t dscrc_table[] = {
  40. 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
  41. 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
  42. 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
  43. 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
  44. 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
  45. 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
  46. 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
  47. 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
  48. 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
  49. 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
  50. 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
  51. 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
  52. 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
  53. 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
  54. 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
  55. 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53
  56. };
  57. //--------------------------------------------------------------------------
  58. // Implementacia low-level funkcii pre STM32
  59. //--------------------------------------------------------------------------
  60. #ifdef OW_MODULE_USE_TIMER
  61. void delay_us(uint16_t time) {
  62. time -= 3;
  63. oneWireDrv.owTimer->Instance->CNT=0;
  64. HAL_TIM_Base_Start(oneWireDrv.owTimer);
  65. while(oneWireDrv.owTimer->Instance->CNT < time);
  66. HAL_TIM_Base_Stop(oneWireDrv.owTimer);
  67. }
  68. void delay_us_long(uint16_t time){
  69. delay_us(time);
  70. }
  71. #endif
  72. /**
  73. * Zruší stav STRONG na zbernici 1-wire.
  74. */
  75. inline void ow_ClearStrong(){
  76. // OW_STRONG_CLEAR;
  77. }
  78. /**
  79. * Zbenicu 1-wire nastaví do stavu STRONG (silná hodtnota "1").
  80. */
  81. inline void ow_SetStrong(void) {
  82. // OW_STRONG_SET;
  83. }
  84. /**
  85. * Zbenicu 1-wire nastaví do stavu, kedy je možné zo zbenice čítať hodnoty.
  86. */
  87. static inline void ow_SetReadState(void) {
  88. // OW_UP_CLEAR;
  89. // OW_DOWN_CLEAR;
  90. }
  91. /**
  92. * Nastavi pin pre 1W ako vstupný.
  93. * Aktuálne je podporovaná rýchla zmena len pre STM32F0x
  94. * Opis registrov: http://www.hertaville.com/stm32f0-gpio-tutorial-part-1.html
  95. */
  96. __attribute__((optimize("O1"))) static void setPinIn(){
  97. #if OW_USE_2_WIRE == 0
  98. #ifdef STM32F0
  99. #define PIN_IN_USE_IN
  100. uint32_t temp = oneWirePins.port->MODER;
  101. CLEAR_BIT(temp, GPIO_MODER_MODER0 << (oneWirePins.pin_ow_moder_bit));
  102. SET_BIT(temp, (0) << (oneWirePins.pin_ow_moder_bit));
  103. oneWirePins.port->MODER = temp;
  104. #endif // STM32F0
  105. #ifdef STM32L0
  106. #define PIN_IN_USE_IN
  107. uint32_t temp = oneWirePins.port->MODER;
  108. CLEAR_BIT(temp, GPIO_MODER_MODE0 << (oneWirePins.pin_ow_moder_bit));
  109. SET_BIT(temp, (0) << (oneWirePins.pin_ow_moder_bit));
  110. oneWirePins.port->MODER = temp;
  111. #endif // STM32L0
  112. #ifndef PIN_IN_USE_IN
  113. #error MUSITE POUZIT VERIZU 1-WIRE PRE 2 PINY PROCESORA
  114. //GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
  115. //HAL_GPIO_Init(oneWirePins.port, &GPIO_InitStructure);
  116. #endif // PIN_IN_USE_IN
  117. #endif // OW_USE_2_WIRE
  118. }
  119. /**
  120. * Nastavi pin pre 1W ako výstupný.
  121. * Aktuálne je podporovaná rýchla zmena len pre STM32F0x
  122. * Opis registrov: http://www.hertaville.com/stm32f0-gpio-tutorial-part-1.html
  123. */
  124. __attribute__((optimize("O1"))) static void setPinOut() {
  125. #if OW_USE_2_WIRE == 0
  126. #ifdef STM32F0
  127. #define PIN_IN_USE_IN
  128. uint32_t temp = oneWirePins.port->MODER;
  129. CLEAR_BIT(temp, GPIO_MODER_MODER0 << (oneWirePins.pin_ow_moder_bit));
  130. SET_BIT(temp, (1) << (oneWirePins.pin_ow_moder_bit));
  131. oneWirePins.port->MODER = temp;
  132. #endif // STM32F0
  133. #ifdef STM32L0
  134. #define PIN_IN_USE_IN
  135. uint32_t temp = oneWirePins.port->MODER;
  136. CLEAR_BIT(temp, GPIO_MODER_MODE0 << (oneWirePins.pin_ow_moder_bit));
  137. SET_BIT(temp, (1) << (oneWirePins.pin_ow_moder_bit));
  138. oneWirePins.port->MODER = temp;
  139. #endif // STM32L0
  140. #ifndef PIN_IN_USE_IN
  141. //GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  142. //HAL_GPIO_Init(oneWirePins.port, &GPIO_InitStructure);
  143. #error MUSITE POUZIT VERIZU 1-WIRE PRE 2 PINY PROCESORA
  144. #endif // STM32F0
  145. #endif // OW_USE_2_WIRE
  146. }
  147. //----------------------------------------------------------------------
  148. // Implementacia high-level funkcii podla Maxim, AN187
  149. //----------------------------------------------------------------------
  150. /**
  151. * @brief Inicializacia drivera zbernice 1-wire
  152. * Driver podporuje komunikáciu na 1-wire zbenici v implementácii 2 pinov (1xvstup, 1xvystup pin),
  153. * alebo 1 pinu (pin je podľa potreby zmenený). V aktuálnej verzii nie je podpora boostera zbernice.
  154. * Toto nastavenie je dané v súbore module_one_wire.h konštantou OW_USE_2_WIRE
  155. * - Nastavia sa časové konštanty na preddefinované hodnoty.
  156. * - Nastavia sa piny pre zbernicu One-wire
  157. *
  158. * @param timer časovač použirý an generovanie:
  159. * - blokujúcej pauzy v ráde us
  160. * @param GPIOx port pre piny
  161. * @param GPIO_Pin pin pre zápis na zbernicu (defined OW_USE_2_WIRE), alebo zápis/čítanie (NOT defined OW_USE_2_WIRE)
  162. * @param GPIO_Pin_in pin pre čítanie na zbernicu (defined OW_USE_2_WIRE)
  163. * @return none
  164. */
  165. #ifdef OW_MODULE_USE_TIMER
  166. void oneWire_init(TIM_HandleTypeDef *timer, GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) {
  167. oneWireDrv.owTimer = timer;
  168. #else
  169. #if OW_USE_2_WIRE == 1
  170. void oneWire_init(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, uint16_t GPIO_Pin_in ) {
  171. #else
  172. void oneWire_init(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin ) {
  173. #endif
  174. #endif
  175. oneWireDrv.one_wire_timing_settings = OW_SETTING_NORMAL;
  176. oneWirePins.port = GPIOx;
  177. oneWirePins.pin_ow = GPIO_Pin;
  178. uint16_t tmp = oneWirePins.pin_ow;
  179. oneWirePins.pin_ow_moder_bit = 0;
  180. while(tmp){
  181. oneWirePins.pin_ow_moder_bit++;
  182. tmp>>=1;
  183. }
  184. oneWirePins.pin_ow_moder_bit--;
  185. oneWirePins.pin_ow_moder_bit*=2;
  186. #if OW_USE_2_WIRE == 1
  187. oneWirePins.pin_ow_in = GPIO_Pin_in;
  188. #endif // OW_USE_2_WIRE
  189. setPinOut();
  190. OW_SET_HI;
  191. *(oneWireDrv.ROM_NO) = (uint32_t)0;
  192. *(oneWireDrv.ROM_NO+4) = (uint32_t)0;
  193. // delay_us_long(120);
  194. }
  195. /**
  196. * Vráti pointer na ROM_NO.
  197. * @retval pointer na ROM_NO
  198. */
  199. uint8_t *oneWire_getROM() {
  200. return oneWireDrv.ROM_NO;
  201. }
  202. /**
  203. * @brief Find the 'first' devices on the 1-Wire bus
  204. * @param none
  205. * @retval TRUE - device found, ROM number in ROM_NO buffer
  206. * FALSE - no device present
  207. */
  208. uint8_t owFirst() {
  209. // reset the search state
  210. oneWireDrv.LastDiscrepancy = 0;
  211. oneWireDrv.LastDeviceFlag = FALSE;
  212. oneWireDrv.LastFamilyDiscrepancy = 0;
  213. return owSearch();
  214. }
  215. /**
  216. * @brief Find the 'next' devices on the 1-Wire bus
  217. * @param none
  218. * @retval : TRUE - device found, ROM number in ROM_NO buffer
  219. * FALSE : device not found, end of search
  220. */
  221. uint8_t owNext() {
  222. return owSearch();
  223. }
  224. void owSelect_ROM(const uint8_t rom[8]) {
  225. uint8_t i;
  226. owWriteByte(OW_CMD_MATCH_ROM, OW_STRONG_OFF); // Choose ROM
  227. for (i = 0; i < 8; i++) {
  228. owWriteByte(rom[i], OW_STRONG_OFF);
  229. }
  230. }
  231. void owSelect() {
  232. OW_DIS_INTERRUPTS;
  233. uint8_t i;
  234. if (owReset()) {
  235. owWriteByte(OW_CMD_MATCH_ROM, OW_STRONG_OFF);
  236. for(i=0; i<8; i++) {
  237. owWriteByte(oneWireDrv.ROM_NO[i], OW_STRONG_OFF);
  238. }
  239. }
  240. OW_ENA_INTERRUPTS;
  241. }
  242. /**
  243. * Odovzdá ako odkaz obsah ROM.
  244. * @param mem_page pole bytov[8], kre bude uložený obsah ROM_NO
  245. */
  246. void owGetROM(uint8_t *mem_page) {
  247. *mem_page = *oneWireDrv.ROM_NO;
  248. *(mem_page +4)= *(oneWireDrv.ROM_NO+4);
  249. }
  250. /**
  251. * @brief Perform the 1-Wire Search Algorithm on the 1-Wire bus
  252. * using the existing search state.
  253. * @param none
  254. * @retval : TRUE - device found, ROM number in ROM_NO buffer
  255. * FALSE : device not found, end of search
  256. */
  257. uint8_t owSearch() {
  258. OW_DIS_INTERRUPTS;
  259. uint32_t id_bit_number;
  260. uint32_t last_zero, rom_byte_number, search_result;
  261. uint32_t id_bit, cmp_id_bit;
  262. uint8_t rom_byte_mask, search_direction;
  263. // initialize for search
  264. id_bit_number = 1;
  265. last_zero = 0;
  266. rom_byte_number = 0;
  267. rom_byte_mask = 1;
  268. search_result = 0;
  269. crc8_ow = 0;
  270. // if the last call was not the last one
  271. if (oneWireDrv.LastDeviceFlag == FALSE) {
  272. // 1-Wire reset
  273. if (!owReset()) {
  274. // reset the search
  275. oneWireDrv.LastDiscrepancy = 0;
  276. oneWireDrv.LastDeviceFlag = FALSE;
  277. oneWireDrv.LastFamilyDiscrepancy = 0;
  278. OW_ENA_INTERRUPTS;
  279. return FALSE;
  280. }
  281. // issue the search command
  282. owWriteByte(OW_CMD_SEARCH_ROM, OW_STRONG_OFF);
  283. // loop to do the search
  284. do {
  285. // read a bit and its complement
  286. id_bit = owReadBit();
  287. cmp_id_bit = owReadBit();
  288. // check for no devices on 1-wire
  289. if ((id_bit == 1) && (cmp_id_bit == 1)) {
  290. break;
  291. } else {
  292. // all devices coupled have 0 or 1
  293. if (id_bit != cmp_id_bit) {
  294. search_direction = id_bit; // bit write value for search
  295. } else {
  296. // if this discrepancy if before the Last Discrepancy
  297. // on a previous next then pick the same as last time
  298. if (id_bit_number < oneWireDrv.LastDiscrepancy)
  299. search_direction = ((oneWireDrv.ROM_NO[rom_byte_number] & rom_byte_mask) > 0);
  300. else
  301. // if equal to last pick 1, if not then pick 0
  302. search_direction = (id_bit_number == oneWireDrv.LastDiscrepancy);
  303. // if 0 was picked then record its position in LastZero
  304. if (search_direction == 0) {
  305. last_zero = id_bit_number;
  306. // check for Last discrepancy in family
  307. if (last_zero < 9)
  308. oneWireDrv.LastFamilyDiscrepancy = last_zero;
  309. }
  310. }
  311. // set or clear the bit in the ROM byte rom_byte_number
  312. // with mask rom_byte_mask
  313. if (search_direction == 1)
  314. oneWireDrv.ROM_NO[rom_byte_number] |= rom_byte_mask;
  315. else
  316. oneWireDrv.ROM_NO[rom_byte_number] &= ~rom_byte_mask;
  317. // serial number search direction write bit
  318. #ifdef OW_USE_TICKS
  319. owWriteBit(&search_direction);
  320. #else
  321. owWriteBit(search_direction);
  322. #endif
  323. // increment the byte counter id_bit_number
  324. // and shift the mask rom_byte_mask
  325. id_bit_number++;
  326. rom_byte_mask <<= 1;
  327. // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
  328. if (rom_byte_mask == 0) {
  329. owCrc8(oneWireDrv.ROM_NO[rom_byte_number]); // accumulate the CRC
  330. rom_byte_number++;
  331. rom_byte_mask = 1;
  332. }
  333. }
  334. } while (rom_byte_number < 8); // loop until through all ROM bytes 0-7
  335. // if the search was successful then
  336. if (!((id_bit_number < 65) || (crc8_ow != 0))) {
  337. // search successful so set LastDiscrepancy,LastDeviceFlag,search_result
  338. oneWireDrv.LastDiscrepancy = last_zero;
  339. // check for last device
  340. if (oneWireDrv.LastDiscrepancy == 0)
  341. oneWireDrv.LastDeviceFlag = TRUE;
  342. search_result = TRUE;
  343. }
  344. }
  345. // if no device found then reset counters so next 'search' will be like a first
  346. if (!search_result || !oneWireDrv.ROM_NO[0]) {
  347. oneWireDrv.LastDiscrepancy = 0;
  348. oneWireDrv.LastDeviceFlag = FALSE;
  349. oneWireDrv.LastFamilyDiscrepancy = 0;
  350. search_result = FALSE;
  351. }
  352. if(search_result){
  353. // owSelect();
  354. }
  355. OW_ENA_INTERRUPTS;
  356. return search_result;
  357. }
  358. /**
  359. * @brief Verify the device with the ROM number in ROM_NO buffer is present.
  360. * @param none
  361. * @return : TRUE : device verified present
  362. * FALSE : device not present
  363. */
  364. uint8_t owVerify() {
  365. OW_DIS_INTERRUPTS;
  366. unsigned char rom_backup[8];
  367. int i, rslt, ld_backup, ldf_backup, lfd_backup;
  368. // keep a backup copy of the current state
  369. for (i = 0; i < 8; i++)
  370. rom_backup[i] = oneWireDrv.ROM_NO[i];
  371. ld_backup = oneWireDrv.LastDiscrepancy;
  372. ldf_backup = oneWireDrv.LastDeviceFlag;
  373. lfd_backup = oneWireDrv.LastFamilyDiscrepancy;
  374. // set search to find the same device
  375. oneWireDrv.LastDiscrepancy = 64;
  376. oneWireDrv.LastDeviceFlag = FALSE;
  377. if (owSearch()) {
  378. // check if same device found
  379. rslt = TRUE;
  380. for (i = 0; i < 8; i++) {
  381. if (rom_backup[i] != oneWireDrv.ROM_NO[i]) {
  382. rslt = FALSE;
  383. break;
  384. }
  385. }
  386. } else
  387. rslt = FALSE;
  388. // restore the search state
  389. for (i = 0; i < 8; i++){
  390. oneWireDrv.ROM_NO[i] = rom_backup[i];
  391. }
  392. oneWireDrv.LastDiscrepancy = ld_backup;
  393. oneWireDrv.LastDeviceFlag = ldf_backup;
  394. oneWireDrv.LastFamilyDiscrepancy = lfd_backup;
  395. if(rslt == TRUE) {
  396. owSelect();
  397. }
  398. OW_ENA_INTERRUPTS;
  399. // return the result of the verify
  400. return rslt;
  401. }
  402. /**
  403. * @brief Setup the search to find the device type 'family_code' on the next call
  404. * to owNext() if it is present.
  405. * @param none
  406. * @retval : none
  407. */
  408. void owTargetSetup(uint8_t family_code) {
  409. // set the search state to find SearchFamily type devices
  410. oneWireDrv.ROM_NO[0] = family_code;
  411. oneWireDrv.ROM_NO[1] = 0;
  412. oneWireDrv.ROM_NO[2] = 0;
  413. oneWireDrv.ROM_NO[3] = 0;
  414. oneWireDrv.ROM_NO[4] = 0;
  415. oneWireDrv.ROM_NO[5] = 0;
  416. oneWireDrv.ROM_NO[6] = 0;
  417. oneWireDrv.ROM_NO[7] = 0;
  418. oneWireDrv.LastDiscrepancy = 64;
  419. oneWireDrv.LastFamilyDiscrepancy = 0;
  420. oneWireDrv.LastDeviceFlag = FALSE;
  421. }
  422. /**
  423. * @brief Setup the search to skip the current device type on the next call
  424. * to owNeOW_LOWxt().
  425. * @param none
  426. * @retval : none
  427. */
  428. void owFamilySkipSetup(void) {
  429. // set the Last discrepancy to last family discrepancy
  430. oneWireDrv.LastDiscrepancy = oneWireDrv.LastFamilyDiscrepancy;
  431. oneWireDrv.LastFamilyDiscrepancy = 0;
  432. // check for end of list
  433. if (oneWireDrv.LastDiscrepancy == 0)
  434. oneWireDrv.LastDeviceFlag = TRUE;
  435. }
  436. /**
  437. * @brief Setup new ROM number
  438. * @param array with new ROM number
  439. * @retval : none
  440. */
  441. void owSetRom(uint8_t *array) {
  442. *oneWireDrv.ROM_NO = *array;
  443. *(oneWireDrv.ROM_NO +4 )= *(array+4);
  444. }
  445. /**
  446. * @brief Calculate the CRC8 of the byte value provided with the
  447. * current global 'crc8' value.
  448. * @param byte value
  449. * @retval : current global crc8 value
  450. */
  451. uint8_t owCrc8(uint8_t value) {
  452. crc8_ow = dscrc_table[crc8_ow ^ value];
  453. return crc8_ow;
  454. }
  455. /**
  456. * @brief Reset 1-wire zbernice s detekciou pritomnosti zariadenia
  457. * @param none
  458. * @retval : TRUE - device present
  459. * FALSE - no device present
  460. */
  461. uint8_t __attribute__((optimize("O3"))) owReset(void) {
  462. uint8_t state;
  463. #ifdef OW_USE_TICKS
  464. OW_GPIO_PULSE(OW_RESET_MEASTER, 0, MCU_FREQUENCY, 1, oneWirePins.port, oneWirePins.pin_ow);
  465. OW_SET_HI;
  466. setPinIn();
  467. OW_DELAY_US(OW_RESET_PRESENCE, MCU_FREQUENCY, 1); //TODO set offset
  468. #if OW_USE_2_WIRE == 1
  469. state = (oneWirePins.port->IDR & oneWirePins.pin_ow_in ) != 0;
  470. #else
  471. state = (oneWirePins.port->IDR & oneWirePins.pin_ow ) != 0;
  472. #endif //OW_USE_2_WIRE
  473. //setPinOut();
  474. OW_DELAY_US(OW_RESET_DELAY, MCU_FREQUENCY, 40); //TODO set offset
  475. setPinOut(); //Toto som presunul až za oneskorenie, pretože to spôsobovalo nechcené pulzy
  476. return !state;
  477. #else
  478. OW_SET_LO;
  479. delay_us_long(OW_RESET_MEASTER/4);
  480. OW_SET_HI;
  481. setPinIn();
  482. delay_us(OW_RESET_PRESENCE);
  483. #if OW_USE_2_WIRE == 1
  484. state = (oneWirePins.port->IDR & oneWirePins.pin_ow_in ) != 0 ? 1:0;
  485. #else
  486. state = (oneWirePins.port->IDR & oneWirePins.pin_ow ) != 0 ? 1:0;
  487. #endif //OW_USE_2_WIRE
  488. setPinOut();
  489. delay_us_long(OW_RESET_DELAY/4);
  490. if(state == GPIO_PIN_SET)
  491. return FALSE;
  492. else
  493. return TRUE;
  494. #endif
  495. }
  496. /**
  497. * @brief Vyslanie 8-bitov na zbernicu 1-wire
  498. * @param byte_value 1W príkaz
  499. * @param strong príznak, či sa má po poslednom bite dať zbernica do stavu STRONG.
  500. * povolené hodnoty: @arg OW_STRONG_OFF - zbernica bude v stave RESISTIVE,
  501. * @arg OW_STRONG_ON zbernica bude v stave STRONG
  502. * @retval : none
  503. */
  504. #ifdef OW_USE_TICKS
  505. void __attribute__((optimize("O1"))) owWriteByte(uint8_t byte_value, uint8_t strong) {
  506. owWriteBit(&byte_value);
  507. owWriteBit(&byte_value);
  508. owWriteBit(&byte_value);
  509. owWriteBit(&byte_value);
  510. owWriteBit(&byte_value);
  511. owWriteBit(&byte_value);
  512. owWriteBit(&byte_value);
  513. //owWriteBit(&byte_value);
  514. #if USE_STRONG == 1
  515. if(strong == OW_STRONG_ON){
  516. owWriteBitStrong(byte_value>>7);
  517. }else{
  518. if(byte_value & 0x01){
  519. // zapis bit=1
  520. OW_GPIO_PULSE(OW_WRITE_ONE, 0, MCU_FREQUENCY, 1, oneWirePins.port, oneWirePins.pin_ow);
  521. OW_GPIO_PULSE(OW_WRITE_ONE_DELAY + OW_WRITE_DELAY, 1, MCU_FREQUENCY, 29, oneWirePins.port, oneWirePins.pin_ow);
  522. //Offset je nastavený na 19, pretože zohľadňuje volanie aj obsluhu funkcie
  523. }
  524. else{
  525. // zapis bit=0
  526. OW_GPIO_PULSE(OW_WRITE_ZERO, 0, MCU_FREQUENCY, 1, oneWirePins.port, oneWirePins.pin_ow);
  527. OW_GPIO_PULSE(OW_WRITE_DELAY, 1, MCU_FREQUENCY, 30, oneWirePins.port, oneWirePins.pin_ow);
  528. //Offset je nastavený na 21, pretože zohľadňuje volanie aj obsluhu funkcie
  529. }
  530. }
  531. #else
  532. if(byte_value & 0x01){
  533. // zapis bit=1
  534. OW_GPIO_PULSE(OW_WRITE_ONE, 0, MCU_FREQUENCY, 1, oneWirePins.port, oneWirePins.pin_ow);
  535. OW_GPIO_PULSE(OW_WRITE_ONE_DELAY + OW_WRITE_DELAY, 1, MCU_FREQUENCY, 29, oneWirePins.port, oneWirePins.pin_ow);
  536. //Offset je nastavený na 19, pretože zohľadňuje volanie aj obsluhu funkcie
  537. }
  538. else{
  539. // zapis bit=0
  540. OW_GPIO_PULSE(OW_WRITE_ZERO, 0, MCU_FREQUENCY, 1, oneWirePins.port, oneWirePins.pin_ow);
  541. OW_GPIO_PULSE(OW_WRITE_DELAY, 1, MCU_FREQUENCY, 30, oneWirePins.port, oneWirePins.pin_ow);
  542. //Offset je nastavený na 21, pretože zohľadňuje volanie aj obsluhu funkcie
  543. }
  544. #endif
  545. }
  546. #else
  547. void owWriteByte(uint8_t byte_value, uint8_t strong) {
  548. // HAL_SuspendTick();
  549. owWriteBit(byte_value);
  550. owWriteBit(byte_value>>1);
  551. owWriteBit(byte_value>>2);
  552. owWriteBit(byte_value>>3);
  553. owWriteBit(byte_value>>4);
  554. owWriteBit(byte_value>>5);
  555. owWriteBit(byte_value>>6);
  556. #if USE_STRONG == 1
  557. if(strong == OW_STRONG_ON){
  558. owWriteBitStrong(byte_value>>7);
  559. }else{
  560. owWriteBit(byte_value>>7);
  561. }
  562. #else
  563. owWriteBit(byte_value>>7);
  564. // HAL_ResumeTick();
  565. #endif
  566. }
  567. #endif
  568. /**
  569. * Na zbernicu 1-wire zapíše 1 bit. Po zápise nastaví zbernicu
  570. * do stavu STRONG.
  571. * @param bit_value - bit, ktorý sa bude zapisovať.
  572. */
  573. #ifdef OW_USE_TICKS
  574. void owWriteBitStrong(uint8_t bit_value) {
  575. if(bit_value & 0x01){
  576. // zapis bit=1
  577. OW_GPIO_PULSE(OW_WRITE_ONE, 1, MCU_FREQUENCY, 15, oneWirePins.port, oneWirePins.pin_ow);
  578. //TODO offset je stanovený od oka v tomto prípade
  579. }
  580. else{
  581. // zapis bit=0
  582. OW_GPIO_PULSE(OW_WRITE_ZERO, 0, MCU_FREQUENCY, 17, oneWirePins.port, oneWirePins.pin_ow);
  583. //TODO offset je stanovený od oka v tomto prípade
  584. }
  585. }
  586. #else
  587. void owWriteBitStrong(uint8_t bit_value) {
  588. OW_SET_LO;
  589. switch(bit_value & 0x01) {
  590. case 0x00:
  591. // zapis bit=0
  592. delay_us(OW_WRITE_ZERO);
  593. break;
  594. case 0x01:
  595. // zapis bit=1
  596. delay_us(OW_WRITE_ONE);
  597. break;
  598. }
  599. ow_SetReadState();
  600. // OW_STRONG_SET;
  601. }
  602. #endif
  603. /**
  604. * @brief Vyslanie 1 bitu na zbernicu 1-wire
  605. * @param data, akceptovany je LSB
  606. * @retval : none
  607. */
  608. #ifdef OW_USE_TICKS
  609. void __attribute__((optimize("Ofast"))) owWriteBit(uint8_t* bit_value) {
  610. if(*bit_value & 0x01){
  611. // zapis bit=1
  612. OW_GPIO_PULSE(OW_WRITE_ONE, 0, MCU_FREQUENCY, 1, oneWirePins.port, oneWirePins.pin_ow);
  613. OW_GPIO_PULSE(OW_WRITE_ONE_DELAY + OW_WRITE_DELAY, 1, MCU_FREQUENCY, 19, oneWirePins.port, oneWirePins.pin_ow);
  614. //Offset je nastavený na 19, pretože zohľadňuje volanie aj obsluhu funkcie
  615. }
  616. else{
  617. // zapis bit=0
  618. OW_GPIO_PULSE(OW_WRITE_ZERO, 0, MCU_FREQUENCY, 1, oneWirePins.port, oneWirePins.pin_ow);
  619. OW_GPIO_PULSE(OW_WRITE_DELAY, 1, MCU_FREQUENCY, 21, oneWirePins.port, oneWirePins.pin_ow);
  620. //Offset je nastavený na 21, pretože zohľadňuje volanie aj obsluhu funkcie
  621. }
  622. *bit_value >>= 1;
  623. }
  624. #else
  625. void owWriteBit(uint8_t bit_value) {
  626. OW_SET_LO;
  627. //uint32_t prim = __get_PRIMASK();
  628. //__disable_irq();
  629. if(bit_value & 0x01) {
  630. // zapis bit=1
  631. delay_us(OW_WRITE_ONE);
  632. OW_SET_HI;
  633. delay_us(OW_WRITE_ONE_DELAY);
  634. }else{
  635. // zapis bit=0
  636. delay_us(OW_WRITE_ZERO);
  637. OW_SET_HI;
  638. }
  639. delay_us(OW_WRITE_DELAY);
  640. // if (!prim) {
  641. // __enable_irq();
  642. //}
  643. }
  644. #endif
  645. /**
  646. * @brief Nacitanie 1 bitu zo zbernicu 1-wire
  647. * @param none
  648. * @retval : nacitana hodnota 0/1
  649. */
  650. uint8_t owReadBit(void) {
  651. #ifdef OW_USE_TICKS
  652. //uint32_t prim = __get_PRIMASK();
  653. //__disable_irq();
  654. //HAL_SuspendTick();
  655. uint8_t state=0x00;
  656. OW_GPIO_PULSE(OW_READ_PULSE, 0, MCU_FREQUENCY, 7, oneWirePins.port, oneWirePins.pin_ow); //TODO set offset
  657. //OW_SET_HI;
  658. setPinIn();
  659. OW_SET_HI; //Toto som presunul až za oneskorenie, pretože to spôsobovalo nechcené pulzy
  660. OW_DELAY_US(OW_READ_PRESENCE, MCU_FREQUENCY, 1); //TODO set offset
  661. #if OW_USE_2_WIRE == 1
  662. state = (oneWirePins.port->IDR & oneWirePins.pin_ow_in ) != 0;
  663. #else
  664. state = (oneWirePins.port->IDR & oneWirePins.pin_ow ) != 0;
  665. #endif //OW_USE_2_WIRE
  666. //setPinOut();
  667. //OW_SET_HI;
  668. OW_DELAY_US(OW_READ_DELAY, MCU_FREQUENCY, 1); //TODO set offset
  669. setPinOut(); //Toto som presunul až za oneskorenie, pretože to spôsobovalo nechcené pulzy
  670. OW_DELAY_US(OW_BOOSTER, MCU_FREQUENCY, 36); //TODO set offset
  671. /*
  672. if (!prim) {
  673. __enable_irq();
  674. }
  675. */
  676. // HAL_ResumeTick();
  677. return state;
  678. #else
  679. //uint32_t prim = __get_PRIMASK();
  680. //__disable_irq();
  681. //HAL_SuspendTick();
  682. uint8_t state=0x00;
  683. OW_SET_LO;
  684. delay_us(OW_READ_PULSE);
  685. OW_SET_HI;
  686. setPinIn();
  687. delay_us(OW_READ_PRESENCE);
  688. #if OW_USE_2_WIRE == 1
  689. state = (oneWirePins.port->IDR & oneWirePins.pin_ow_in ) != 0 ? 1:0;
  690. #else
  691. state = (oneWirePins.port->IDR & oneWirePins.pin_ow ) != 0 ? 1:0;
  692. #endif //OW_USE_2_WIRE
  693. setPinOut();
  694. OW_SET_HI;
  695. delay_us(OW_READ_DELAY);
  696. delay_us(OW_BOOSTER);
  697. /*
  698. if (!prim) {
  699. __enable_irq();
  700. }
  701. */
  702. // HAL_ResumeTick();
  703. return state;
  704. #endif
  705. }
  706. /**
  707. * @brief Nacitanie 1 byte zo zbernice 1-wire
  708. * @param none
  709. * @retval nacitana hodnota 8-bit hodnota
  710. */
  711. uint8_t owReadByte(void) {
  712. uint8_t value;
  713. value = (owReadBit()); // LSB first
  714. value |= (owReadBit()<<1);
  715. value |= (owReadBit()<<2);
  716. value |= (owReadBit()<<3);
  717. value |= (owReadBit()<<4);
  718. value |= (owReadBit()<<5);
  719. value |= (owReadBit()<<6);
  720. value |= (owReadBit()<<7);
  721. return value;
  722. }
  723. /**
  724. * @}
  725. */
  726. /**
  727. * @}
  728. */
  729. /**
  730. * @}
  731. */