原创 STM32模拟 IIC

2011-9-18 23:43 3064 8 8 分类: MCU/ 嵌入式

 

 

 

#ifndef __AT24C02_H__
#define __AT24C02_H__
#include"stm32f10x.h"
void    iicinit(void);
void    iicwrite(u8 add,u8 Achar);
u8      iicread(u8 add);
#endif

 

 

#include"stm32f10x.h"
#include"at24c02.h"
void  iicstart(void);
void  iicstop(void);
void  ack(void);
void  iicwritebyte(u8 a);
u8    iicreadbyte(void);
void  iicwrite(u8 add,u8 Achar);
u8    iicread(u8 add);
void  iicinit(void);
/////////////////////////////
void delay5us(void)//ums
{
    unsigned short i, j;
 unsigned short time;
 time=5;
 for(; time > 0; time--){
     for(j = 0; j < 5; j++){
      for(i = 0; i < 1; i++);
  }
 }
}
void delayms(unsigned short time)//nms
{
    unsigned short i, j;
 
 for(; time > 0; time--){
     for(j = 0; j < 10; j++){
      for(i = 0; i < 1004; i++);
  }
 }

}  
void iicinit(void)
{       
    GPIO_InitTypeDef  GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

 GPIO_Init(GPIOB, &GPIO_InitStructure); 
}


void iicstart(void)
{
   
 GPIO_SetBits(GPIOB,GPIO_Pin_7); //sda=1;
 delay5us();
 GPIO_SetBits(GPIOB,GPIO_Pin_6); //scl=1;
 delay5us();
 GPIO_ResetBits(GPIOB,GPIO_Pin_7); //sda=0;
 delay5us();

}
void iicstop(void)
{
  
 GPIO_ResetBits(GPIOB,GPIO_Pin_7); //sda=0;
 delay5us();
 GPIO_SetBits(GPIOB,GPIO_Pin_6); //scl=1;
 delay5us();
 GPIO_SetBits(GPIOB,GPIO_Pin_7); //sda=1;
 delay5us();

}
void  ack(void)
{      
 u16 i;
 GPIO_SetBits(GPIOB,GPIO_Pin_6);//scl=1;
 delay5us();
 while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)&&(i<0x2b0)) {i++;}
 GPIO_ResetBits(GPIOB,GPIO_Pin_6);//scl=0;
 delay5us();
}
void  iicwritebyte(u8 a)
{
    u16 i;
 GPIO_ResetBits(GPIOB,GPIO_Pin_6);  //scl=0;
 delay5us();
 for(i=0;i<8;i++)
 { 
  if(a&0x80)  
   GPIO_SetBits(GPIOB,GPIO_Pin_7);//sda=1;
  else
   GPIO_ResetBits(GPIOB,GPIO_Pin_7);;
  a=a<<1;
  GPIO_SetBits(GPIOB,GPIO_Pin_6);//scl=1;
  delay5us();
  GPIO_ResetBits(GPIOB,GPIO_Pin_6);//scl=0;
  delay5us(); 
   
 }   
    GPIO_SetBits(GPIOB,GPIO_Pin_7);//sda=1; 
 delay5us();

}
u8 iicreadbyte()
{
 u8 i,temp;
 temp=0;
 GPIO_SetBits(GPIOB,GPIO_Pin_7);//sda=1;
 delay5us();
 GPIO_ResetBits(GPIOB,GPIO_Pin_6);      //scl=0;
 delay5us();
 for(i=0;i<8;i++)
 {
     GPIO_SetBits(GPIOB,GPIO_Pin_6);  //scl=1;
     delay5us();
  delay5us();
  temp=(temp<<1)|GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);
  delay5us();
  GPIO_ResetBits(GPIOB,GPIO_Pin_6);  //scl=0;
  delay5us();
 }
 GPIO_SetBits(GPIOB,GPIO_Pin_7);//sda=1;
 delay5us();
 GPIO_ResetBits(GPIOB,GPIO_Pin_6);//scl=0;
 delay5us(); 
 return temp;
}

void  iicwrite(u8 add,u8 Achar)
{
    iicstart();
    iicwritebyte(0xa0);
    ack();
    iicwritebyte(add);
    ack();
    iicwritebyte(Achar);
    ack();
    iicstop();
    delayms(20);
}
u8  iicread(u8 add)
{
 u8 temp;
 iicstart();
 iicwritebyte(0xa0);
 ack();
 iicwritebyte(add);
 ack();
 iicstart();
 iicwritebyte(0xa1);
 ack();
 temp=iicreadbyte();
 ack();
 iicstop();
 return temp;
}

 

 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /3 下一条