#include u32 PressData; u32 TempData; // MCU TYPE: STM32F103RCT6 //IO setup #define SDA_IN() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;} #define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;} //IO define #define IIC_SCL PCout(12) //SCL PA5 #define IIC_SDA PCout(11) //SDA PA7 #define READ_SDA PCin(11) //input SDA //system clock initial void Stm32_Clock_Init(u8 PLL) { unsigned char temp=0; MYRCC_DeInit(); RCC->CR|=0x00010000; while(!(RCC->CR>>17)); RCC->CFGR=0X00000400; PLL-=2; RCC->CFGR|=PLL<<18; RCC->CFGR|=1<<16; FLASH->ACR|=0x32; RCC->CR|=0x01000000; while(!(RCC->CR>>25)); RCC->CFGR|=0x00000002; while(temp!=0x02) { temp=RCC->CFGR>>2; temp&=0x03; } } //system delay initial void delay_init(u8 SYSCLK) { #if SYSTEM_SUPPORT_OS u32 reload; #endif SysTick->CTRL&=~(1<<2); fac_us=SYSCLK/8; #if SYSTEM_SUPPORT_OS reload=SYSCLK/8; reload*=1000000/delay_ostickspersec; fac_ms=1000/delay_ostickspersec; SysTick->CTRL|=1<<1; SysTick->LOAD=reload; SysTick->CTRL|=1<<0; #else fac_ms=(u16)fac_us*1000; #endif } //delay n us void delay_us(u32 nus) { u32 temp; SysTick->LOAD=nus*fac_us; SysTick->VAL=0x00; SysTick->CTRL=0x01 ; do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16))); SysTick->CTRL=0x00; SysTick->VAL =0X00; } //delay n ms void delay_ms(u16 nms) { u32 temp; SysTick->LOAD=(u32)nms*fac_ms; SysTick->VAL =0x00; SysTick->CTRL=0x01 ; do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16))); SysTick->CTRL=0x00; SysTick->VAL =0X00; } //IIC initial void IIC_Init(void) { RCC->APB2ENR|=1<<4; GPIOC->CRH&=0XFFF00FFF; GPIOC->CRH|=0X00033000; GPIOC->ODR|=3<<11; } //IIC start void IIC_Start(void) { SDA_OUT(); IIC_SDA=1; delay_us(4); IIC_SCL=1; delay_us(4); IIC_SDA=0; delay_us(4); //IIC_SCL=0; } //IIC stop void IIC_Stop(void) { SDA_OUT(); //IIC_SCL=0; IIC_SDA=0; delay_us(4); IIC_SCL=1; delay_us(4); IIC_SDA=1; } //wait ack //return:1,recieve fail // 0,recieve success u8 IIC_Wait_Ack(void) { u8 ucErrTime=0; SDA_IN(); IIC_SDA=1;delay_us(1); IIC_SCL=1;delay_us(1); while(READ_SDA) { ucErrTime++; if(ucErrTime>250) { IIC_Stop(); return 1; } } IIC_SCL=0; return 0; } //ACK void IIC_Ack(void) { IIC_SCL=0; SDA_OUT(); IIC_SDA=0; delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0; } //NACK void IIC_NAck(void) { IIC_SCL=0; SDA_OUT(); IIC_SDA=1; delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0; } //IIC write one byte void IIC_Send_Byte(u8 txd) { u8 t; SDA_OUT(); IIC_SCL=0; for(t=0;t<8;t++) { IIC_SDA=(txd&0x80)>>7; txd<<=1; delay_us(2); IIC_SCL=1; delay_us(2); IIC_SCL=0; delay_us(2); } } //IIC read one byte,ack=1,send ACK,ack=0,send nACK u8 IIC_Read_Byte(unsigned char ack) { unsigned char i,receive=0; SDA_IN(); for(i=0;i<8;i++ ) { IIC_SCL=0; delay_us(2); IIC_SCL=1; receive<<=1; if(READ_SDA)receive++; delay_us(1); } if (!ack) IIC_NAck(); else IIC_Ack(); return receive; } void Read_ASM10_Sensor(void) { u32 PressData; u32 TempData; u8 Read_Data[7] = {0x00}; u8 Status = 0x00; u8 I2c_Address = 0x29; u8 Read_Commond = 0xAC; IIC_Init(); delay_ms(50); IIC_Start(); IIC_Send_Byte((I2c_Address)<<1|0);//write IIC_Wait_Ack(); IIC_Send_Byte(Read_Commond);//1mps IIC_Wait_Ack(); IIC_Stop(); delay_ms(100); IIC_Start(); IIC_Send_Byte((I2c_Address)<<1|1);//read IIC_Wait_Ack(); Read_Data[0] = IIC_Read_Byte(1);//STATUS[7:0] Read_Data[1] = IIC_Read_Byte(1);//PRESSURE[23:16] Read_Data[2] = IIC_Read_Byte(1);//PRESSURE[15:8] Read_Data[3] = IIC_Read_Byte(1);//PRESSURE[7:0] Read_Data[4] = IIC_Read_Byte(1);//TEMPERATURE[23:16] Read_Data[5] = IIC_Read_Byte(1);//TEMPERATURE[15:8] Read_Data[6] = IIC_Read_Byte(0);//TEMPERATURE[7:0] IIC_Stop(); Status = Read_Data[0]; PressData = (Read_Data[1]<<16)|(Read_Data[2]<<8)|Read_Data[3]; TempData = (Read_Data[4]<<16)|(Read_Data[5]<<8)|Read_Data[6]; } int main(void) { Stm32_Clock_Init(9); delay_init(72); while(1) { Read_ASM10_Sensor(); delay_ms(1000); } }