基於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; 
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章