目录
-----------------------------------------------------------------------------------------------------------------------------
stm32f030c8t6
IIC.c
#include "IIC.h"
/*******************************************************************************
* 函 数 名 : IIC_Init
* 函数功能 : IIC初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_I2C_PORT, ENABLE); /* 打开GPIO时钟 */
GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上拉
GPIO_Init(I2C_GPIO_PORT, &GPIO_InitStructure);
I2C_SDA_H ;//一开始先释放总线
I2C_SCL_H;
SDA_Out_Mode();
}
void SDA_Out_Mode(void)//设置SDA引脚的输出模式
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_I2C_PORT, ENABLE); /* 打开GPIO时钟 */
GPIO_InitStructure.GPIO_Pin = I2C_SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上拉
GPIO_Init(I2C_GPIO_PORT, &GPIO_InitStructure);
}
void SDA_In_Mode(void)//设置SDA引脚的输入模式
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_I2C_PORT, ENABLE); /* 打开GPIO时钟 */
GPIO_InitStructure.GPIO_Pin = I2C_SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//开漏输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上拉
GPIO_Init(I2C_GPIO_PORT, &GPIO_InitStructure);
}
void I2C_Start(void)//起始信号
{
/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
I2C_SDA_H;
Delay_us(Delay_I2C);
I2C_SCL_H;
Delay_us(Delay_I2C);
I2C_SDA_L;
Delay_us(Delay_I2C);
I2C_SCL_L;
}
void I2C_Stop(void)//停止信号
{
/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */
I2C_SDA_L;
Delay_us(Delay_I2C);
I2C_SCL_H;
Delay_us(Delay_I2C);
I2C_SDA_H;
Delay_us(Delay_I2C);
}
void I2C_SendByte(u8 Byte)//发送一个字节
{
u8 i;
for (i = 0; i < 8; i++)
{
I2C_SCL_L;
Delay_us(Delay_I2C);
if (Byte & 0x80)//0xA0 1010 0000
{
I2C_SDA_H;
}
else
{
I2C_SDA_L;
}
Delay_us(Delay_I2C);
I2C_SCL_H;
Byte <<= 1; // 左移一个bit
Delay_us(Delay_I2C);
}
//这里会产生错误 SCL 高电平 SDA 产生上升沿 导致产生START信号
// I2C_SDA_H;//释放总线,结束传送数据
//释放总线
I2C_SCL_L;
}
u8 I2C_ReceiveByte(void)//接收一个字节
{
u8 i,byte=0x00;
I2C_SDA_H;
SDA_In_Mode();
for(i=0;i<8;i++)
{
I2C_SCL_L;
Delay_us(Delay_I2C);
I2C_SCL_H;
if(I2C_SDA_Read)
{
byte|=(0x80>>i);
}
}
SDA_Out_Mode();
return byte;
}
u8 I2C_ReceiveAck(void)//接收/等待应答
{
u8 Ask=0,ucErrTime=0;
I2C_SCL_L;
Delay_us(Delay_I2C);
I2C_SDA_H;
Delay_us(Delay_I2C);
I2C_SCL_H;
while(I2C_SDA_Read)//如果成立,说明返回1,从机接收失败
{
ucErrTime++;
if(ucErrTime>10)
{
I2C_Stop();
SDA_Out_Mode();//输出模式
return 1;
}
}
I2C_SCL_L;
Delay_us(Delay_I2C);
return Ask;
}
void I2C_ACK(void)//发送应答0
{
I2C_SCL_L;
Delay_us(Delay_I2C);
I2C_SDA_L;//0
Delay_us(Delay_I2C);
I2C_SCL_H;
Delay_us(Delay_I2C);
I2C_SCL_L;
Delay_us(Delay_I2C);
}
void I2C_NACK(void)//发送应答1
{
I2C_SCL_L;
Delay_us(Delay_I2C);
I2C_SDA_H;//1
Delay_us(Delay_I2C);
I2C_SCL_H;
Delay_us(Delay_I2C);
I2C_SCL_L;
Delay_us(Delay_I2C);
}
IIC.h
#ifndef __IIC_H
#define __IIC_H
#include "main.h"
typedef enum
{
FAILED = 0,
PASSED = !FAILED
} TestStatus;
#define Delay_I2C 1
#define I2C_GPIO_PORT GPIOB /* GPIO端口 */
#define RCC_I2C_PORT RCC_AHBPeriph_GPIOB /* GPIO端口时钟 */
#define I2C_SCL_PIN GPIO_Pin_8 /* 连接到SCL时钟线的GPIO */
#define I2C_SDA_PIN GPIO_Pin_9 /* 连接到SDA数据线的GPIO */
#define I2C_SCL_H GPIO_SetBits(I2C_GPIO_PORT,I2C_SCL_PIN)
#define I2C_SCL_L GPIO_ResetBits(I2C_GPIO_PORT,I2C_SCL_PIN)
#define I2C_SDA_H GPIO_SetBits(I2C_GPIO_PORT,I2C_SDA_PIN)
#define I2C_SDA_L GPIO_ResetBits(I2C_GPIO_PORT,I2C_SDA_PIN)
#define I2C_SDA_Read GPIO_ReadInputDataBit(I2C_GPIO_PORT,I2C_SDA_PIN)
void IIC_Init(void);
void SDA_Out_Mode(void);
void SDA_In_Mode(void);
void I2C_Start(void);
void I2C_Stop(void);
void I2C_SendByte(u8 Byte);
u8 I2C_ReceiveByte(void);
u8 I2C_ReceiveAck(void);//接收(等待)从机的应答
void I2C_NACK(void);//发送应答
void I2C_ACK(void);
#endif
-------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------
stm32f103c8t6
代码是没问题的