iic通信驱动

2019-08-23 13:59发布

iic通信驱动搞了好久,就验证了,没问题,延时函数我打了,自己可以改






#include "IIC.h"//#define I2C_SETSCL        GPIO_SetBits(GPIOB,GPIO_Pin_10);
//#define I2C_SETSDA        GPIO_SetBits(GPIOB,GPIO_Pin_11);
//#define I2C_RESETSCL        GPIO_ResetBits(GPIOB,GPIO_Pin_10);
//#define I2C_RESETSDA        GPIO_ResetBits(GPIOB,GPIO_Pin_11);


void I2C_START(void)
{         SDA_OUT();
     I2C_SETSDA;
         I2C_SETSCL;
         Delay10us();
         I2C_RESETSDA;
         Delay10us();
         I2C_RESETSCL;
//         printf("I2C_START");
}
void I2C_STOP(void)
{         SDA_OUT();
         I2C_SETSCL;
         I2C_RESETSDA;
         Delay10us();
         I2C_SETSDA;
         Delay10us();
}
int I2C_Wait_ACK(void)
{         u8 flag=1;
//   DA_OUT();
//   2C_SETSDA;
//         Delay10us();
         SDA_IN();         
//         Delay10us();      
         I2C_SETSCL;
         Delay10us();
         if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)==1)
                 flag=1;
         else
                 flag=0;                                         
         I2C_RESETSCL;
         Delay10us();
         //SDA_OUT();       
        return flag;
}
void I2C_ACK(void)
{       
     SDA_OUT();
         I2C_RESETSDA;
         I2C_SETSCL;
         Delay10us();
         I2C_RESETSCL;
         Delay10us();
}
void I2C_NACK(void)
{         
     SDA_OUT();
         I2C_SETSDA;
         I2C_SETSDA;
         Delay10us();
         I2C_RESETSCL;
         Delay10us();
}
void IIC_SendByte(u8 Data)
{
    u8 i;
        SDA_OUT();
        for(i=0;i<8;i++)
        {         
         if(Data&0x80)
         {
            I2C_SETSDA;          
         }
         else
         {
                  I2C_RESETSDA;
         }
          Data<<=1;
          I2C_SETSCL;
          Delay10us();
          I2C_RESETSCL;
          Delay10us();
        }
   I2C_Wait_ACK();
}
u8 IIC_ReadByte(void)
{
    u8 i,Data=0;
        SDA_IN();       
        Delay10us();
        for(i=0;i<8;i++)
        {
          Data<<=1;       
          I2C_SETSCL;
          Delay10us();
         if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11))
         {
          Data++;
         }
//         else
//         {
//          Data=Data+0;
//         }
//         
         Delay10us();
         I2C_RESETSCL;
         Delay10us();

        }
  SDA_OUT();
  return Data;
}


void i2c_Port_Init(void)
{                                             
        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);
}
  void SDA_OUT(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP  ; //开漏输出
  GPIO_Init(GPIOB,&GPIO_InitStructure);
}
  void SDA_IN(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//上拉输入
  GPIO_Init(GPIOB,&GPIO_InitStructure);
}
#include <stm32f10x_lib.h>
#include "Delay.h"

void IIC_Init(void);
void I2C_ACK(void);
void I2C_NACK(void);
void I2C_STOP(void);
void I2C_START(void);
void IIC_SendByte(u8 Data);
int I2C_Wait_ACK(void);
u8 IIC_ReadByte(void);
void SDA_OUT(void);
void SDA_IN(void);
void i2c_Port_Init(void);

#define I2C1_SLAVE_ADDRESS7   0x23                /* 定义 I2C1 本地地址为0x30 */
#define I2C2_SLAVE_ADDRESS7   0x30                /* 定义 I2C2 本地地址为0x30 */

#define I2C_SETSCL        GPIO_SetBits(GPIOB,GPIO_Pin_10)
#define I2C_SETSDA        GPIO_SetBits(GPIOB,GPIO_Pin_11)
#define I2C_RESETSCL        GPIO_ResetBits(GPIOB,GPIO_Pin_10)
#define I2C_RESETSDA        GPIO_ResetBits(GPIOB,GPIO_Pin_11)






友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
操作系统
1楼-- · 2019-08-23 19:57
I2C的时钟线,数据线都应该配置为开漏输出,才好.推挽输出不推荐.
1103272867
2楼-- · 2019-08-23 21:10
开漏输出,需要加上拉电阻5.1,好像不怎么实现‘

一周热门 更多>