高级会员

- 积分
- 549
- 金钱
- 549
- 注册时间
- 2013-6-18
- 在线时间
- 59 小时
|

楼主 |
发表于 2013-11-12 12:37:07
|
显示全部楼层
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
//配置PB6  B7 为开漏输出 刷新频率为10Mhz
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//应用配置到GPIOB
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//应用配置到GPIOB
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/**************************实现函数********************************************
*函数原型: void IIC_Start(void)
*功 能: 产生IIC起始信号
*******************************************************************************/
void IIC_Start(void)
{
SDA_OUT(); //sda线输出
IIC_SDA=1;
IIC_SCL=1;
delay_us(7);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(1);
IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
// delay_us(5);
}
/**************************实现函数********************************************
*函数原型: void IIC_Stop(void)
*功 能: //产生IIC停止信号
*******************************************************************************/
void IIC_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL=0;
delay_us(1);
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(7);
IIC_SCL=1;
delay_us(7);
IIC_SDA=1;//发送I2C总线结束信号
delay_us(1);
IIC_SCL=0;
}
/**************************实现函数********************************************
*函数原型: u8 IIC_Wait_Ack(void)
*功 能: 等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
*******************************************************************************/
u8 IIC_Wait_Ack(void)
{
u16 ucErrTime=0;
IIC_SCL=0;
SDA_IN(); //SDA设置为输入
IIC_SDA=1;
// delay_us(5); //这里加了就出错,原因不明(产生了一个SCL高电平貌似,导致从机触发中断,误操作)
IIC_SCL=1;delay_us(8);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>1500)
{
IIC_Stop();
return 1;
}
// delay_us(1);
}
IIC_SCL=0;//时钟输出0
return 0;
/* IIC_SCL = 0;
IIC_SDA = 1;
SDA_IN(); //SDA设置为输入
IIC_SCL = 1;
delay_us(20); //15us??,????
if(1 == IIC_SDA) // ?SDA=1?????,???????ACK_Flag
return 1;
SDA_OUT();
IIC_SCL = 0;
return 0;*/
}
/**************************实现函数********************************************
*函数原型: void IIC_Ack(void)
*功 能: 产生ACK应答
*******************************************************************************/
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
// delay_us(2); // (加了出错)
IIC_SCL=1;
delay_us(8);
IIC_SCL=0;
}
/**************************实现函数********************************************
*函数原型: void IIC_NAck(void)
*功 能: 产生NACK应答
*******************************************************************************/
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
// delay_us(2); // (加了出错)
IIC_SCL=1;
delay_us(8);
IIC_SCL=0;
}
/*****************I2C读正常**************************/
#if 1
IIC_Start();
IIC_Send_Byte(0xa5);
// Receive_SLAVE_ACK();
if(IIC_Wait_Ack()){
return;
}
// IIC_Wait_Ack();
IIC_Send_Byte(0xB0); //读的长度 20 0001 0100
// Receive_SLAVE_ACK();
if(IIC_Wait_Ack()){
return;
}
// IIC_Wait_Ack();
for(i=0;i<24;i++){
if(i!=23) {
receive_slave = IIC_Read_Byte(1);
// printf("%4x",receive_slave);
}
else
{
receive_slave = IIC_Read_Byte(0);
// printf("%4x\r\n",receive_slave);
read_end=1;
}
}
IIC_Stop();
#endif |
|