三、功能 先在24c02的一个地址中写入一个字符,然后在读取该位置的字符并通过串口显示出来。 #include "iic.h" #define iicsda PBout(7) #define iicscl PBout(6) #define iicsdain PBin(7) void SDAOUT(void)//sda×÷ΪÍÆÍìÊä³ö { GPIO_InitTypeDef GPIO_InitTypeStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitTypeStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitTypeStruct.GPIO_Pin=GPIO_Pin_7; GPIO_InitTypeStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitTypeStruct); } void SDAIN(void)//SDA×÷Ϊ¸¡¿ÕÊäÈë { GPIO_InitTypeDef GPIO_InitTypeStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitTypeStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitTypeStruct.GPIO_Pin=GPIO_Pin_7; GPIO_InitTypeStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitTypeStruct); } void Myiic_INIT()//IIC³õʼ»¯ { GPIO_InitTypeDef GPIO_InitTypeStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitTypeStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitTypeStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7; GPIO_InitTypeStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitTypeStruct); GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); } void Myiic_Start(void)//ÆðʼÐźŠ{ SDAOUT(); iicsda=1; iicscl=1; delay_us(4); iicsda=0; delay_us(4); iicscl=0; } void Myiic_Stop(void)//Í£Ö¹ÐźŠ{ SDAOUT(); iicscl=0; iicsda=0; delay_us(4); iicscl=1; iicsda=1; delay_us(4); } u8 Myiic_Wait_Ack(void)//µÈ´ýACK { u8 time=0; SDAIN(); iicsda=1; delay_us(1); iicscl=1; delay_us(1); while(iicsdain) { time++; if(time>250) { Myiic_Stop(); return 1; } } iicscl=0; return 0; } void Myiic_ACK(void)//²úÉúACKÓ¦´ð { iicscl=0; SDAOUT(); iicsda=0; delay_us(2); iicscl=1; delay_us(2); iicscl=0; } void Myiic_NACK(void)//²»²úÉúÓ¦´ðλ { iicscl=0; SDAOUT(); iicsda=1; delay_us(2); iicscl=1; delay_us(2); iicscl=0; } void Myiic_Sendbyte(u8 w)//·¢ËÍÒ»¸ö×Ö½Ú { u8 i; SDAOUT(); iicscl=0; for(i=0;i<8;i++) { iicsda=(w&0x80)>>7; w<<=1; delay_us(2); iicscl=1; delay_us(2); iicscl=0; delay_us(2); } } u8 Myiic_Readbyte(unsigned char ack)//¶ÁÈ¡Ò»¸ö×Ö½Ú { unsigned char i=0,r=0; SDAIN(); for(i=0;i<8;i++) { iicscl=0; delay_us(2); iicscl=1; r<<=1; if(iicsdain) r++; delay_us(1); } if(!ack) Myiic_NACK(); else Myiic_ACK(); return r; }
|