Untitled
#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