新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32模擬 IIC

        STM32模擬 IIC

        作者: 時間:2012-09-10 來源:網絡 收藏

        #ifndef __AT24C02_H__

        本文引用地址:http://www.104case.com/article/148435.htm

        #define __AT24C02_H__

        #includestm32f10x.h

        void iicinit(void);

        void iicwrite(u8 add,u8 Achar);

        u8 iicread(u8 add);

        #endif

        #includestm32f10x.h

        #includeat24c02.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)(i0x2b0)) {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;i8;i++)

        {

        if(a0x80)

        GPIO_SetBits(GPIOB,GPIO_Pin_7);//sda=1;

        else

        GPIO_ResetBits(GPIOB,GPIO_Pin_7);;

        a=a1;

        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;i8;i++)

        {

        GPIO_SetBits(GPIOB,GPIO_Pin_6); //scl=1;

        delay5us();

        delay5us();

        temp=(temp1)|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;

        }



        關鍵詞: IIC 模擬 STM32

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 望都县| 格尔木市| 虎林市| 铅山县| 友谊县| 平潭县| 白山市| 盐边县| 济源市| 外汇| 金溪县| 那曲县| 张家口市| 平顶山市| 旬邑县| 甘洛县| 礼泉县| 江川县| 陇西县| 西畴县| 富宁县| 伊川县| 樟树市| 怀柔区| 黄大仙区| 昌都县| 华安县| 抚顺市| 罗平县| 石阡县| 鱼台县| 论坛| 山阳县| 通州市| 股票| 临邑县| 镇康县| 阳城县| 林口县| 元阳县| 金秀|