历史上的今天
返回首页

历史上的今天

今天是:2025年04月15日(星期二)

正在发生

2018年04月15日 | STM32 模拟I2C (STM32F051)

2018-04-15 来源:eefocus

/** 

  ****************************************************************************** 

  * @file      i2c simu.c 

  * @brief     simulation function 

  * @CPU       STM32F051 

  * @compiler  Keil uVision V4.74 

  * @author    MetalSeed 

  * @copyright WSHHB 

  * @version   V1.0.0 

  * @date      18-Sept-2014 

  * @modifydate20-Sept-2014 

  ****************************************************************************** 

  * @attention 

  */  

  

#include "boardAPI.h"  

#include "i2cSimu.h"  

#include "delay.h"  

#include "uart.h"  

  

GPIO_InitTypeDef        GPIO_InitStructure;    

     

    

/** 

  * @brief  IIC Init 

  * @param  A: 

  * @retval None 

  */  

void IIC_Init(void)  

{                          

    RCC_AHBPeriphClockCmd(  RCC_AHBPeriph_GPIOF, ENABLE );    

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;  

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ;   //ÍÆÍìÊä³ö  

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

    GPIO_Init(GPIOF, &GPIO_InitStructure);  

    GPIO_SetBits(GPIOF,GPIO_Pin_6|GPIO_Pin_7);  //PB10,PB11 Êä³ö¸ß  

}  

  

/** 

  * @brief  Set SDA Pin as Output Mode 

  * @retval None 

  */  

void SDA_OUT()    

{    

  GPIO_StructInit(&GPIO_InitStructure);    

  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_7;    

  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;    

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;    

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     

  GPIO_Init(GPIOF, &GPIO_InitStructure);    

}    

  

/** 

  * @brief  Set SDA Pin as Input Mode 

  * @retval None 

  */  

void SDA_IN()    

{    

  GPIO_StructInit(&GPIO_InitStructure);    

  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_7;    

  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;  

  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;// !!!  

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     

  GPIO_Init(GPIOF, &GPIO_InitStructure);    

}   

  

/** 

  * @brief  read input voltage from SDA pin 

  * @retval None 

  */  

BYTE SDA_READ()  

{  

  return GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_7);  

}  

  

/** 

  * @brief  output high form SDA pin 

  * @retval None 

  */  

void IIC_SDA_1()  

{  

  GPIO_SetBits(GPIOF, GPIO_Pin_7);  

}  

  

/** 

  * @brief  output low form SDA pin 

  * @retval None 

  */  

void IIC_SDA_0()  

{  

  GPIO_ResetBits(GPIOF, GPIO_Pin_7);  

}  

  

/** 

  * @brief  output high form SCL pin 

  * @retval None 

  */  

void IIC_SCL_1()  

{  

GPIO_SetBits(GPIOF, GPIO_Pin_6);  

}  

  

/** 

  * @brief  output LOW form SCL pin 

  * @retval None 

  */  

void IIC_SCL_0()  

{  

GPIO_ResetBits(GPIOF, GPIO_Pin_6);    

}  

  

  

/** 

* @brief  Simulate IIC conmunication :Create Start signal 

  * @retval None 

  */  

void IIC_Start(void)  

{  

    SDA_OUT();     //sda output  

    IIC_SDA_1();            

    IIC_SCL_1();  

    delayus(4);  

    IIC_SDA_0();   //START:when CLK is high,DATA change form high to low   

    delayus(4);  

    IIC_SCL_0();   //hold scl line, prepare to transmit data  

}       

  

/** 

  * @brief  Simulate IIC conmunication : Create Stop signal 

  * @retval None 

  */  

void IIC_Stop(void)  

{  

    SDA_OUT();    //sda output mode   

    IIC_SCL_0();  

    IIC_SDA_0();  //STOP:when CLK is high DATA change form low to high  

    delayus(4);  

    IIC_SCL_1();   

    IIC_SDA_1();  //indicate transmit over  

    delayus(4);                               

}  

  

