阅读背景:

基于STM32 的IIC 模拟主机编写_lin小羊的博客

来源:互联网 

 最近在学习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; 
}#include "my



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: