#include "sccb_gpio.h" #define SCCB_ID 0x42 void SCCB_SDA_IN() { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = I2C_EE_SDA ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(I2C_EE_GPIO, &GPIO_InitStructure); } void SCCB_SDA_OUT() { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = I2C_EE_SDA ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(I2C_EE_GPIO, &GPIO_InitStructure); } //???SCCB?? //CHECK OK void SCCB_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; /* Configure I2C_EE pins: SCL and SDA */ GPIO_InitStructure.GPIO_Pin = I2C_EE_SCL ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(I2C_EE_GPIO, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = I2C_EE_SDA ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(I2C_EE_GPIO, &GPIO_InitStructure); SCCB_SDA_OUT(); GPIO_SetBits(GPIOB,I2C_EE_SDA); GPIO_SetBits(GPIOB,I2C_EE_SCL); } void delay_us(unsigned int x){ for(unsigned int i = 0;i < x;i++){ for(unsigned int z = 0;z < 2;z++){ z = z; } } } //SCCB???? //??????,???????,????? //??????,SDA?SCL????? void SCCB_Start(void){ GPIO_SetBits(GPIOB,I2C_EE_SDA); GPIO_SetBits(GPIOB,I2C_EE_SCL); delay_us(50); GPIO_ResetBits(GPIOB,I2C_EE_SDA); delay_us(50); GPIO_ResetBits(GPIOB,I2C_EE_SCL); } //SCCB???? //??????,???????,????? //??????,SDA?SCL????? void SCCB_Stop(void){ GPIO_ResetBits(GPIOB,I2C_EE_SDA); delay_us(50); GPIO_SetBits(GPIOB,I2C_EE_SCL); delay_us(50); GPIO_SetBits(GPIOB,I2C_EE_SDA); delay_us(50); } //??NA?? void SCCB_No_Ack(void) { delay_us(50); GPIO_SetBits(GPIOB,I2C_EE_SDA); GPIO_SetBits(GPIOB,I2C_EE_SCL); delay_us(50); GPIO_ResetBits(GPIOB,I2C_EE_SCL); delay_us(50); GPIO_SetBits(GPIOB,I2C_EE_SDA); delay_us(50); } //SCCB,?????? //??0???? u8 SCCB_WR_Byte(u8 dat) { u8 j,res; for(j=0;j<8;j++) //??8????? { if(dat&0x80) GPIO_SetBits(GPIOB,I2C_EE_SDA); else GPIO_ResetBits(GPIOB,I2C_EE_SDA); dat<<=1; delay_us(50); GPIO_SetBits(GPIOB,I2C_EE_SCL); delay_us(50); GPIO_ResetBits(GPIOB,I2C_EE_SCL); } SCCB_SDA_IN(); delay_us(50); GPIO_SetBits(GPIOB,I2C_EE_SCL); delay_us(50); if(GPIO_ReadInputDataBit(GPIOB,I2C_EE_SDA)) res=1; //SDA=1???? else res=0; //SDA=0???? GPIO_ResetBits(GPIOB,I2C_EE_SCL); SCCB_SDA_OUT(); return res; } //SCCB ?????? //?SCL????,???? //???:????? u8 SCCB_RD_Byte(void) { u8 temp=0,j; SCCB_SDA_IN(); for(j=8;j>0;j--) //??8????? { delay_us(50); GPIO_SetBits(GPIOB,I2C_EE_SCL); temp=temp<<1; if(GPIO_ReadInputDataBit(GPIOB,I2C_EE_SDA)) temp++; delay_us(50); GPIO_ResetBits(GPIOB,I2C_EE_SCL); } SCCB_SDA_OUT(); return temp; } //???? //???:0?? u8 SCCB_WR_Reg(u8 reg,u8 data) { u8 res=0; SCCB_Start(); //???? if(SCCB_WR_Byte(SCCB_ID))res=1; //???ID delay_us(100); if(SCCB_WR_Byte(reg))res=1; //?????? delay_us(100); if(SCCB_WR_Byte(data))res=1; //??? SCCB_Stop(); //???? return res; } //???? u8 SCCB_RD_Reg(u8 reg) { u8 val=0; SCCB_Start(); //???? SCCB_WR_Byte(SCCB_ID); //???ID delay_us(100); SCCB_WR_Byte(reg); //?????? delay_us(100); SCCB_Stop(); delay_us(100); //??????????? SCCB_Start(); SCCB_WR_Byte(SCCB_ID|0X01); //????? delay_us(100); val=SCCB_RD_Byte(); //??? SCCB_No_Ack(); //??NA SCCB_Stop(); //???? return val; }