/** 

* @brief  Simulate IIC conmunication : wait for target device's ACK 

* @retval ACK (0) : receive success 

* @retval NACK(1) : receive unsuccess 

  */  

BYTE IIC_Wait_Ack(void)  

{  

    BYTE ucErrTime = 0;  

    SDA_IN();      //set as input mode  

    IIC_SDA_1();  

  delayus(1);        

    IIC_SCL_1();  

  delayus(1);      

    while(SDA_READ())  

    {  

        ucErrTime++;  

        if(ucErrTime > 250)  

        {  

            IIC_Stop();  

            return 1;  

        }  

    }  

    IIC_SCL_0(); //release scl line  

    return 0;    

}   

  

/** 

  * @brief  Simulate IIC conmunication : make an ACK 

  * @retval None 

  */  

void IIC_Ack(void)  

{  

    IIC_SCL_0();  

    SDA_OUT();  

    IIC_SDA_0();  

    delayus(2);  

    IIC_SCL_1();  

    delayus(2);  

    IIC_SCL_0();  

}  

  

/** 

  * @brief  Simulate IIC conmunication : don't make an ACK 

  * @retval None 

  */  

void IIC_NAck(void)  

{  

    IIC_SCL_0();  

    SDA_OUT();  

    IIC_SDA_1();  

    delayus(2);  

    IIC_SCL_1();  

    delayus(2);  

    IIC_SCL_0();  

}                                          

  

  

/** 

  * @brief  Simulate IIC conmunication : Transmit one byte Data 

  * @param  txd: data to be transmit 

  * @retval None 

  */  

void IIC_Send_Byte(BYTE txd)  

{                          

  BYTE i;     

  SDA_OUT();          

  IIC_SCL_0();//push down scl  to start transmit data  

  for(i = 0; i < 8; ++i)  

  {                

    if(txd & 0x80)  

    {  

      IIC_SDA_1();  

    }  

    else  

    {  

      IIC_SDA_0();  

    }  

    txd <<= 1;        

    delayus(2);     

    IIC_SCL_1();  

    delayus(2);   

    IIC_SCL_0();      

    delayus(2);  

  }    

}       

  

//¶Á1¸ö×Ö½Ú£¬ack=1ʱ£¬·¢ËÍACK£¬ack=0£¬·¢ËÍnACK     

/** 

  * @brief  Simulate IIC conmunication : Receive one byte Data 

  * @param  ack: Whether transmit ACK 

  * @retval the data have been receive 

  */  

BYTE IIC_Read_Byte(unsigned char ack)  

{  

    unsigned char i, res = 0;  

    SDA_IN();               //SDA input mode  

  for(i = 0; i < 8; ++i )  

    {  

    IIC_SCL_0();   

    delayus(2);  

    IIC_SCL_1();  

    res <<= 1;  

    if(SDA_READ())  

    {  

      res++;   

    }        

        delayus(1);   

  }                    

  if (!ack)  

  {  

    IIC_NAck();//make NACK  

  }  

  else  

  {  

    IIC_Ack(); //make ACK  

  }  

  return res;  

}  

  

  

/*JUST SOME TEST FUNTION DEMO*/  

BYTE ReadData()  

{                   

    BYTE temp=0;                                                                                   

  IIC_Start();    

      

  IIC_Send_Byte(0x80);   

    IIC_Wait_Ack();   

    

  IIC_Send_Byte(0xf5);   

    IIC_Wait_Ack();       

      

  IIC_Start();               

    IIC_Send_Byte(0XA1);   

    IIC_Wait_Ack();    

    

  temp=IIC_Read_Byte(0);             

  IIC_Stop();  

    return temp;  

}  

  

void WriteData(BYTE DataToWrite)  

{                                                                                              

  IIC_Start();    

  IIC_Send_Byte(0x80);  

  if( IIC_Wait_Ack() == 0)  

  {  

     printf("Recieve ACK \n");  

  }      

    

  IIC_Send_Byte(0xf5);  

    IIC_Wait_Ack();                                                          

      

  IIC_Send_Byte( DataToWrite );   

    IIC_Wait_Ack();                      

    

  IIC_Stop();  

    delayms(10);       

}  


