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)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>