#include "GPIO_IIC_Drv.h" unsigned char IIC_ack; /*应答标志位*/ //PB11:SDA //PB10:SDL #define IIC_SDA_3V3_STATE GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) #define IIC_SDA_3V3(v) ((v == 0) ? (GPIO_ResetBits(GPIOB, GPIO_Pin_0)) : (GPIO_SetBits(GPIOB, GPIO_Pin_0)) ) #define IIC_SDA_Chg_in() SDA_Port_Config(0) #define IIC_SDA_Chg_out() SDA_Port_Config(1) #define IIC_SCL_3V3(v) ((v == 0) ? (GPIO_ResetBits(GPIOC, GPIO_Pin_5)) : (GPIO_SetBits(GPIOC, GPIO_Pin_5)) ) /*********************延时函数xus***********************************/ #define IIC_Delay1us() IIC_Delayus(1) void IIC_Delayus(unsigned short Times) { unsigned short i=0; while(Times--) { i=10; //自己定义 while(i--) ; } } /******************************************************************/ void SDA_Port_Config(unsigned char mode) { GPIO_InitTypeDef GPIO_InitStructure; if (mode==1) //输出模式 { GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; } else { GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; } GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOB,&GPIO_InitStructure); } void IIC_SDA_HIGH(void) { IIC_SDA_Chg_out(); IIC_SDA_3V3(1); } void IIC_SDA_LOW(void) { IIC_SDA_Chg_out(); IIC_SDA_3V3(0); } void IIC_SCL_HIGH(void) { IIC_SCL_3V3(1); } void IIC_SCL_LOW(void) { IIC_SCL_3V3(0); } int GPIO_IIC_init(void) { GPIO_InitTypeDef GPIO_InitStructure; //打开相应GPIO口的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_Init(GPIOC,&GPIO_InitStructure); //========================================================= //GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11); //GPIO_ResetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11); return 1; } void IIC_init(void) { GPIO_IIC_init(); IIC_SCL_HIGH(); IIC_SDA_HIGH(); //IIC_SDA_Chg_in(); } void IIC_Start(void) { /*发送起始条件的数据信号*/ IIC_SDA_Chg_out(); IIC_SCL_HIGH(); IIC_Delayus(10); IIC_SDA_HIGH(); IIC_Delayus(30); //5/*起始条件建立时间大于4.7us,延时*/ /*发送起始信号*/ IIC_SDA_LOW(); IIC_Delayus(30); //5/* 起始条件锁定时间大于4μs*/ /*钳住I2C总线,准备发送或接收数据 */ IIC_SCL_LOW(); // IIC_Delayus(30); //5//delay10us(); // IIC_SDA_Chg_in(); //输入 } void IIC_Stop(void) { /*发送结束条件的数据信号*/ IIC_SDA_Chg_out(); // IIC_SCL_LOW(); // IIC_Delayus(30); IIC_SDA_LOW(); IIC_Delayus(10); /*发送结束条件的时钟信号*/ IIC_SCL_HIGH(); IIC_Delayus(10); //5//delay25us(); IIC_SDA_HIGH(); IIC_Delayus(10); //5//delay25us(); /*发送I2C总线结束信号*/ } void IIC_Free(void) { /*发送结束条件的数据信号*/ IIC_SDA_Chg_out(); IIC_SDA_HIGH(); IIC_Delayus(30); //5//delay25us(); IIC_SCL_HIGH(); IIC_Delayus(30); //5//delay25us(); /*发送I2C总线结束信号*/ } /* * FunctionName: I2CSendACK * Purpose: 模拟I2C发送ACK响应 * Parameters: 无 */ void IIC_SendAck(void) { IIC_SDA_Chg_out(); IIC_SCL_LOW(); IIC_Delayus(10); //5//delay25us(); IIC_SDA_LOW(); IIC_Delayus(10); //5//delay25us(); IIC_SCL_HIGH(); IIC_Delayus(10); //5//delay25us(); IIC_SCL_LOW(); IIC_Delayus(10); //5//delay25us(); } /* * FunctionName: I2CSendACK * Purpose: 模拟I2C无ACK响应 * Parameters: 无 */ void IIC_SendNoAck(void) { IIC_SDA_Chg_out(); IIC_SCL_LOW(); IIC_Delayus(10); //5//delay25us(); IIC_SDA_HIGH(); IIC_Delayus(10); //5//delay25us(); IIC_SCL_HIGH(); IIC_Delayus(10); //5//delay25us(); IIC_SCL_LOW(); IIC_Delayus(10); //5//delay25us(); } /*检查I2C是否有ACK响应 */ BOOL I2C_CheckAck(void) { BOOL tempAck; IIC_SDA_Chg_out(); //dwd IIC_SDA_HIGH(); //dwd IIC_Delayus(10); //5//delay25us(); IIC_SDA_Chg_in(); IIC_Delayus(10); //5//delay25us(); IIC_SCL_HIGH(); IIC_Delayus(10); //5//delay25us(); if(IIC_SDA_3V3_STATE) { tempAck = FALSE; } else { tempAck = TRUE; } IIC_SCL_LOW(); IIC_Delayus(10); //5//delay25us(); return tempAck; } void IIC_SendByte(unsigned char data) { unsigned char BitCnt; IIC_SDA_Chg_out(); for(BitCnt=8;BitCnt>=1;BitCnt--) { if ((data>>(BitCnt-1))&0x01) { IIC_SDA_HIGH(); } else { IIC_SDA_LOW(); } IIC_Delayus(10); //5//delay25us(); IIC_SCL_HIGH(); IIC_Delayus(10); //5//delay25us(); IIC_SCL_LOW(); IIC_Delayus(10); //5//delay25us(); } } U08 I2CReceiveByte(U08 ack) { U08 serialNum = 0; U08 dataValue=0; IIC_SDA_Chg_in(); //输入 for(serialNum=0;serialNum<=7;serialNum++) { IIC_SCL_LOW(); IIC_Delayus(10); //5//delay25us(); IIC_SCL_HIGH(); dataValue <<=1; if (IIC_SDA_3V3_STATE) { dataValue |= 0X01; } IIC_Delayus(10); //5//delay25us(); } if (ack ==1) { IIC_SendNoAck(); } else { IIC_SendAck(); } return dataValue; } unsigned char I2C_ReadByte(void) { U08 i; U08 value; /* 先读取最高位即bit7 */ value = 0; for(i = 0 ; i < 8 ; i++) { value <<= 1; IIC_SCL_HIGH(); IIC_Delayus(10); //5//delay25us(); if(IIC_SDA_3V3_STATE) { value++; } IIC_SCL_LOW(); IIC_Delayus(10); //5//delay25us(); } return value; } void SlaveI2CFM1288Write(U16 tarAddress,U16 wrNumber) { BOOL rxdAck; IIC_Start(); IIC_SendByte(0xc0); rxdAck=I2C_CheckAck(); // 0xFC, 0xF3, 0x3B, 0x23, 0x0C, 0x01, 0x40, IIC_SendByte (0xfc); I2C_CheckAck(); IIC_SendByte (0xf3); I2C_CheckAck(); IIC_SendByte (0x3b); I2C_CheckAck(); IIC_SendByte (HI_BYTE(tarAddress)); I2C_CheckAck(); IIC_SendByte (LO_BYTE(tarAddress)); I2C_CheckAck(); IIC_SendByte (HI_BYTE(wrNumber)); I2C_CheckAck(); IIC_SendByte (LO_BYTE(wrNumber)); I2C_CheckAck(); IIC_Stop(); } void NewSlaveI2CFM1288Write(unsigned char tarAddress,U16 wrNumber,unsigned char* wrPointer) { BOOL rxdAck; IIC_Start(); IIC_SendByte(0xc0); rxdAck=I2C_CheckAck(); for(;wrNumber !=0;wrNumber--,wrPointer ++) { IIC_SendByte(*wrPointer); //按字节写入数据 rxdAck=I2C_CheckAck(); } IIC_Stop(); } void SlaveI2CFM1288Read(unsigned char tarAddress,unsigned char *pData,U08 Lenght) { BOOL rxdAck; IIC_Start(); IIC_SendByte(0xc0); rxdAck=I2C_CheckAck(); IIC_SendByte(0xfc); rxdAck=I2C_CheckAck(); IIC_SendByte(0xf3); rxdAck=I2C_CheckAck(); IIC_SendByte(0x37); rxdAck=I2C_CheckAck(); IIC_SendByte(0x38); rxdAck=I2C_CheckAck(); IIC_SendByte(0x07); rxdAck=I2C_CheckAck(); IIC_Stop(); IIC_Start(); IIC_SendByte(0xc1); rxdAck=I2C_CheckAck(); // IIC_Delayus(200); //5//delay25us(); // IIC_SendByte(0x37); // rxdAck=I2C_CheckAck(); // if (!I2C_CheckAck()) { // IIC_Stop(); // return; //} *pData = I2CReceiveByte(0); pData ++; IIC_SendAck(); *pData = I2CReceiveByte(0); IIC_SendNoAck(); IIC_Stop(); } ///******************************************************************* // 用户接口函数 //*******************************************************************/ ///******************************************************************* // 向无子地址器件发送字节数据函数 //功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla. // 如果返回1表示操作成功,否则操作有误。 //注意: 使用前必须已结束总线。 //********************************************************************/ //u8 ISendByte_NoSub(unsigned char sla,unsigned char c) //{ // unsigned char i; // for(i=0;i<5;i++) // { // Start_I2c(); /*启动总线*/ // SendByte(sla); /*发送器件地址*/ // if(IIC_ack==0) // { // Stop_I2c(); /*结束总线*/ // continue; // } // SendByte(c); /*发送数据*/ // if(IIC_ack==0) // { // Stop_I2c(); /*结束总线*/ // continue; // } // //if(IIC_ack==0)return(0); // Stop_I2c(); /*结束总线*/ // break; // } //#ifdef FUNC_CAN_DIAG_EN // if(i>=5) // { // canDTC[0]=1; // return (0); // } // canDTC[0]=0; //#endif // return(1); //} ///******************************************************************* // 向有子地址器件发送字节数据函数 //功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件 // 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。 // 如果返回1表示操作成功,否则操作有误。 //注意: 使用前必须已结束总线。 //********************************************************************/ //u8 ISendByte(unsigned char sla,unsigned char suba,unsigned char c) //{ // //PTED_PTED4=~PTED_PTED4; // //PTED_PTED5=~PTED_PTED5; // Start_I2c(); /*启动总线*/ // SendByte(sla); /*发送器件地址*/ //// if(IIC_ack==0)return(0); // SendByte(suba); /*发送器件子地址*/ //// if(IIC_ack==0)return(0); // SendByte(c); /*发送数据*/ // if(IIC_ack==0)return(0); // Stop_I2c(); /*结束总线*/ // return(1); //} // ///******************************************************************* // 向有子地址器件发送多字节数据函数 //功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件 // 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。 // 如果返回1表示操作成功,否则操作有误。 //注意: 使用前必须已结束总线。 //********************************************************************/ //u8 ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) //{ // unsigned char i; // Start_I2c(); /*启动总线*/ // SendByte(sla); /*发送器件地址*/ // //if(IIC_ack==0)return(0); // SendByte(suba); /*发送器件子地址*/ // //if(IIC_ack==0)return(0); // for(i=0;i