推荐阅读

史海拾趣

DUCATI公司的发展小趣事

在电子行业中,DUCATI公司(杜卡迪摩托控股公司)的发展历程尤为独特,它从一个无线电通信技术的研究和生产公司,逐渐发展成为享誉全球的摩托车生产商。以下是五个与DUCATI公司电子行业起源及其后来摩托车业务发展起来的相关故事:

  1. 无线电通信技术的奠基

1926年,DUCATI家族工程师Antonio Cavalieri Ducati与意大利波隆那地区的绅士合作,成立了杜卡迪无线电器材制造公司。公司专注于无线电通信技术的研究和生产,为后来的发展奠定了坚实的基础。尽管当时并未涉足摩托车行业,但这一技术积累为公司带来了重要的经验和资金储备。

  1. 战火中的坚持与转型

第二次世界大战期间,杜卡迪的工厂不幸毁于战火。然而,在战后的废墟中,公司看到了对车辆需求的逐渐增加。不久后,杜卡迪开始踏入其他工业领域,为后来的摩托车业务探索了新的道路。这种逆境中求生存、转型谋发展的精神,是杜卡迪文化中不可或缺的一部分。

  1. Cucciolo引擎的突破

1946年,杜卡迪推出了企业史上的第一具单汽缸引擎Cucciolo。这款引擎由当时的意大利工业振兴协会管理,设计者为都灵的SIATA公司。虽然最初只是装置在脚踏车上的小型引擎,但这一突破性的技术为杜卡迪进入机车制造领域打开了大门。Cucciolo引擎的成功研发,为杜卡迪摩托车部门的成立奠定了基础。

  1. Cruiser机车的问世

1952年,杜卡迪推出了第一部配备电动启动马达和自动变速系统、排气量175cc的机车Cruiser。这款机车标志着杜卡迪正式成为机车制造厂,并为其在摩托车行业的地位奠定了基础。Cruiser的成功问世,进一步巩固了杜卡迪在摩托车市场的地位。

  1. Monster与916的辉煌

进入90年代后,杜卡迪在摩托车设计和技术上取得了重大突破。1993年,阿根廷设计师Miguel Galluzzi设计的Monster为杜卡迪在财务危机的愁云惨雾中找到了曙光。而1994年推出的916更是杜卡迪划时代的革命性作品,这款车型获得了世界经典名车的殊荣。Monster和916的成功设计不仅展现了杜卡迪在摩托车设计上的独特魅力,也为其在全球市场上赢得了广泛的赞誉。

以上五个故事展示了DUCATI公司在电子行业中的起源以及后来摩托车业务的发展过程。这些故事不仅体现了公司的创新精神和技术实力,也展现了其在逆境中求生存、转型谋发展的坚定信念。

FCI / Amphenol公司的发展小趣事

FCI公司起源于1988年,当时由Framatome组建,其初衷是作为核能领域外的一个多样化经营项目。然而,随着市场的变化和公司的战略调整,FCI逐渐将重心转向连接器制造。经过20多次的精心收购和策略性扩张,FCI在短短20年内便成长为全球最大的连接器制造公司之一。这一转变不仅展现了FCI对市场敏锐的洞察力,也体现了其卓越的管理能力和执行力。

HDK(北陆电气)公司的发展小趣事

FCI公司起源于1988年,当时由Framatome组建,其初衷是作为核能领域外的一个多样化经营项目。然而,随着市场的变化和公司的战略调整,FCI逐渐将重心转向连接器制造。经过20多次的精心收购和策略性扩张,FCI在短短20年内便成长为全球最大的连接器制造公司之一。这一转变不仅展现了FCI对市场敏锐的洞察力,也体现了其卓越的管理能力和执行力。

兵字(BingZi)公司的发展小趣事

