STM32 IO 模拟IIC I2C

2019-04-02来源: eefocus关键字:STM32  IO  模拟IIC


#define I2C_Speed        100000

#define I2C_EE             I2C1

 

 

 

#define uStatus0x80

#definedTime 5

 

 

#define I2C_EE_GPIO   GPIOB

#define I2C_EE_SCL         GPIO_Pin_5

#define I2C_EE_SDA         GPIO_Pin_4

#define I2C_EE_CLK         RCC_APB1Periph_I2C1

 

 

 

 

#define SCL_H         GPIOB->BSRR = GPIO_Pin_5

#define SCL_L         GPIOB->BRR  = GPIO_Pin_5

 

#define SDA_H         GPIOB->BSRR = GPIO_Pin_4

#define SDA_L         GPIOB->BRR  = GPIO_Pin_4

 

#define SCL_read      GPIOB->IDR  & GPIO_Pin_5

#define SDA_read      GPIOB->IDR  & GPIO_Pin_4

 

 

 

 

 

static unsigned int cntForInitial = 0;

static unsigned char fSigStatus = 0;

 

//static bool LedStatus = true;

 

void I2C_Init()

{

GPIO_InitTypeDef  GPIO_InitStructure;

 

    //* Configure I2C_EE pins: SCL and SDA

  GPIO_InitStructure.GPIO_Pin =  I2C_EE_SCL | I2C_EE_SDA;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

  GPIO_Init(I2C_EE_GPIO, &GPIO_InitStructure);

}

 

 

static void i2c_start()

{

 SDA_H;

 SCL_H;

 DelayUs(dTime);

 SDA_L;

 DelayUs(dTime);

 SCL_L;

 DelayUs(dTime);

 

 //LedStatus = !LedStatus;

 //f_LCT1(LedStatus);

}

 

 

 

/*

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

Fuction:

Stop i2c

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

*/

static void i2c_stop()

{

    SDA_L;

 SCL_H;

 DelayUs(dTime);

 SDA_H;

 DelayUs(dTime);

 SCL_H;

 DelayUs(dTime);

}

 

/*

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

Fuction:

i2c  Master wait for ack

Only ack

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

*/

static unsigned char i2c_rd_ack()

{

    unsigned char flag = 0;

    SDA_H;

 SCL_H;

 DelayUs(dTime/2);

 flag = SDA_read;

 DelayUs(dTime/2);

 SCL_L;

 DelayUs(dTime/2);

 if(flag == 1)

 return 0;

 return 1;

}

 

/*

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

Fuction:

i2c  Byte transmission

Only Send,no ack,no stop

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

*/

static unsigned char i2c_sb(unsigned char Byte)

{

unsigned char cnt;

SCL_L;

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

{

 

  if(Byte&0x80)

   SDA_H;

   else

   SDA_L;

   DelayUs(dTime);

   SCL_H;

   DelayUs(dTime);

   SCL_L;

   Byte <<= 1;

   DelayUs(dTime);

}

 

return i2c_rd_ack();

 

}

 

 

 

 

/*

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

Fuction:

i2c Byte receive

Return Byte

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

*/

static unsigned char i2c_rb()

{

unsigned char cnt;

unsigned char Byte=0;

 

SDA_H;

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

      {

 

Byte <<= 1;

DelayUs(dTime);

SCL_H;

DelayUs(dTime);

if(SDA_read)

Byte |= 0x01;

SCL_L;

DelayUs(dTime);

      }

    return Byte;

}

 

 

 

/*

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

Fuction:

i2c ACK  Master send

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

*/

static void i2c_wr_ack(unsigned char ACK)

{

  if(ACK)

SDA_H;

else

SDA_L;

 SCL_H;

 DelayUs(dTime);

 SCL_L;

 DelayUs(dTime);

}

 

 

/*

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

Fuction:

i2c Byte receive

Return Byte

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

*/

uint8_t ReadReg(unsigned int addr)

{

    uint8_t temp;

 

i2c_start();

if(!i2c_sb(BRG_DEV_ADDR))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((uint8_t)(addr >> 8)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((uint8_t)(addr & 0xFF)))

{

i2c_stop();

return 0;

}

 

i2c_start();

 

if(!i2c_sb(BRG_DEV_ADDR |0x01))

{

i2c_stop();

return 0;

}

temp = i2c_rb();

i2c_wr_ack(1);

i2c_stop();

return temp;

}

unsigned char WriteReg8(unsigned int addr,unsigned char wData)

{

i2c_start();

if(!i2c_sb(BRG_DEV_ADDR))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr >> 8)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr & 0xFF)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData)))

{

i2c_stop();

return 0;

}

i2c_stop();

//DelayUs(1);

return 1;

}

 

unsigned char WriteReg16(unsigned int addr,unsigned char wData1,unsigned char wData2)

{

i2c_start();

if(!i2c_sb(BRG_DEV_ADDR))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr >> 8)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr & 0xFF)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData2)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData1)))

