STM32 模拟I2C 程序

发布者:SereneHarmony最新更新时间:2017-11-07 来源: eefocus关键字:stm32  模拟i2c 手机看文章 扫描二维码
随时随地手机看文章

STM32的硬件I2C不太好用,N多人深受其困扰,本人也不例外.所以干脆一不做二不休,用模拟的I2C算了,虽然速度不及硬件I2C,在一般的应用中还是不错的.帖上代码和协议分析图,造福广大受STM32的I2C困扰的朋友,哈哈!为了跟硬件I2C有所区别,本人把模拟的I2C名字写成TWI.

H文件内容如下:

#i nclude "stm32f10x.h"
#ifndef _TWI_H_
#define _TWI_H_

//条件编译 1:使用软件模拟I2C
#define TWI_ENABLE 1

#define TWI_SCL_0 GPIOB->BRR=GPIO_Pin_8
#define TWI_SCL_1 GPIOB->BSRR=GPIO_Pin_8
#define TWI_SDA_0 GPIOB->BRR=GPIO_Pin_9
#define TWI_SDA_1 GPIOB->BSRR=GPIO_Pin_9
#define TWI_SDA_STATE (GPIOB->IDR&GPIO_Pin_9)

enum ENUM_TWI_REPLY
{
TWI_NACK=0 
,TWI_ACK=1
};

enum ENUM_TWI_BUS_STATE
{
TWI_READY=0
,TWI_BUS_BUSY=1
,TWI_BUS_ERROR=2
};

#define TWI_RETRY_COUNT 3 //重试次数

extern void Delay_mS(u32 n);
#define DELAY Delay_mS(40)
#define RETRY_DELAY Delay_mS(50)

void TWI_Initialize(void);
u8 TWI_START(void);
void TWI_STOP(void);
u8  TWI_SendByte(u8 Data);
u8 TWI_ReceiveByte(void);
void TWI_SendACK(void);
void TWI_SendNACK(void);
#endif

C文件如下:

#i nclude "TWI.h"
#i nclude "Global.h"
#define TWI_NOP TWI_Delay()


void TWI_Delay(void)
{
 u32 i=5;
 while(i--); 
}


void TWI_Initialize(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
 
  TWI_SDA_1;
 TWI_SCL_1; 
  GPIO_Init(GPIOB, &GPIO_InitStructure);
 
  //////DebugPrint("Software TWI Initializing...n"); 
}


u8 TWI_START(void)

 TWI_SDA_1; 
 TWI_NOP;
   
 TWI_SCL_1; 
 TWI_NOP;    

 if(!TWI_SDA_STATE)
 {
  ////DebugPrint("TWI_START:BUSYn");
  return TWI_BUS_BUSY;
 }
 TWI_SDA_0;
 TWI_NOP;
  
 TWI_SCL_0;  
 TWI_NOP; 

 if(TWI_SDA_STATE)
 {
  ////DebugPrint("TWI_START:BUS ERRORn");
  return TWI_BUS_ERROR;
 } 
 
 return TWI_READY;
}


void TWI_STOP(void)
{
 TWI_SDA_0; 
 TWI_NOP;
   
 TWI_SCL_1; 
 TWI_NOP;    

 TWI_SDA_1;
 TWI_NOP;
  
// TWI_SCL_0;  
// TWI_NOP;  

 //////DebugPrint("TWI_STOPn");   
}


void TWI_SendACK(void)
{
 TWI_SDA_0;
 TWI_NOP;
 TWI_SCL_1;
 TWI_NOP;
 TWI_SCL_0; 
 TWI_NOP; 
 //////DebugPrint("TWI_SendACKn");   
}


void TWI_SendNACK(void)
{
 TWI_SDA_1;
 TWI_NOP;
 TWI_SCL_1;
 TWI_NOP;
 TWI_SCL_0; 
 TWI_NOP;
 //////DebugPrint("TWI_SendNACKn");    
}


