STM32的模拟IIC
void IIC_Init ( )
{ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOB, ENABLE ) ; GPIO_InitStructure. GPIO_Pin = GPIO_Pin_10| GPIO_Pin_11; GPIO_InitStructure. GPIO_Mode = GPIO_Mode_Out_PP ; GPIO_InitStructure. GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init ( GPIOB, & GPIO_InitStructure) ; GPIO_SetBits ( GPIOB, GPIO_Pin_10| GPIO_Pin_11) ;
}
void SDA_IN ( void )
{ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOB, ENABLE ) ; GPIO_InitStructure. GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure. GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init ( GPIOB, & GPIO_InitStructure) ;
}
void SDA_OUT ( void )
{ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOB, ENABLE ) ; GPIO_InitStructure. GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure. GPIO_Mode = GPIO_Mode_Out_PP ; GPIO_InitStructure. GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init ( GPIOB, & GPIO_InitStructure) ;
}
void IIC_Start ( void )
{ SDA_OUT ( ) ; IIC_SDA= 1 ; IIC_SCL= 1 ; delay_us ( 10 ) ; IIC_SDA= 0 ; delay_us ( 10 ) ; IIC_SCL= 0 ;
}
void IIC_Stop ( void )
{ SDA_OUT ( ) ; IIC_SCL= 0 ; IIC_SDA= 0 ; delay_us ( 10 ) ; IIC_SCL= 1 ; delay_us ( 2 ) ; IIC_SDA= 1 ; delay_us ( 10 ) ;
}
u8 IIC_Wait_Ack ( void )
{ u8 ucErrTime= 0 ; SDA_IN ( ) ; IIC_SDA= 1 ; delay_us ( 2 ) ; IIC_SCL= 1 ; delay_us ( 2 ) ; while ( READ_SDA) { ucErrTime++ ; if ( ucErrTime> 250 ) { IIC_Stop ( ) ; return 1 ; } } delay_us ( 2 ) ; IIC_SCL= 0 ; return 0 ;
}
void IIC_Ack ( void )
{ IIC_SCL= 0 ; SDA_OUT ( ) ; IIC_SDA= 0 ; delay_us ( 5 ) ; IIC_SCL= 1 ; delay_us ( 5 ) ; IIC_SCL= 0 ;
}
void IIC_NAck ( void )
{ IIC_SCL= 0 ; SDA_OUT ( ) ; IIC_SDA= 1 ; delay_us ( 5 ) ; IIC_SCL= 1 ; delay_us ( 5 ) ; IIC_SCL= 0 ;
}
void IIC_Send_Byte ( u8 txd)
{ u8 t; SDA_OUT ( ) ; IIC_SCL= 0 ; for ( t= 0 ; t< 8 ; t++ ) { if ( ( txd& 0x80 ) >> 7 ) IIC_SDA= 1 ; else IIC_SDA= 0 ; txd<<= 1 ; delay_us ( 5 ) ; IIC_SCL= 1 ; delay_us ( 5 ) ; IIC_SCL= 0 ; delay_us ( 5 ) ; }
}
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 ( 5 ) ; IIC_SCL= 1 ; receive<<= 1 ; if ( READ_SDA) receive++ ; delay_us ( 4 ) ; } if ( ! ack) IIC_NAck ( ) ; else IIC_Ack ( ) ; return receive;
}
void MCP4725_WriteData_eep ( void )
{ IIC_Start ( ) ; IIC_Send_Byte ( 0XC2 ) ; IIC_Wait_Ack ( ) ; IIC_Send_Byte ( 0x60 ) ; IIC_Wait_Ack ( ) ; IIC_Send_Byte ( 0x00 ) ; IIC_Wait_Ack ( ) ; IIC_Send_Byte ( 0x00 ) ; IIC_Wait_Ack ( ) ; IIC_Stop ( ) ; delay_ms ( 10 ) ;
}
void MCP4725_WriteData_Voltage ( u16 Vout)
{ u8 temp; u16 temp_u16; temp_u16 = ( 4096 * Vout) / 3300 ; temp = ( 0x0F00 & temp_u16) >> 8 ; IIC_Start ( ) ; IIC_Send_Byte ( 0XC2 ) ; IIC_Wait_Ack ( ) ; IIC_Send_Byte ( temp) ; IIC_Wait_Ack ( ) ; IIC_Send_Byte ( temp_u16) ; IIC_Wait_Ack ( ) ; IIC_Stop ( ) ; delay_ms ( 10 ) ;
}
void MCP4725_WriteData_Digital ( u16 data)
{ u8 data_H= 0 , data_L= 0 ; data_H = ( 0x0F00 & data) >> 8 ; data_L = 0X00FF & data ; IIC_Start ( ) ; IIC_Send_Byte ( 0XC2 ) ; IIC_Wait_Ack ( ) ; IIC_Send_Byte ( data_H) ; IIC_Wait_Ack ( ) ; IIC_Send_Byte ( data_L) ; IIC_Wait_Ack ( ) ; IIC_Stop ( ) ; delay_ms ( 10 ) ;
}