{

i2c_stop();

return 0;

}

 

i2c_stop();

DelayUs(1);

return 1;

}

 

 

unsigned char WriteReg32(unsigned int addr,unsigned char wData1,unsigned char wData2,unsigned char wData3,unsigned char wData4)

{

i2c_start();

if(!i2c_sb(BRG_DEV_ADDR))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr >> 8)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr & 0xFF)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData4)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData3)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData2)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData1)))

{

i2c_stop();

return 0;

}

 

i2c_stop();

DelayUs(1);

return 1;

}


关键字:STM32  IO  模拟IIC 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/2019/ic-news040243684.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32F030 I2C 从模式中断编程
下一篇:模拟串口UART的实现

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32MxCube配置串口
基于上一次将第一章:STM32MxCube 基本使用方法,本章直接讲叙述STM32配置串口2的。查看STM32F407电路图:可得USART2接在PA2、PA3。下面新建STM32MxCube工程,开始配置。这里我们配置IO(定义PF9、PF10引脚为LED)、RCC(使用HSE)、USART(串口)。配置USART(串口)USART的配置有好几种,也是最常见的一种”UART异步串行通信”配置来讲述。选择USART2模式为“asynchronous”(异步通信)对应的引脚自动转换为USART。对于系统时钟应该都知道它的作用,就是驱动整个芯片工作的心脏,如果没有了它,就等于人没有了心跳。时钟的快慢也就决定了程序的快慢。STM32
发表于 2020-05-04
STM32MxCube配置串口
STM32CubeMX学习教程之一:GPIO输出之跑马灯
完整源码下载:https://github.com/simonliu009/STM32CubeMX-GPIO-Control软件版本:STM32CubeMX V4.25.0 System Workbench V2.4固件库版本:STM32Cube FW_F1 V1.6.1硬件:OneNet 麒麟座V2.3在STM32CubeMX中新建项目,选择正确的MCU型号首先设置RCC和SYS,如下图然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M),如下图GPIO设置 PC7, PC8, PA12和 PC10为GPIO_OUTPUT, (这是麒麟座V2.3的四个LED管脚),如下图
发表于 2020-05-04
STM32CubeMX学习教程之一:GPIO输出之跑马灯
STM32CubeMX学习--(3)串口通信
Cube配置USART配置在Connectivity中选中USART1MODE = AsynchronousHardware Flow Control = DisableParameter Settings中配置Baud Rate = 115200Word Length = 8bitParity = NoneStop Bits =1Data Direction = Receive and TransmitOver Sampling = 16 SamplesNVIC Setting勾选Enable,Preemption Priority =2生成代码修改代码生成代码后,即可使用HAL_UART_Transmit_IT(&
发表于 2020-04-29
STM32CubeMX系列教程 5.0版本环境开发——2.Uart串行通信功能
;                         PS:在明白原理的情况下建议自己手写一次模拟UART。明白了之后,代码重复的事就由STM32芯片的硬件功能来实现就可以了,你只需要会看逻辑分析仪或者示波器分析数据便可。 所谓硬件功能 就是你把数据填充到寄存器,然后配置好相关参数,他会自动帮你发送出去。通俗点说,自己手写整个协议代码实现实现就像你自己把一个快件送到到别人那里再回来,而硬件功能则是你把快件给快递员,快递员帮你送过去。  明显 后者会帮你节省大量时间和精力。它是一个硬件组成,并且你也为此付费
发表于 2020-04-29
STM32CubeMX系列教程 5.0版本环境开发——2.Uart串行通信功能
串口通信(用CubeMX学习STM32)
前言: STM32串口介绍串行通信是单片机与外部设备或其他计算机交换信息的一个方式, 数据一位一位的按顺序传送, 其优点是只需要一条传输线, 协议简单, 但是缺点就是传送速度较慢。串口是单片机上非常便捷的一个工具, 当写程序需要调试的时候, 它可以很方便的提供调试方法, 只要在一些关键代码执行的地方, 通过串口给串口调试助手发送相关信息, 就可以使我们很方便的查看代码在这个位置的执行情况。下面看一下我所使用的单片机上串口的原理图接线外部的发送端TXD就是单片机串口的接收端USART_RX,   外部接收端RXD就是单片机串口的发送端USART_TXTXD : Transmit(TX) Data(D)  Receive(RX
发表于 2020-04-29
【STM32CubeMX】 串口通信(USART) Printf重定向
STM32CubeMX: Version 4.26.1MDK-ARM: Version 5.24.2开发板: 中移onenet 麒麟座MINI板芯片: STM32F103CBT61.STM32CubeMX设置设置外部时钟源设置Debug设置串口 使用USART1 PA9,PA10设置时钟频率设置USART1详细参数生成MDK-ARM工程2.重定向Printf 及 Scanf主要用到两个函数HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout
发表于 2020-04-29
【STM32CubeMX】 串口通信(USART) Printf重定向
小广播
何立民专栏 单片机及嵌入式宝典

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

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