u8 TWI_SendByte(u8 Data)
{
 u8 i;
 TWI_SCL_0;
 for(i=0;i<8;i++)
 {  
  //---------数据建立----------
  if(Data&0x80)
  {
   TWI_SDA_1;
  }
  else
  {
   TWI_SDA_0;
  } 
  Data<<=1;
  TWI_NOP;
  //---数据建立保持一定延时----
  
  //----产生一个上升沿[正脉冲] 
  TWI_SCL_1;
  TWI_NOP;
  TWI_SCL_0;
  TWI_NOP;//延时,防止SCL还没变成低时改变SDA,从而产生START/STOP信号
  //---------------------------   
 }
 //接收从机的应答 
 TWI_SDA_1; 
 TWI_NOP;
 TWI_SCL_1;
 TWI_NOP;   
 if(TWI_SDA_STATE)
 {
  TWI_SCL_0;
  //////DebugPrint("TWI_NACK!n");
  return TWI_NACK;
 }
 else
 {
  TWI_SCL_0;
  //////DebugPrint("TWI_ACK!n");
  return TWI_ACK;  
 }    
}


u8 TWI_ReceiveByte(void)
{
 u8 i,Dat;
 TWI_SDA_1;
 TWI_SCL_0; 
 Dat=0;
 for(i=0;i<8;i++)
 {
  TWI_SCL_1;//产生时钟上升沿[正脉冲],让从机准备好数据 
  TWI_NOP; 
  Dat<<=1;
  if(TWI_SDA_STATE) //读引脚状态
  {
   Dat|=0x01; 
  }   
  TWI_SCL_0;//准备好再次接收数据  
  TWI_NOP;//等待数据准备好         
 }
 //////DebugPrint("TWI_Dat:%xn",Dat);
 return Dat;
}


关键字:stm32  模拟i2c 引用地址:STM32 模拟I2C 程序

上一篇:stm32内存结构
下一篇:STM32启动模式理解浅析

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

