bsp_i2c_gpio.c
#include "bsp_i2c_gpio.h"
#include "stm32f10x.h"
void IIC_Init(void) //初始化IIC的IO口
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(IIC_SCL_PORT_RCC,ENABLE);
GPIO_InitStructure.GPIO_Pin=IIC_SDA_PIN|IIC_SCL_PIN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(IIC_SCL_PORT,&GPIO_InitStructure);
SDA(1);
SCL(1);
}
void SDA_OUT(void) //SDA输出配置
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=IIC_SDA_PIN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure);
}
void SDA_IN(void) //SDA输入配置
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=IIC_SDA_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure);
}
void IIC_Start(void) // 起始
{
SDA_OUT();
SDA(1);
SCL(1);
SDA(0);
SCL(0);
}
void IIC_Stop(void) //停止
{
SDA_OUT();//sda线输出
SCL(0);
SDA(0);
SCL(1);
SDA(1);
}
char IIC_Wait_Ack(void) //检测应答 SDA 1非应答 0应答
{
int16_t tempTime=0;
SDA_IN(); //SDA设置为输入
SDA(1);
SCL(1);
while(EEPROM_I2C_SDA_READ())
{
tempTime++;
if(tempTime>250)
{
IIC_Stop();
return 1;
}
}
SCL(0);//时钟输出0
return 0;
}
void IIC_Send_Byte(char txd) //发送一个字节
{
uint8_t i;
SDA_OUT();
/* 先发送字节的高位bit7 */
SCL(0);
for (i = 0; i < 8; i++)
{
SDA(txd & (0x80 >> i));
SCL(1);
SCL(0);
}
}
char IIC_Read_Byte(void)
{
uint8_t i;
uint8_t value=0;
SDA_IN();//SDA设置为输入
SDA(1);
for(i=0;i<8;i++)
{
SCL(1);
if(EEPROM_I2C_SDA_READ()){value|=(0x80>>i);}
SCL(0);
}
return value;
}
void I2C_SendAck(unsigned char AckBit) //发送应答 AckBit 应答位,0为应答,1为非应答
{
SDA(AckBit);
SCL(1);
SCL(0);
}
bsp_i2c_gpio.h
#define IIC_SCL_PORT GPIOB
#define IIC_SCL_PIN (GPIO_Pin_6)
#define IIC_SCL_PORT_RCC RCC_APB2Periph_GPIOB
/* IIC_SDA时钟端口、引脚定义 */
#define IIC_SDA_PORT GPIOB
#define IIC_SDA_PIN (GPIO_Pin_7)
#define IIC_SDA_PORT_RCC RCC_APB2Periph_GPIOB
//IIC所有操作函数
void IIC_Init(void); //初始化IIC的IO口
void IIC_Start(void); // 起始
void IIC_Stop(void); //停止
void IIC_Send_Byte(char txd); //IIC发送一个字节
//char IIC_Read_Byte(char ack);//IIC读取一个字节
char IIC_Read_Byte(void); //IIC读取一个字节
char IIC_Wait_Ack(void); //检测应答 SDA 1非应答 0应答
void I2C_SendAck(unsigned char AckBit);//发送应答 AckBit 应答位,0为应答,1为非应答
#endif
bsp_i2c_ee.c
#include "bsp_i2c_ee.h"
#include "bsp_i2c_gpio.h"
void AT24CXX_Init(void)
{
IIC_Init();//IIC初始化
}
char AT24CXX_ReadOneByte(uint16_t ReadAddr) //指定地址读取一个字节
{
uint16_t temp=0;
IIC_Start(); //起始信号
IIC_Send_Byte(0xA0);
IIC_Wait_Ack(); //检测应答 0表示正确应答,1表示无器件响应
IIC_Send_Byte(ReadAddr); //发送低地址
IIC_Wait_Ack(); //检测应答 0表示正确应答,1表示无器件响应
IIC_Start(); //起始信号
IIC_Send_Byte(0XA1); //进入接收模式
IIC_Wait_Ack(); //检测应答 0表示正确应答,1表示无器件响应
temp=IIC_Read_Byte();
I2C_SendAck(1); //接收完发送非应答
IIC_Stop();//产生一个停止条件
return temp;
}
void AT24CXX_WriteOneByte(uint16_t WriteAddr,char DataToWrite) //在AT24CXX指定地址写入一个数据
{
IIC_Start(); //起始信号
IIC_Send_Byte(0XA0); //发送器件地址0XA0,写数据
IIC_Wait_Ack(); //检测应答 0表示正确应答,1表示无器件响应
IIC_Send_Byte(WriteAddr); //发送低地址
IIC_Wait_Ack(); //检测应答 0表示正确应答,1表示无器件响应
IIC_Send_Byte(DataToWrite); //发送字节
IIC_Wait_Ack(); //检测应答 0表示正确应答,1表示无器件响应
IIC_Stop();//产生一个停止条件
}
bsp_i2c_ee.h
#ifndef __I2C_EE_H
#define __I2C_EE_H
#define AT24C01 127
#define AT24C02 255
#define AT24C04 511
#define AT24C08 1023
#define AT24C16 2047
#define AT24C32 4095
#define AT24C64 8191
#define AT24C128 16383
#define AT24C256 32767
char AT24CXX_ReadOneByte(uint16_t ReadAddr); //指定地址读取一个字节
void AT24CXX_WriteOneByte(uint16_t WriteAddr,char DataToWrite); //指定地址写入一个字节
void AT24CXX_Init(void); //初始化IIC
#endif /* __I2C_EE_H */
|