随着公司规模的不断扩大和产品线的日益丰富,兵字公司开始注重品牌建设和市场拓展。公司注册了“BingZi兵字”商标,并通过一系列的市场推广活动,提升了品牌的知名度和美誉度。同时,兵字公司还积极开拓国内外市场,与多家知名企业建立了长期稳定的合作关系,实现了业务的快速增长。

Essentra Components公司的发展小趣事

面对日益激烈的市场竞争,Essentra Components公司决定实施全球化战略,以拓展更广阔的市场。公司先后在亚洲、欧洲、美洲等多个地区设立了生产基地和销售服务点,实现了产品的全球覆盖。同时,公司还积极与当地企业合作,共同开发适合当地市场需求的产品,进一步巩固了其在全球市场的地位。

Barkston Plastics Engineering Ltd.公司的发展小趣事

面对国内市场的饱和,Barkston Plastics Engineering Ltd.开始寻求国际化发展的道路。然而,国际市场环境的复杂性和文化差异给公司带来了诸多挑战。在经历了一系列的市场调研和风险评估后,Barkston成功打入欧洲市场,通过与当地企业的合作,逐步扩大了其国际影响力。这一国际化发展进程不仅为公司带来了更广阔的市场空间,也提升了其在全球电子行业中的地位。

问答坊 | AI 解惑

SD街头快打音乐用AVR单片机播放

SD街头快打音乐用AVR单片机播放…

查看全部问答>

请教一个有关反相时钟驱动路径的约束

电路中用相位相反的时钟去触发相邻触发器。 如果有一个触发器FF1的输出经过组合逻辑电路后与触发器FF2的输入, 除了输出延时外,请问还要如何进行约束? …

查看全部问答>

半天时间搞懂模拟电路

模拟电路精简教程。四十余页包含了模拟电路几乎所有重要知识点,讲解精细,透彻。不敢私藏,传上来与众共享。…

查看全部问答>

求救!有关WinCE6.0 R2 NandFlash驱动的新架构MDD+PDD+FMD的问题

现在NANDFlash驱动的新架构MDD+PDD+FMD已经抛弃了旧的分区驱动mspart和MBR格式,采用region+partition的概念,整个nandflash分为多个region,每个region又可分为多个partition,每个region的开头有一个分区表。 有哪位达人知道这个分区表的格式? ...…

查看全部问答>

指令在哪?

我想开始一个I/O 程序,如何开始?指令及汇编的资料找不到,用C也不知如何开始  …

查看全部问答>

STM32F100C系列如何在不使用JTAG和SWD的情况下烧写程序?

STM32F100C系列如何在不使用JTAG和SWD的情况下烧写程序? 我是新手,请多多指教!…

查看全部问答>

如何学习松翰单片机

有没有成套的松翰开发板买。像51一样方便编译的。 如果没有,请问我要买什么硬件。请列出来 还有,那个松翰仿真器,是不是有接口来连接硬件使用的。就是不用芯片,直接可以接到硬件上使用。 谢谢了…

查看全部问答>

参与HELPER2416开发板助学计划-----(1)晒晒板子

本帖最后由 cf0609 于 2014-7-18 22:55 编辑 前两天就收到板子了,因一些事情耽搁了一下,不好意思哈,现在才来发帖。今天先来晒晒板子的靓照吧。先来个全家福:板子的配件很齐全,除了jlink所有会用到的东西都有。 给板子上电看看,,,开机就 ...…

查看全部问答>

晒WEBENCH设计的过程+时钟电路设计

1.输入参数 2.生成几种可供选着的解决方案,右下角 3.方框图 4.电路的相关信息 5.相位噪声 6.相位噪声值 7.环路滤波器的参数和电路设定 8.波特图 …

查看全部问答>

请教音频放大的IC TDA8543T的使用与验证

本帖最后由 benny512 于 2015-1-6 18:59 编辑 小弟最近买几颗TDA8543T,怕买到是旧货。请教下各位高手如何使用示波器去验证TDA8543T好坏 规格书验证电路如下: 条件也按照规格书上面的来VCC=5V 1KHZ 。 我直接输入1KHZ的频率在输入端,输出端O ...…

查看全部问答>