单片机 > 单片机程序设计 > 详情

STM32模拟IIC程序

发布时间:2024-10-08 发布时间:
|

    #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;

    }



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STC89C52RC单片机的NRF24L01无线通信程序.收发一体