Untitled

 avatar
unknown
plain_text
23 days ago
4.3 kB
2
Indexable
#include "stm32f0xx.h"

__IO uint16_t	i;													// volatile
uint32_t data;
uint32_t 			SHT20_Address	= 0x40;
uint16_t			tempCommand		= 0xE3;				//0b11100011 (Trigger T measurement, hold master)
uint16_t			humCommand		= 0xE5;				//0b11100101 (Trigger RH measurement, hold master)
uint32_t temp1, temp2;
uint32_t hum1, hum2;
uint32_t checkSum;

void SendToUsart2(char * data);
void delay_ms(uint16_t delay);
void SysTick_Handler(void);
void I2C1_IRQHandler(void);
void I2C_StartAddressWrite(void);
void I2C_StartAddressRead(void);
void I2C_Stop(void);
void I2C_SendTempCommand(void);
void I2C_SendHumCommand(void);
void I2C_ReadCommand(void);
void ReadTemp(void);

void SysTick_Handler(void){
	i++;
	if(i==1000) i=0;
}

void I2C1_IRQHandler(void){
		//
}
void delay_ms(uint16_t delay){
	i = 0;
	while(i<delay);
}

int main(void){
	RCC			->	AHBENR 	|= (1<<18) | (1<<17);														// GPIOBEN, GPIOAEN
	RCC			->	APB1ENR	|= (1<<21) | (1<<17);														// I2C1EN, USART2EN
	GPIOA 	-> 	MODER 	|= (1<<7)  | (1<<5) | (1<<1);
	GPIOA 	-> 	AFR[0]	|= (1<<12) | (1<<8);	
	GPIOB		->	MODER		|= (1<<15) | (1<<13);														// Mode: Alternate Function
	GPIOB		->	AFR[0]	|= (1<<28) | (1<<24);														// PB7 & PB6 as AF1(0001)
	
	// I2C1 configured in master mode to transmit
	I2C1		->	TIMINGR	= (uint32_t) 0x10420F0E; 												// PRESC:0x1, SCLDEL:0x4, SDADEL:0x2, SCLH:0xF, SCLL: 0x13
	//I2C1		->	CR2			= (1<<25) | (1<<16) | (SHT20_Address<<1);			// AUTOEN:1, NBYTES[7:0]:1, RD_WRN:0(Write), {SADD[9:0]: bit9,8,0: Dont care, SHT20_Address<<1}
	// USART Configuration
	USART2 -> CR1			|= (1<<0) | (1<<2) | (1<<3);											// UE:1, TE:1, RE:1
	USART2 -> CR2			|= 0x0000;																				// STOP[1:0]:00 (1 Stop bit)
	USART2 ->	BRR = 0x1388;																							// Boud Rate: 9600, 
	
	//I2C master transmitter
	
	while(1){
		ReadTemp();
		SysTick_Config(8000);
		SendToUsart2(temp1);
		
		delay_ms(500);
	}
}

void ReadTemp(){
	I2C_StartAddressWrite();
	I2C_SendTempCommand();
	I2C_StartAddressRead();
	while(((I2C1->ISR) & (1<<2)) != (1<<2));														// Wait untill RXNE=1
	temp1 = I2C1->RXDR;
	while(((I2C1->ISR) & (1<<2)) != (1<<2));														// Wait untill RXNE=1
	temp2 = I2C1->RXDR;
	while(((I2C1->ISR) & (1<<2)) != (1<<2));														// Wait untill RXNE=1
	checkSum = I2C1->RXDR;
	I2C_Stop();
}

void I2C_StartAddressWrite(){
	I2C1	->	CR2 = (1<<16) | (1<<13) | (0<<10) | (SHT20_Address<<1);		// NBYTES[7:0]:1, START:1, RD_WRN:0(Write), {SADD[9:0]: bit9,8,0: Dont care, SHT20_Address<<1}
	I2C1	->	ISR |= (1<<1);																						// TXIS:1
	I2C1	->	CR1 = (1<<0);																							// PE:1
	while(((I2C1->ISR) & (1<<1)) != (1<<1));														// Wait untill TXIS=1
}

void I2C_SendTempCommand(){
	I2C1	->	TXDR = tempCommand;
	I2C1	->	CR2 = (1<<16) | (0<<10);																	// NBYTES[7:0]:1, RD_WRN:0(Write)
	I2C1	->	ISR |= (1<<1);																						// TXIS:1
	I2C1	->	CR1 = (1<<0);																							// PE:1
	while(((I2C1->ISR) & (1<<1)) != (1<<1));														// Wait untill TXIS=1
}

void I2C_SendHumCommand(){
	I2C1	->	TXDR = humCommand;
	I2C1	->	CR2 = (1<<16) | (0<<10);																	// NBYTES[7:0]:1, RD_WRN:0(Write)
	I2C1	->	ISR |= (1<<1);																						// TXIS:1
	I2C1	->	CR1 = (1<<0);																							// PE:1
	while(((I2C1->ISR) & (1<<1)) != (1<<1));														// Wait untill TXIS=1
}

void I2C_StartAddressRead(){
	I2C1	->	CR2 = (1<<16) | (1<<13) | (1<<10) | (SHT20_Address<<1);		// NBYTES[7:0]:1, START:1, RD_WRN:0(Read), {SADD[9:0]: bit9,8,0: Dont care, SHT20_Address<<1}
	I2C1	->	ISR |= (1<<1);																						// TXIS:1
	I2C1	->	CR1 = (1<<0);																							// PE:1
	while(((I2C1->ISR) & (1<<1)) != (1<<1));														// Wait untill TXIS=1
}

//

void I2C_Stop(){
	I2C1	->	CR2 = (1<<15) | (1<<14);																	// NACK:1, STOP:1
	I2C1	->	ISR |= (1<<1);																						// TXIS:1
	I2C1	->	CR1 = (1<<0);																							// PE:1

}

void SendToUsart2(char * data){
	USART2 -> TDR = '*';
	while(((USART2 -> ISR) & (1<<7/*TXE*/)) == 0);											// TXE
	while(*data != '\0'){
		USART2 -> TDR = *data;
		while(((USART2 -> ISR) & (1<<7/*TXE*/)) == 0);										// TXE
		data++;
	}
}
Leave a Comment