最近在学习STM32 的IIC IO 模拟主机方式,好像失败了
#include "myiic.h"
#include "delay.h"
/********************************************************************
MCU:
VERSION :
DATA :
作者 :
other :
********************************************************************/
/********************************************************************
Function:IIC init
INPUT :
OUTPUT :
NOTE :
********************************************************************/
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// enable the GPIOC CLK
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);// 初始化IO
IIC_SCL=1;
IIC_SDA=1;
}
/********************************************************************
Function: IIC start Sigle
INPUT :
OUTPUT :
NOTE :
********************************************************************/
void IIC_Start(void)
{
SDA_OUT();
IIC_SDA = 1;
IIC_SCL = 1;
delay_us(IIC_DELAY_TIME);
IIC_SDA = 0;
delay_us(IIC_DELAY_TIME);
IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
/********************************************************************
Function: IIC Stop
INPUT :
OUTPUT :
NOTE :
********************************************************************/
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL = 0;
IIC_SDA = 0;
delay_us(IIC_DELAY_TIME);
IIC_SCL = 1;
IIC_SDA = 1;
delay_us(IIC_DELAY_TIME);
}
/********************************************************************
Function: watting ack
INPUT :
OUTPUT :
NOTE :
********************************************************************/
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();
IIC_SDA = 1;
delay_us(IIC_DELAY_TIME);
IIC_SCL = 1;
delay_us(IIC_DELAY_TIME);
while(READ_SDA )
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL = 0;
return 0;
}
/********************************************************************
Function: produce a ack
INPUT :
OUTPUT :
NOTE :
********************************************************************/
void IIC_Ack(void)
{
IIC_SCL = 0;
SDA_OUT();
IIC_SDA = 0;
delay_us(IIC_DELAY_TIME);
IIC_SCL = 1;
delay_us(IIC_DELAY_TIME);
IIC_SCL = 0;
}
/********************************************************************
Function:
INPUT :
OUTPUT :
NOTE :
********************************************************************/
void IIC_NAck(void)
{
IIC_SCL = 0;
SDA_OUT();
IIC_SDA = 1;
delay_us(IIC_DELAY_TIME);
IIC_SCL = 1;
delay_us(IIC_DELAY_TIME);
IIC_SCL = 0;
}
/********************************************************************
Function:IIC 发送字节
INPUT :
OUTPUT :
NOTE :返回从机有无应答 1,有应答 0,无应答
********************************************************************/
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;//拉低时钟开始数据传输
for(t= 0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
txd<<= 1;
delay_us(IIC_DELAY_TIME);
IIC_SCL =1;
delay_us(IIC_DELAY_TIME );
IIC_SCL = 0;
delay_us(IIC_DELAY_TIME );
}
}
/********************************************************************
Function:read byte
INPUT :
OUTPUT :
NOTE :ack = 1 ;send Ack ack = 0;发送nack
********************************************************************/
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入
for(i = 0;i<8 ;i++)
{
IIC_SCL=0;
delay_us(IIC_DELAY_TIME);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(IIC_DELAY_TIME);
}
// 应答
if(!ack)
{
IIC_NAck();
}
else
{
IIC_Ack(); //发送ACK
}
return receive;
}