STM32直接操作寄存器点亮第一个LED灯
来做个实验:不依赖任何库,直接操作寄存器点亮第一个LED灯 分析上图可知,四个led灯等分别连接着STM32F407的四个引脚,引脚输出低电平,led亮,输出高电平,led灭 因为STM32与51单片机不同,它多一个时钟系统,旨在产生不同频率供不同设备使用,使用之前,必须先开启对应的时钟,所以在控制GPIO寄存器之前,我们要先打开GPIOF组的时钟 通过查找《STM32F4xx中文参考手册》第53页得知,RCC的基地址(也就是起始地址)为0x40023800,在135页查得其外设时钟使能寄存器的偏移地址为0x30,该偏移是相对于RCC基地址的偏移,因此计算外设时钟使能寄存器的地址为: RCC_AHB1ENR = R
[单片机]
<font color='red'>STM32</font>直接操作寄存器点亮第一个LED灯
CM3(STM32)内核复位与系统复位区别及应用
Ⅰ、写在前面 某些系统允许复位,但对外设又有特殊要求:某一个IO状态不能因为复位而改变,某一个定时器计数器不能改变等。 例子:我一个A系统通过一个IO控制另一个B系统的电源,而这个IO置高时才开启B系统的电源。 正常工作过程中,B系统只有收到A系统关机命令任务才会进行关机(也就是说不能掉电关机),而A系统在工作过程中有复位的需求。 这个时候如果我使用常规的引脚复位,就会使IO置低,不符合要求,就需要使用到本文说到的内核复位。 Ⅱ、关于复位 说到复位,我们都不会陌生,学习时,开发板上基本都有一个复位按键。 复位的种类有很多:上电复位、掉电复位、复位引脚复位、看门狗复位、软件复位等。 上面说的复位按键,也就
[单片机]
关于stm32硬件spi的miso口配置
在我们刚使用spi时,对于spi的io口配置可能会有一些疑惑吧,miso明明是一个输入口却配置成了复用推挽输出,是不是会有一点疑惑呢? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用的推挽输出 MISO不是应该设置成为输入端口(GPIO_Mode_IN_FLOATING)才行的吗?是不是很抑或呢? 哈哈哈
[单片机]
STM32 关于复位类型的判断及软件复位 bug
STM 32在复位时,有严重BUG: 1.上电复位和外置的看门狗芯片重启复位是无法区分开来的!RCC_FLAG_BORRST, RCC_FLAG_PINRST, RCC_FLAG_LPWRRST三个都复位了! 2.这样当要在上电复位初始化关键代码时,这些代码看门狗复位则不用重启,这个关键代码会导致应用业务的异常!若两个中断分不开,导致系统异常看门狗复位时影响业务! /* RCC_FLAG_BORRST: POR/PDR or BOR reset //Power-on/power-down reset (POR/PDR reset) or brownout (BOR) reset RCC_FLAG_PINRST: P
[单片机]
介绍如何通过意法的STM32 MCU实现用DMA完成多通道的AD采样功能
在嵌入式产品中有时候需要实现对外部的模拟量进行采样处理和记录,而这就需要使用到ADC功能,将外部的模拟量转换成数字量。而在复杂的嵌入式产品中,往往需要使用多路AD采样,例如在智能家居产品,电池电量检测,热敏温度传感器,烟雾传感器,气敏传感器等都是可以使用ADC来实现采样的。在本文章,将会介绍如何通过意法的STM32 MCU实现用DMA完成多通道的AD采样功能。 什么叫ADC ADC即模拟数字转换器(英语:Analog-to-digital converter)是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。一个模拟数字转换器可以提供信号用于测量。与之相对的设备成为数字模拟转换器。 影响AD采样的因素有哪些 分
[单片机]
介绍如何通过意法的<font color='red'>STM32</font> MCU实现用DMA完成多通道的AD采样功能
stm32 mpu6050 模拟i2c实例实现
最近准备一个比赛,所以正在加紧学习stm32,这篇文章就结合mpu6050分析一下利用i2c实现芯片之间的通信。 首先可以在原有的LED文件或显示屏(OLED)的文件基础上,新建一个HANDWARE,在其中加入mpu6050.c和mpu6050.h(名字自定)。 首先是在C文件中加入基本的I2C通信函数 1.I2C的GPIO端口初始化SDA、SCL设置为推挽输出。 2.然后是i2c_start();i2c_stop();函数,根据时序图设置SCL、SDA的高低电平变化。 3.之后加入主机ack的响应函数和ack的等待响应函数i2c_wait_ack();i2c_ack();i2c_wai
[单片机]
<font color='red'>stm32</font> mpu6050 <font color='red'>模拟</font><font color='red'>i2c</font>实例实现
STM32系统保存参数到eeprom的实现方法
1 ini.c #include stdio.h #include stm32f10x.h #include string.h #include EEPROMDrv.h #include ini.h //define the memory map in EEPROM #define IniStartAddress 0 #define IniMaxSize 200 /* EEPROM 0________200________________________________________________________________64K | | | |INI | OTHERS |
[单片机]
STM32系列MCU解决方案展示
  STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。按性能分成多个不同的系列,满足不同应用的不同需求。由于STM32系列在开发工具的成本和广泛度;存储器的种类、规模、性能和容量;以及各种软件获得的难易度方面都做了非常出色的准备,因此迅速在市场上取得巨大成功,成为最受欢迎的工业及消费市场应用的MCU产品系列之一。   STM32系列 E-METER产品方案介绍   友尚集团   与传统的机械式电能表相比,eMeter能够更快、更便宜、更可靠地报告用电量。友尚推出ST于智能电表上的运用方案,整个方案中的架构主要包括计量芯片、MCU和外围芯片三个部分。   计量芯片   单相表
[单片机]
<font color='red'>STM32</font>系列MCU解决方案展示
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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