STM32 模拟I2C (STM32F051)

发布者:素雅之韵最新更新时间:2018-04-15 来源: eefocus关键字:STM32  模拟I2C  STM32F051 手机看文章 扫描二维码
随时随地手机看文章

/** 

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

  * @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);       

}  


关键字:STM32  模拟I2C  STM32F051 引用地址:STM32 模拟I2C (STM32F051)

上一篇:STM32模拟IIC读写24CXX
下一篇:STM32F407和STM32F051主从I2C通信方法

推荐阅读最新更新时间:2024-03-16 16:00

STM32输入AB相脉冲的编码器程序
// STM32输入AB相脉冲的编码器程序 // 程序中使用TIM5计数器计数AB相脉冲,如果将TIM5修改成其他定时器也能适用。 // PA0和PA1分别作为A、B相脉冲输入 // 可以另外再使用一个定时器,定时读出脉冲数TIM5- CNT // 作者: bjtea // http://blog.csdn.net/bjtea/article/details/8528389 // 以下程序摘自本人做的一个项目,因此可以放心代码的使用 #include stm32f10x_tim.h void T5_Encoder_Configration(void) { GPIO_InitTypeDef GPIO_InitStructu
[单片机]
STM32操作 I/O 口的步骤
先来总结一下 STM32 操作 I/O 口的步骤(以精英板为例): ① 使能 I/O 口时钟,调用函数为RCC_APB2PeriphClockCmd(); ② 初始化 I/O 参数,调用GPIO_Init(); ③ 操作 I/O 口 看了STM32操作 I/O 口的步骤,是不是一头雾水,因为我们以前学习51单片机的时候,根本没有这么麻烦,I/O 想输入就直接读,想输出就直接赋值,串口、AD转化、外部中断等等也都是想用就用,不需要单独配置时钟。 51单片机的这种做法确实很方便,不需要有乱七八糟的设置就能让芯片跑起来,但是随之带来的就是所谓的功耗问题。换句话来说就是一些资源根本用不上,但是芯片却还给它分配资源,即增加了芯片的负担,
[单片机]
STM32用PWM +DMA驱动 WS2812
参考的代码: ------------------------------------WS2812B.c------------------------------------ #include WS2812B.h /* Buffer that holds one complete DMA transmission * * Ensure that this buffer is big enough to hold * all data bytes that need to be sent * * The buffer size can be calculated as follows: * number of L
[单片机]
stm32跑马灯——寄存器和位操作
寄存器版: GPIO基础: 每组io口有7个寄存器。也就是7个寄存器,一共可以控制一组GPIO的16个IO口。 硬件连接: 例如: 由上图1可知:要使用到LED0和LED1,他们的IO口分别为PB5和PE5 由上图2可知:要使用到LED0和LED1,他们的IO口分别为PA8和PD2 GPIO的输出模式为推挽输出。 代码: 使能IO口时钟:配置寄存器RCC APB2ENR. 初始化IO口模式:配置寄存器GPIOx CRH/CRL 操作IO口,输出高低电平:配置寄存器GPIOX_ODR或者BSRR/BRR. 这里采用上图1的的原理图: led.h: #ifndef __LED_H //避免重复引用 #d
[单片机]
<font color='red'>stm32</font>跑马灯——寄存器和位操作
C语言宏定义的使用原理
使用STM32开发的朋友不知道是否有发现过这样的一些宏定义? 如下: #if defined (__CC_ARM) #pragma anon_unions #endif 看到上面的语句一开始确实搞不懂为什么要写这些东西,通过上网去查询,才搞明白这其中的使用原理。 上面的代码段我们可以看到两部分的内容: 1) __CC_ARM 2) #pragma anon_unions 这两个都有啥用呢? 待我一一道来! 1、__CC_ARM 是 ARM 编译中的宏选项 __CC_ARM 是一个编译器的选项,在ARM开发中根据开发环境的不同,有好几个可选的宏选项。
[单片机]
STM32学习:ADC/DMA/USART
  学习STM32的ADC转换,在开发板上写程序调试。   四个任务:   1.AD以中断方式(单次)采集一路   2.AD以中断方式连续采集四路   3.AD以DMA方式采集一路,DMA深度为一级   4.AD以DMA方式采集四路,每路DMA深度为28级,并滤波,说明滤波原理。   总结:   第一个任务:ADC以中断方式采集一路ADC,通过配置ADC_InitStructure结构体中的ADC_ScanConvMode,它规定模数转换工作在扫描模式(多通道)还是单次模式(单通道),   ADC_InitStructure.ADC_ScanConvMode=DISABLE,为单通道单次模式。   ADC_ContinuousCo
[单片机]
STM32学习014_STC89C51RC
STC89C52rc是STC公司生产的一种低功耗、高性能的CMOS8位控制器,具有8k字节系统可编程FLASH存储器。stc89c51用的是经典的MCS-51内核,但是做了很多改进,使芯片具有传统51不具备的功能,但单芯上有灵活的8位CPU和系统可编程FLASH。 标准功能:8k字节Flash,512字节Ram,32位I/O口线,看门狗定时器,内置4KBEEPROM,max810复位电路,3个16位的定时器/计数器,4个外部中断,一个向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口,另外,stc89c52可降至0hz静态逻辑操作,支持两种软件可选择节电模式,空闲状态下,CPU停止工作,允许RAM,定时器/计数器,
[单片机]
STM32 CustomHID 的实现
如何建立一个自定义的HID工程呢?下面就来讲讲。 首先先介绍下工程的架构,工程的总体架构下图所示,按照下图架构建工程: 分析下工程布局,首先是APP,这个组里存放着主文件mian.c,管理所有中断服务程序stm3210x_it.c,及其管理外设库头文件的stm32f10x_conf.h。BSP这个组里存放着BSP.c,外设的洗衣初始化都在这个函数中定义,比如说串口的配置,LED灯的配置,系统时钟的配置,各类NVIC的中断配置。在这个文件中,会定义一个BSP_Init()函数,所有配置的都在这个函数中调用,例如: void BSP_Init(void) { RCC_Configuration(); Set_USBCloc
[单片机]
<font color='red'>STM32</font> CustomHID 的实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved