基于STM32 的IIC 模拟主机编写

 最近在学习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; 
}

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MTUyODA0,size_16,color_FFFFFF,t_70

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值