#include "stm32f4xx.h"
#include "bsp.h"
#include "MainTask_Menu.h"
#include "LCD_RA8875.h"
#include "motor.h"
#include "area.h"
#include "show.h"
//模拟I2C总线的管脚定义
#define I2C_SCL_H GPIO_SetBits(GPIOB,GPIO_Pin_6)
#define I2C_SCL_L GPIO_ResetBits(GPIOB,GPIO_Pin_6)
#define I2C_SDA_H GPIO_SetBits(GPIOB, GPIO_Pin_7)
#define I2C_SDA_L GPIO_ResetBits(GPIOB, GPIO_Pin_7)
#define I2C_SDA_R GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)
/******************************************************************************
函数:I2C_Init()
功能:I2C总线初始化,使总线处于空闲状态
说明:在main()函数的开始处,应当执行一次本函数
******************************************************************************/
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高
}
void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/******************************************************************************
函数:I2C_Start()
功能:产生I2C总线的起始条件
说明:SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
本函数也用来产生重复起始条件
******************************************************************************/
void I2C_Start(void)
{
SDA_OUT(); //输出
I2C_SDA_H; Delay_us(10);
I2C_SCL_H; Delay_us(10);
I2C_SDA_L; Delay_us(10);
I2C_SCL_L; Delay_us(10);
}
///******************************************************************************
//函数:void I2C_Write(unsigned char dat)
//功能:向I2C总线写1个字节的数据
//参数:dat是要写到总线上的数据
//******************************************************************************/
void I2C_Write(unsigned char dat)
{
unsigned char i;
SDA_OUT(); //输出
for(i=0;i<8;i++)
{
if(dat & 0x80) I2C_SDA_H;
else I2C_SDA_L;
dat <<= 1;
Delay_us(10);
I2C_SCL_H; Delay_us(10);
I2C_SCL_L; Delay_us(10);
}
}
///******************************************************************************
//函数:unsigned char I2C_Read()
//功能:从机读取1个字节的数据
//返回:读取的1个字节数据
//******************************************************************************/
unsigned char I2C_Read(void)
{
unsigned char i;
unsigned char dat;
SDA_OUT();
I2C_SDA_H; //在读取数据之前,要把SDA拉高,使之处于输入状态
SDA_IN();
for(i=0;i<8;i++)
{
dat <<= 1;
if(I2C_SDA_R) dat++;
I2C_SCL_H; Delay_us(10);
I2C_SCL_L; Delay_us(10);
}
SDA_OUT(); //输出
I2C_SDA_L; Delay_us(10);
I2C_SCL_H; Delay_us(10);
I2C_SCL_L; Delay_us(10);
return dat;
}
///******************************************************************************
//函数:unsigned char I2C_GetAck()
//功能:读取从机应答位(应答或非应答),用于判断:从机是否成功接收主机数据
//返回:0-从机应答
// 1-从机非应答
//说明:从机在收到每一个字节后都要产生应答位,主机如果收到非应答则应当终止传输
//******************************************************************************/
void I2C_GetAck(void)
{
SDA_IN(); //输入
I2C_SDA_H; Delay_us(10);
I2C_SCL_H; Delay_us(10);
I2C_SCL_L; Delay_us(10);
SDA_OUT(); //输出
}
/******************************************************************************
函数:I2C_Stop()
功能:产生I2C总线的停止条件
说明:SCL处于高电平期间,当SDA出现上升沿时停止I2C总线
******************************************************************************/
void I2C_Stop(void)
{
I2C_SDA_L; Delay_us(10);
I2C_SCL_H; Delay_us(10);
I2C_SDA_H; Delay_us(10);
}
void eewrite(unsigned char *eedata,unsigned char address,unsigned char number)
{
unsigned char i;
for(i=0;i<number;i++)
{
I2C_Start(); //发送开始信号
I2C_Write(0xA0);//发送芯片地址和写命令
I2C_GetAck(); //读取从机应答
I2C_Write(address+i);//发送起始地址低8位
I2C_GetAck(); //读取从机应答
I2C_Write(eedata[i]);//发送从器件地址与读命令,读命令=1,
I2C_GetAck(); //读取从机应答
I2C_Stop(); //结束
Delay_ms(5); //最少延时3毫秒
}
}
void eeread(unsigned char *eedata,unsigned char address,unsigned char number)
{
unsigned char i;
I2C_Start(); //发送开始信号
I2C_Write(0xA0); //发送芯片地址和写命令
I2C_GetAck(); //读取从机应答
I2C_Write(address); //发送起始地址低8位
I2C_GetAck(); //读取从机应答
I2C_Start(); //发送开始信号
I2C_Write(0xA1); //发送芯片地址和读命令
I2C_GetAck(); //读取从机应答
for(i=0;i<number;i++)
{
eedata[i]=I2C_Read(); //发送从器件地址与读命令,读命令=1,
Delay_us(100); //保证数据读出
}
I2C_Stop(); //结束
}