Arkadslar merhaba ,,stm32f4 ile sht 75 sıcaklık sensoru okumam lazım tezımde ,örneek uygulmalarıı inceledım ama harıcı sensörden verı okumaya rastlamadım ,,sht 75 ın diğer işmecılerle olan kodlarını stm32f4 için düzenledım ama verılerıı okuyamadım acaba nerde yanlıs yapıyorum?
#include "STM32F4xx.h"
#include "delay.h"
#include "HD44780.h"
#include "math.h"
#include "stdio.h"
//adr komut r/w
#define YAZMA_DURUM 0x06 //000 0011 0
#define OKUMA_DURUM 0x07 //000 0011 1
#define ISI_OLCUM 0x03 //000 0001 1
#define NEM_OLCUM 0x05 //000 0010 1
#define RESET 0x1e //000 1111 0
#define noACK 0
#define ACK 1
#define DATA GPIO_B(7)
#define SCK GPIO_B(6)
void SystemInit(void)
{
unsigned int i;
for (i=0;i<0x00100000;i++); // OSC oturtma ve kurtarma rutini
RCC->CFGR |= 0x00009400; // AHB ve APB hizlarini max degerlere set edelim
RCC->CR |= 0x00010000; // HSE Xtal osc calismaya baslasin
while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
RCC->PLLCFGR = 0x07405408; // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
// RCC->PLLCFGR = 0x07402A04; // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
RCC->CR |= 0x01000000; // PLL calismaya baslasin (Rehber Sayfa 95)
while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
// FLASH->ACR = 0x00000705; // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
FLASH->ACR = 0x00000605; // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
RCC->CFGR |= 0x00000002; // Sistem Clk u PLL uzerinden besleyelim
while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
RCC->AHB1ENR |= 0x0000001F; // GPIO A,B,C,D,E clock'u aktif edelim
GPIOD->MODER = 0x55005555; // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin) 0..7 arasıda çıkış
GPIOB->MODER = 0x00000500; // GPIOB 4 ve 5 i çıkış yaptık.
//GPIOE->MODER = 0x00000880; // GPIOE 4 ve 6 i çıkış yaptık.
// DATA ÇIKIŞ=E4 SCK ÇIKIŞ= E6
GPIOA->OSPEEDR= 0x00000000; // GPIOD nin tum cikislarinı Max. 2 Mhz de kullanacağız.
GPIOB->OSPEEDR= 0xFFFFFFFF; // AYnı şey GPIOB içinde geçerli
GPIOC->OSPEEDR= 0xFFFFFFFF;
GPIOD->OSPEEDR= 0xFFFFFFFF;
GPIOE->OSPEEDR= 0xFFFFFFFF;
}
void bekle( unsigned int sure )
{
int i;
while( sure != 0 )
{
i = 120;
while( i != 0 )
{
i --;
}
sure --;
}
}
void ee_delay(void)
{ unsigned long y;
for(y=0; y<50; y++);
}
typedef union
{ unsigned int i;
float f;
} value;
enum {ISI,NEM};
char s_yaz_byte(unsigned char deger)
{
unsigned char i,hata=0;
for (i=0x80;i>0;i/=2)
{ if (i & deger) DATA=1;
else DATA=0;
ee_delay();
SCK=1;
ee_delay();
ee_delay();
ee_delay();
SCK=0;
ee_delay();
}
DATA=1;
ee_delay();
SCK=1;
hata=DATA;
SCK=0;
return hata;
}
/***** bir bayt okumak için tanımlama *****/
char s_oku_byte(unsigned char ack)
{
unsigned char i,val=0;
DATA=1;
for (i=0x80;i>0;i/=2) //bit maskeleme
{ SCK=1; //iletişim için saat sinyali
if (DATA) val=(val | i); //bir bit oku
SCK=0;
}
DATA=!ack;
ee_delay();
SCK=1;
ee_delay();
ee_delay();
ee_delay();
SCK=0;
ee_delay();
DATA=1; //veri değerini sil
return val;
}
/***** yeni bir iletişim başlat *****/
void s_basla(void)
{
DATA=1; SCK=0; //ilk durum
ee_delay();
SCK=1;
ee_delay();
DATA=0;
ee_delay();
SCK=0;
ee_delay();
ee_delay();
ee_delay();
SCK=1;
ee_delay();
DATA=1;
ee_delay();
SCK=0;
}
/*** iletişim yenile: DATA-line=1 ve sonraki 9 SCK saykili takiben başa dön ***/
void s_baglanti_reset(void)
{
unsigned char i;
DATA=1; SCK=0; //ilk durum
for(i=0;i<9;i++) //9 SCK saykili
{ SCK=1;
SCK=0;
}
s_basla(); //aktarmayi baslat
}
//----------------------------------------------------------------------------------
char s_softreset(void)
{
unsigned char hata=0;
s_baglanti_reset(); //reset communication
hata+=s_yaz_byte(RESET); //send RESET-command to sensor
return hata; //error=1 in case of no response form the sensor
}
//----------------------------------------------------------------------------------
char s_oku_statusreg(unsigned char *p_deger, unsigned char *p_top)
//----------------------------------------------------------------------------------
// reads the status register with checksum (8-bit)
{
unsigned char hata=0;
s_basla(); //transmission start
hata=s_yaz_byte(OKUMA_DURUM); //send command to sensor
*p_deger=s_oku_byte(ACK); //read status register (8-bit)
*p_top=s_oku_byte(noACK); //read checksum (8-bit)
return hata; //error=1 in case of no response form the sensor
}
//----------------------------------------------------------------------------------
char s_yaz_statusreg(unsigned char *p_deger)
//----------------------------------------------------------------------------------
// writes the status register with checksum (8-bit)
{
unsigned char hata=0;
s_basla(); //transmission start
hata+=s_oku_byte(YAZMA_DURUM);//send command to sensor
hata+=s_yaz_byte(*p_deger); //send value of status register
return hata; //error>=1 in case of no response form the sensor
}
/**** ölcüm yapar (nem/sıcaklık)****/
char s_olcum(unsigned char *p_deger, unsigned char *p_top, unsigned char mod)
{
unsigned hata=0;
unsigned int i;
s_basla(); //aktarmayı başlat.
switch(mod){ //sensöre komut göder.
case ISI : hata+=s_yaz_byte(ISI_OLCUM); break;
case NEM : hata+=s_yaz_byte(NEM_OLCUM); break;
default : break;
}
for (i=0;i<65535;i++) if(DATA==0) break; //sensör ölçümü tamamlayana kadar bekle.
if(DATA) hata+=1; // süre 2 saniye yi astiginda
*(p_deger) =s_oku_byte(ACK); //ilk bayti oku
*(p_deger+1)=s_oku_byte(ACK); //ikinci bayti oku
*p_top =s_oku_byte(noACK); //toplamı oku
return hata;
}
void sensor_hesapla(float *p_nem ,float *p_isi)
{
const float C1=-2.0468; // for 12 Bit RH
const float C2=+0.0367; // for 12 Bit RH
const float C3=-0.0000015955; // for 12 Bit RH
const float T1=+0.01; // for 12 Bit RH
const float T2=+0.00008; // for 12 Bit RH
float rh=*p_nem; // rh: nem [saat darbesi] 12 Bit
float t=*p_isi; // t: sicaklik [saat darbesi] 14 Bit
float rh_lin; // rh_lin: nem doğrusal
float rh_true; // rh_true: sicaklik telafi nem
float t_C; // t_C : sicaklik [íC]
t_C=t*0.01 - 40; //[íC] dan sıcaklık hesapla.
rh_lin=C3*rh*rh + C2*rh + C1; //[%RH] dan nem hesapla
rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //[%RH] sıcaklık ısı telefisi hesapla
*p_isi=t_C; //sıcaklık değeri döndür[íC]
*p_nem=rh_true; //nem değeri döndür.[%RH]
}
void main(void)
{
void SystemInit();
value nem_deger,isi_deger;
unsigned char topla, hata;
unsigned int i;
char S1[16],S2[16];
s_baglanti_reset();
while(1)
{
hata=0;
//hata+=s_olcum((unsigned char*) &nem_deger.i,&topla,NEM);
s_olcum((unsigned char *)&nem_deger.i,&topla,NEM); //nem ölçümü
//hata+=s_olcum((unsigned char*) &isi_deger.i,&topla,ISI);
s_olcum((unsigned char *)&isi_deger.i,&topla,ISI); //sıceklık ölçümü
//if(hata!=0) s_baglanti_reset();
//else//{
nem_deger.f=(float)nem_deger.i; //tip dönüşümü
isi_deger.f=(float)isi_deger.i; //tip dönüşümü
sensor_hesapla(&nem_deger.f,&isi_deger.f); //sıcaklık ve nem hesapla
for (i=0;i<40000;i++); //(be sure that the compiler doesn't eliminate this line!)
//}
// sprintf(S1,"SiCAKLiK :%5.1fC%",isi_deger.f); //sicaklik değerini s1 degiskenine bastır
//sprintf(S2,"NEM......:%5.1f%%",nem_deger.f); //nem değerini s2 degiskenine bastır
Lcd_init();
Lcd_Imlec_Yok();
sprintf(S1,"SiCAKLiK :%5.1fC%",isi_deger.f); //sicaklik değerini s1 degiskenine bastır
Lcd_Yaz(S1); Lcd_Git(2,1);
sprintf(S2,"NEM......:%5.1f%%",nem_deger.f); //nem değerini s2 degiskenine bastır
Lcd_Yaz(S2);
Delay_ms(250);
}
}