From 3931f1da9c28b803b19d09d51fe69fd4e403fec0 Mon Sep 17 00:00:00 2001 From: eddyem Date: Tue, 21 Jul 2015 14:42:03 +0300 Subject: [PATCH] 1-wire works! --- 1_wire/onewire.bin | Bin 9816 -> 9832 bytes 1_wire/onewire.c | 76 +++++++++++++++++++++++++++++--------------- 1_wire/onewire.h | 12 ++++--- 1_wire/user_proto.c | 5 ++- 4 files changed, 63 insertions(+), 30 deletions(-) diff --git a/1_wire/onewire.bin b/1_wire/onewire.bin index 2ce1fcacb98beaff7e86aac771b6698d04e21187..b05e43bb4c7038bf83707fe4bf3dffeb4a620743 100755 GIT binary patch delta 3404 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 delta 3398 zcma)83v5%@89wLQj;~*_otVUNOmh4p0XxJ=pbIMPToWAQ8xtCc+M+&gAZC|M1C!7x zpiXvKr&82*z-_mzV;a@ks;jDrB(u7e8Pj&HRta^<7+OlT#cZueORL_{FguCuyZdGqZO5gp@^ZOs?|IfYCU6Wl2v<(pzL97CRzXJ4?hpwTZ!&HtKZ{35x!tv$)3C%6* z6N^e)w6{#$V$4k<)vY97yY}Xuua^(}|BAn!*9Ct<~t^xi2Veh zaUpgU;10kJzyZLc08@%zUVo%y$zvmGoSV>+^t35}q(kCo_%&U9N?E78+(eLM6{nc> ziDD6N{BTtE-I!2i{X}_YY3=p2@{B3n^s&^rfm4TUL**fR$o4xqw@+4uP!@SyL)g1> zqLpKuws?02#U)Ol6uYO!VY4CN7D<@x=(I~L@&dEEo#J6$0#kXO? zklp5Mf|;ERz1PPzLYLf&$*h3Ml(cHwhu> z@giQY%1-6o$*H{c_*9;pPNae_et;lC(&Gpr(g;`wKzbZFqd??_g2q%CqQrZPBqZm; zi%NDE5iz9^il-{N9&uEJk(7|lQO2ooff@&rreLiCq+Q0&#t`G^o(&8l=`Y2`5VXK4 zle{?Z?A|t;+?}3|2axnm8kumwYGMLZIh#TROO{gbdV?QJYza%YQhJ&VV5#n0)5l-j zg&hu1dcB1F)(j?3<&}tW*kR;jaZcH?^3IZSrWKtZMbccsIARQ=tT8O-+Dg<7N$gau zPEhBbfrR-v;3WVCrz<#9s#d7jf}Hr;CTxl9*1D74vI$+p5U%9q+&43@As3O)7oq49D0v(?hF%3*+m_eimBl2tDehbi^%8!`1^QcyMbJW;nO@ve) zT{hVW#GIAa!$uttx2N5C(>CmX!}jjziQwlKl`tpgghk@FfVlmC5T8dhOWz(bBG4u`QnCrwZEUm>k}I9aHd~MC_ft=&U`r9 zyZMs|HjgiiYH)1b?ClQELK4s~03eGW1ScjZD zC!0AU)C?h~sY{*x{Qh_De=TU4z-_EIKcUYa3o0%vuf3^4u9>T94!6|ARUEpZ?f~K)5Vl^xKS7bgVM=L3tc$?0o+xzB@^K`sDRs{hkgH1FQWBEp zVi7sCAzf&xS6&jIRIhFLaZ%3&uRqsg@6TS)%r&rQ59S(bHpqdBIabbB%agQH{4W0$*EUVIe1IfP*1@K8kLn?JY^G3s#jmKFRR;K zu!&}EWwZ*6unARLof3xQz|x7Es-x=c`n(0o@BV@rynbx~uWJ)d1!q4nhRd?Gf>o`) zRK~GReb@$$#{+WirL%GIZf)fXnv>K9dJ44au0Ygp6ZdLc5<_R>ohU<3iXLGU=He+& zmuHA+Dj!!g`NwfnV8RKy`WG0ND^9qT@g?TcxjL?P2zgt^Yolw1yrGjLwOa$%JiA`vaHzPX8WU|+bPf%jm6 zjj&Lz^wR#ag_Jc+tphoyTM7gVUmjXRa6dw<)!YS0V>#z8bO4W|pycelDg9**8obJs ziNg*gGR}ZY8A4*GVZG*V1N<7nkL07`4-H-wfp45gOc{Qria|>+_LjHRoC2){4`M$B zpY$N1vdPOZi^b>5x0~(Ias%iH-Lpqj8Jjh9gwE^{?=W%?JTx!oVsb^aVrwJV_!#tF zS!fQKqR8DYz{NbjTBsQ@Kn%~$(fK3uZ9;AB*p0&p=A!b(;e(27oAAqEdj`4X+_#G# zT}7E!f%yzz$=Z*M^<}j8s$xuQ`ny8&>^*IJ=Ha&6YsKB<5S`x zTeIe&YQ+8&@Wj}N?E{86r4*lD`48qdim`#ZotT;Ri0{?!p`*8vT^|1`xI@5Y`k(WH z5)s zhV~8~9Mq!jd&ripTXt;j(4wB+t>oZ9-@ZZELH6$*TxOVIFggOAC&V7lI;P|nk9yq7P6(Sg;&DBQT+mtpXa+3P{73w? z2C=_d9>*a6R0V4o1gxk`Q-|1;4SvKyz728?@M1lT)gpEV@TeWJ_lYg5Dj|t53K$d! Vy-96j(H1b~K|l>= 1; } - INT(tum2buff_ctr); - DBG(" bytes in send buffer\n"); +// INT(tum2buff_ctr); +// DBG(" bytes in send buffer\n"); return 1; } @@ -82,8 +83,8 @@ uint8_t OW_add_read_seq(uint8_t Nbytes){ } tim2_buff[tum2buff_ctr++] = BIT_READ_P; } - INT(tum2buff_ctr); - DBG(" bytes in send buffer\n"); +// INT(tum2buff_ctr); +// DBG(" bytes in send buffer\n"); return 1; } @@ -101,14 +102,16 @@ void read_from_OWbuf(uint8_t start_idx, uint8_t N, uint8_t *outbuf){ byte = 0; for(j = 0; j < 8; j++){ byte >>= 1; - INT(tim2_inbuff[i]); - DBG(" "); +// INT(tim2_inbuff[i]); +// DBG(" "); if(tim2_inbuff[i++] < ONE_ZERO_BARRIER) byte |= 0x80; } *outbuf++ = byte; - DBG("readed \n"); +// DBG("readed \n"); } +// print_hex(outbuf-N, N); +// DBG(" readed\n"); } // there's a mistake in opencm3, so redefine this if needed (TIM_CCMR2_CC3S_IN_TI1 -> TIM_CCMR2_CC3S_IN_TI4) #ifndef TIM_CCMR2_CC3S_IN_TI4 @@ -124,7 +127,6 @@ void init_ow_dmatimer(){ // tim2_ch4 - PA3, no remap // 36MHz of APB1 timer_set_mode(TIM2, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP); // 72MHz div 72 = 1MHz - // TODO: WHY 71 if freq = 36MHz? TIM2_PSC = 71; // prescaler is (div - 1) TIM2_CR1 = TIM_CR1_ARPE; // bufferize ARR/CCR TIM2_ARR = RESET_LEN; @@ -153,13 +155,14 @@ void run_dmatimer(){ TIM2_CR1 = 0; adc_disable_dma(ADC1); // turn off DMA & ADC adc_off(ADC1); + // TIM2_CH4 - DMA1, channel 7 DMA1_IFCR = DMA_ISR_TEIF7|DMA_ISR_HTIF7|DMA_ISR_TCIF7|DMA_ISR_GIF7 | DMA_ISR_TEIF1|DMA_ISR_HTIF1|DMA_ISR_TCIF1|DMA_ISR_GIF1; // clear flags DMA1_CCR7 &= ~DMA_CCR_EN; // disable (what if it's enabled?) to set address DMA1_CPAR7 = (uint32_t) &(TIM_CCR4(TIM2)); // dma_set_peripheral_address(DMA1, DMA_CHANNEL7, (uint32_t) &(TIM_CCR4(TIM2))); DMA1_CMAR7 = (uint32_t) &tim2_buff[1]; // dma_set_memory_address(DMA1, DMA_CHANNEL7, (uint32_t)tim2_buff); DMA1_CNDTR7 = tum2buff_ctr-1;//dma_set_number_of_data(DMA1, DMA_CHANNEL7, tum2buff_ctr); - // TIM2_CH4 - DMA1, channel 7 + // TIM2_CH3 - DMA1, channel 1 dma_channel_reset(DMA1, DMA_CHANNEL1); DMA1_CCR1 = DMA_CCR_MINC | DMA_CCR_PSIZE_16BIT | DMA_CCR_MSIZE_16BIT | DMA_CCR_TEIE | DMA_CCR_TCIE | DMA_CCR_PL_HIGH; @@ -184,9 +187,9 @@ void run_dmatimer(){ #ifdef EBUG gpio_clear(GPIOC, GPIO10); #endif - DBG("RUN transfer of "); +/* DBG("RUN transfer of "); INT(tum2buff_ctr); - DBG(" bits\n"); + DBG(" bits\n");*/ } uint16_t rstat = 0, lastcc3 = 3; @@ -202,7 +205,7 @@ void ow_reset(){ TIM2_EGR = TIM_EGR_UG; // update values of ARR & CCR4 //TIM2_CCMR2 = TIM_CCMR2_OC4M_PWM1 | TIM_CCMR2_OC4PE | TIM_CCMR2_CC3S_IN_TI4; //TIM2_CCER = TIM_CCER_CC4P | TIM_CCER_CC4E | TIM_CCER_CC3E; - DBG("OW RESET in process"); +// DBG("OW RESET in process"); TIM2_DIER = TIM_DIER_CC3IE; #ifdef EBUG gpio_clear(GPIOC, GPIO10); @@ -223,7 +226,7 @@ void tim2_isr(){ nvic_disable_irq(NVIC_TIM2_IRQ); ow_done = 1; rstat = lastcc3; - DBG(" ... done!\n"); +// DBG(" ... done!\n"); } if(TIM2_SR & TIM_SR_CC3IF){ // we need this interrupt to store CCR3 value lastcc3 = TIM2_CCR3; @@ -237,7 +240,7 @@ void tim2_isr(){ * DMA interrupt in 1-wire mode */ void dma1_channel1_isr(){ - int i; + // int i; if(DMA1_ISR & DMA_ISR_TCIF1){ #ifdef EBUG gpio_set(GPIOC, GPIO10); @@ -247,11 +250,11 @@ void dma1_channel1_isr(){ DMA1_CCR1 &= ~DMA_CCR_EN; // disable DMA1 channel 1 nvic_disable_irq(NVIC_DMA1_CHANNEL1_IRQ); ow_done = 1; - for(i = 0; i < tum2buff_ctr; i++){ +/* for(i = 0; i < tum2buff_ctr; i++){ print_int(tim2_inbuff[i]); P(" "); } - P("\n"); + P("\n");*/ }else if(DMA1_ISR & DMA_ISR_TEIF1){ DMA1_IFCR = DMA_IFCR_CTEIF1; DBG("DMA in transfer error\n"); @@ -287,7 +290,7 @@ void OW_process(){ return; break; case OW_RESET_STATE: - DBG("OW reset\n"); + //DBG("OW reset\n"); OW_State = OW_SEND_STATE; ow_was_reseting = 1; ow_reset(); @@ -307,18 +310,16 @@ void OW_process(){ ow_was_reseting = 0; OW_State = OW_READ_STATE; run_dmatimer(); // turn on data transfer - DBG("OW send\n"); + //DBG("OW send\n"); break; case OW_READ_STATE: if(!ow_done) return; // data isn't ready OW_State = OW_OFF_STATE; // adc_dma_on(); // return DMA1_1 to ADC at end of data transmitting - if(ow_process_resdata){ + if(ow_process_resdata) ow_process_resdata(); - ow_process_resdata = NULL; - } ow_data_ready = 1; - DBG("OW read\n"); + //DBG("OW read\n"); break; } } @@ -329,9 +330,16 @@ uint8_t *read_buf = NULL; // buffer for storing readed data * fill ID buffer with readed data */ void fill_buff_with_data(){ + ow_process_resdata = NULL; if(!read_buf) return; read_from_OWbuf(1, 8, read_buf); int i, j; + P("Readed ID: "); + for(i = 0; i < 8; ++i){ + print_hex(&read_buf[i], 1); + usb_send(' '); + } + usb_send('\n'); // now check stored ROMs for(i = 0; i < dev_amount; ++i){ uint8_t *ROM = id_array[i].bytes; @@ -416,7 +424,7 @@ int32_t gettemp(uint8_t *scratchpad){ v = l >> 1 | (m & 0x80); // take signum from MSB t = ((int32_t)v) * 10L; if(l&1) t += 5L; // decimal 0.5 - }else{ + }else{ // DS18B20 v = l>>4 | ((m & 7)<<4) | (m & 0x80); t = ((int32_t)v) * 10L; m = l & 0x0f; // add decimal @@ -434,6 +442,7 @@ int8_t Ncur = 0; */ void convert_next_temp(){ uint8_t scratchpad[9]; + ow_process_resdata = NULL; if(dev_amount < 2){ read_from_OWbuf(2, 9, scratchpad); }else{ @@ -468,13 +477,30 @@ void OW_read_next_temp(){ ow_process_resdata = convert_next_temp; } +void wait_reading(){ + uint8_t bt; + read_from_OWbuf(0, 1, &bt); + if(bt == 0xff){ // the conversion is done! + ow_measurements_done = 1; + ow_process_resdata = NULL; + DBG("Measurements done!\n"); + }else{ + OW_State = OW_SEND_STATE; + OW_reset_buffer(); + ow_data_ready = 0; + OW_add_read_seq(1); // send read seq waiting for end of conversion + } +} + void OW_send_read_seq(){ ow_data_ready = 0; + ow_measurements_done = 0; OW_State = OW_RESET_STATE; OW_reset_buffer(); OW_add_byte(OW_SKIP_ROM); OW_add_byte(OW_CONVERT_T); - ow_process_resdata = NULL; + OW_add_read_seq(1); // send read seq waiting for end of conversion + ow_process_resdata = wait_reading; } /* * scan 1-wire bus diff --git a/1_wire/onewire.h b/1_wire/onewire.h index 8beb01e..b0aaebe 100644 --- a/1_wire/onewire.h +++ b/1_wire/onewire.h @@ -24,12 +24,13 @@ #include "main.h" #include "hardware_ini.h" -#define TIM2_DMABUFF_SIZE 128 +// 20 bytes x 8bits +#define TIM2_DMABUFF_SIZE 160 // freq = 1MHz // ARR values: 1000 for reset, 100 for data in/out -// CCR2 values: 500 for reset, 60 for sending 0 or reading, <15 for sending 1 -// CCR1 values: >550 if there's devices on line (on reset), >12 (typ.15) - read 0, < 12 (typ.1) - read 1 +// CCR4 values: 500 for reset, 60 for sending 0 or reading, <15 for sending 1 +// CCR3 values: >550 if there's devices on line (on reset), >12 (typ.15) - read 0, < 12 (typ.1) - read 1 #define RESET_LEN ((uint16_t)1000) #define BIT_LEN ((uint16_t)100) #define RESET_P ((uint16_t)500) @@ -39,7 +40,7 @@ #define RESET_BARRIER ((uint16_t)550) #define ONE_ZERO_BARRIER ((uint16_t)10) -#define ERR_TEMP_VAL (200000) +#define ERR_TEMP_VAL ((int32_t)200000) typedef struct{ uint8_t bytes[8]; @@ -64,8 +65,11 @@ extern int tum2buff_ctr; #define OW_reset_buffer() do{tum2buff_ctr = 0;}while(0) extern uint8_t ow_data_ready; +extern uint8_t ow_measurements_done; #define OW_DATA_READY() (ow_data_ready) #define OW_CLEAR_READY_FLAG() do{ow_data_ready = 0;}while(0) +#define OW_MEASUREMENTS_DONE() (ow_measurements_done) +#define OW_CLEAR_DONE_FLAG() do{ow_measurements_done = 0;}while(0) void OW_process(); void OW_fill_next_ID(); diff --git a/1_wire/user_proto.c b/1_wire/user_proto.c index 1367a08..08a1223 100644 --- a/1_wire/user_proto.c +++ b/1_wire/user_proto.c @@ -103,7 +103,10 @@ int parce_incoming_buf(char *buf, int len){ OW_fill_next_ID(); break; case 'Q': - OW_read_next_temp(); + if(OW_MEASUREMENTS_DONE()) + OW_read_next_temp(); + else + P("Wait for measurements ends or start another\n"); break; case 'R': OW_send_read_seq();