Witam, chcę podłączyć termometr ds18b20 do mojego STM'a. Wzorując się na przykładzie pod AVR'a chciałem napisać swoją bibliotekę obsługującą one-wire.
Niestety po załadowaniu programu w zmiennych, w których powinna być temperatura znajdują się same jedynki. Może ktoś wie co może być przyczyną?
Opóźnienia zostały sprawdzone na oscyloskopie i są w porządku.
Z góry dziękuję za pomoc.
Biblioteka:
Niestety po załadowaniu programu w zmiennych, w których powinna być temperatura znajdują się same jedynki. Może ktoś wie co może być przyczyną?
Opóźnienia zostały sprawdzone na oscyloskopie i są w porządku.
Z góry dziękuję za pomoc.
Biblioteka:
unsigned char oow_reset()
{
unsigned char presence;
GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
oow_pin_out();
delay_us(500);
oow_pin_in();
delay_us(45);
if(IS_GPIO_BIT_ACTION(Bit_RESET))
{
presence = 1;
}
else
presence = 0;
delay_us(470);
return presence;
}
void oow_write_bit(char cBit)
{
oow_pin_out();
delay_us(5);
if(cBit == 1)
oow_pin_in();
delay_us(80);
oow_pin_in();
}
unsigned char oow_read_bit()
{
unsigned char ucBit;
GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
oow_pin_out();
delay_us(2);
oow_pin_in();
delay_us(15);
if(IS_GPIO_BIT_ACTION(Bit_SET))
{
ucBit = 1;
}
else
ucBit = 0;
return ucBit;
}
void oow_write_byte(char Byte)
{
unsigned char licznik;
unsigned char wartosc;
GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
for(licznik = 0; licznik<8; licznik++)
{
wartosc = Byte>>1;
wartosc &=0x01;
oow_write_bit(wartosc);
/*
oow_pin_out();
if(Byte & 0x01)
{
delay_us(7);
oow_pin_in();
delay_us(70);
}
else
{
delay_us(70);
oow_pin_in();
delay_us(7);
}
Byte>>=1;*/
}
delay_us(100);
}
unsigned char oow_read_byte()
{
unsigned char licznik;
unsigned char byteToRead =0 ;
for(licznik = 0; licznik<8; licznik++)
{
if(oow_read_bit())
byteToRead |=(0x01<<licznik);
delay_us(25);
/*oow_pin_out();
delay_us(7);
oow_pin_in();
delay_us(7);
byteToRead>>=1;
if(IS_GPIO_BIT_ACTION(Bit_SET))
byteToRead|=0x80;
delay_us(80);
*/
}
return byteToRead;
}
void oow_pin_out(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
}
void oow_pin_in(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
}
Main:
int main()
{
unsigned char reset;
char tempH, tempL;
float fTemp;
STM32vldiscovery_LEDInit(LED3);
STM32vldiscovery_LEDInit(LED4);
delay_init();
oow_pin_in();
while(1)
{
reset = oow_reset();
if(reset == 1)
{
STM32vldiscovery_LEDOn(LED4);
oow_write_byte(0xCC);
oow_write_byte(0x44);
delay_ms(750);
reset = oow_reset();
oow_write_byte(0xCC);
oow_write_byte(0xBE);
tempH = oow_read_byte();
tempL = oow_read_byte();
reset = oow_reset();
STM32vldiscovery_LEDOff(LED4);
fTemp = (float)(tempL + (tempH<<8))/16;
delay_ms(200);
}
else
{
STM32vldiscovery_LEDOn(LED4);
}
/*
GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
delay_ms(200); //6.6ms
GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_SET);
delay_ms(200); //10ms*/
}
return 0;
}