123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625 |
- #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<no;i++)
- // {
- // SendByte(*s); /*发送数据*/
- // //if(IIC_ack==0)return(0);
- // s++;
- // }
- // Stop_I2c(); /*结束总线*/
- // return(1);
- //}
- ///*******************************************************************
- // 向无子地址器件发送多字节数据函数
- //功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
- // 地址sla,发送内容是s指向的内容,发送no个字节。
- // 如果返回1表示操作成功,否则操作有误。
- //注意: 使用前必须已结束总线。
- //********************************************************************/
- //u8 ISendStr_NoSub(unsigned char sla,unsigned char *s,unsigned char no)
- //{
- // unsigned char i;
- // Start_I2c(); /*启动总线*/
- // SendByte(sla); /*发送器件地址*/
- // //if(IIC_ack==0)return(0);
- // for(i=0;i<no;i++)
- // {
- // SendByte(*s); /*发送数据*/
- // //if(IIC_ack==0)return(0);
- // s++;
- // }
- // Stop_I2c(); /*结束总线*/
- // return(1);
- //}
- //
- //
- ///*******************************************************************
- // 向无子地址器件读字节数据函数
- //功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
- // 址sla,返回值在c.
- // 如果返回1表示操作成功,否则操作有误。
- //注意: 使用前必须已结束总线。
- //********************************************************************/
- //u8 IRcvByte_NoSub(unsigned char sla,unsigned char *c)
- //{
- // Start_I2c(); /*启动总线*/
- // SendByte(sla); /*发送器件地址*/
- // //if(IIC_ack==0)return(0);
- // *c=RcvByte(); /*读取数据*/
- // IIC_ack_I2c(1); /*发送非就答位*/
- // Stop_I2c(); /*结束总线*/
- // return(1);
- //}
- ///*******************************************************************
- // 向有子地址器件读字节数据函数
- //功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
- // 址sla,返回值在c.
- // 如果返回1表示操作成功,否则操作有误。
- //注意: 使用前必须已结束总线。
- //********************************************************************/
- //u8 IRcvByte(unsigned char sla,unsigned char suba,unsigned char *c)
- //{
- // Start_I2c(); /*启动总线*/
- // SendByte(sla); /*发送器件地址*/
- //// if(IIC_ack==0)return(0);
- // SendByte(suba); /*发送器件子地址*/
- //// if(IIC_ack==0)return(0);
- // *c=RcvByte(); /*读取数据*/
- // IIC_ack_I2c(1); /*发送非就答位*/
- // Stop_I2c(); /*结束总线*/
- // return(1);
- //}
- //
- ///*******************************************************************
- // 向有子地址器件读取多字节数据函数
- //功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
- // 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
- // 如果返回1表示操作成功,否则操作有误。
- //注意: 使用前必须已结束总线。
- //********************************************************************/
- //u8 IRcvStr(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);
- // Start_I2c(); /*重新启动总线*/
- // SendByte(sla);
- // if(IIC_ack==0)return(0);
- // for(i=0;i<no-1;i++)
- // {
- // *s=RcvByte(); /*发送数据*/
- // IIC_ack_I2c(0); /*发送就答位*/
- // s++;
- // }
- // *s=RcvByte();
- // IIC_ack_I2c(1); /*发送非应位*/
- // Stop_I2c(); /*结束总线*/
- // return(1);
- //}
- ///*******************************************************************
- // 向无子地址器件读取多字节数据函数
- //功能: 从启动总线到发送地址,读数据,结束总线的全过程.
- // 从器件地址sla,读出的内容放入s指向的存储区,
- // 读no个字节。如果返回1表示操作成功,否则操作有误。
- //注意: 使用前必须已结束总线。
- //********************************************************************/
- //u8 IRcvStr_NoSub(unsigned char sla,unsigned char *s,unsigned char no)
- //{
- // unsigned char i;
- // Start_I2c();
- // SendByte(sla);
- // //if(IIC_ack==0)return(0);
- // for(i=0;i<no-1;i++)
- // {
- // *s=RcvByte(); /*发送数据*/
- // IIC_ack_I2c(0); /*发送就答位*/
- // s++;
- // }
- // *s=RcvByte();
- // IIC_ack_I2c(1); /*发送非应位*/
- // Stop_I2c(); /*结束总线*/
- // return(1);
- //}
|