Untitled
unknown
plain_text
10 months ago
4.3 kB
4
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++;
}
}
Editor is loading...
Leave a Comment