STM32F103,HAL实现软件I2C,与硬件I2C

发布者:码字奇才最新更新时间:2019-08-07 来源: eefocus关键字:STM32F103  HAL  软件I2C  硬件I2C 手机看文章 扫描二维码
随时随地手机看文章

1,硬件I2C


HAL_I2C_Mem_Write(&hi2c1,0x88,0,I2C_MEMADD_SIZE_8BIT,0,0,0X10);//写

 

HAL_I2C_Master_Receive(&hi2c1,0x89,(uint8_t*)datatemp,4,0x10);//读

2 软件I2C


#ifndef __MYI2C_H__

#define __MYI2C_H__

 

#include "stm32f1xx_hal.h"

#include "main.h"

#include "stdint.h"

 

#define CPU_FREQUENCY_MHZ  72

#define MYI2C_SCL_PIN   I2C_SCL_Pin

#define MYI2C_SCL_PORT I2C_SCL_GPIO_Port

#define MYI2C_SDA_PIN I2C_SDL_Pin

#define MYI2C_SDA_PORT I2C_SDL_GPIO_Port

 

#define SDA_Dout_LOW()                          HAL_GPIO_WritePin(MYI2C_SDA_PORT,MYI2C_SDA_PIN,GPIO_PIN_RESET) 

#define SDA_Dout_HIGH()                         HAL_GPIO_WritePin(MYI2C_SDA_PORT,MYI2C_SDA_PIN,GPIO_PIN_SET)

#define SDA_Data_IN()                           HAL_GPIO_ReadPin(MYI2C_SDA_PORT,MYI2C_SDA_PIN)

#define SCL_Dout_LOW()                          HAL_GPIO_WritePin(MYI2C_SCL_PORT,MYI2C_SCL_PIN,GPIO_PIN_RESET) 

#define SCL_Dout_HIGH()                         HAL_GPIO_WritePin(MYI2C_SCL_PORT,MYI2C_SCL_PIN,GPIO_PIN_SET)

#define SCL_Data_IN()                           HAL_GPIO_ReadPin(MYI2C_SCL_PORT,MYI2C_SCL_PIN)

#define SDA_Write(XX)    HAL_GPIO_WritePin(MYI2C_SDA_PORT,MYI2C_SDA_PIN,(XX?GPIO_PIN_SET:GPIO_PIN_RESET))

 

void I2C_Init(void);

void I2C_Start(void);

void I2C_Stop(void);

void I2C_Send_Byte(uint8_t txd); 

uint8_t     I2C_Read_Byte(uint8_t ack);

void I2C_NAck(void);

void I2C_Ack(void);

uint8_t     I2C_Wait_Ack(void);

 

 

 

 

void delay_xus(__IO uint32_t nTime);

 

 

#define Delay_us(xx)  delay_xus(xx)

 

#endif

 

#include "myi2c.h"

 

 

 

void delay_xus(__IO uint32_t nTime)

{

    int old_val,new_val,val;

 

    if(nTime > 900)

    {

        for(old_val = 0; old_val < nTime/900; old_val++)

        {

            delay_xus(900);

        }

        nTime = nTime%900;

    }

 

    old_val = SysTick->VAL;

    new_val = old_val - CPU_FREQUENCY_MHZ*nTime;

    if(new_val >= 0)

    {

        do

        {

            val = SysTick->VAL;

        }

        while((val < old_val)&&(val >= new_val));

    }

    else

    {

        new_val +=CPU_FREQUENCY_MHZ*1000;

        do

        {

            val = SysTick->VAL;

        }

        while((val <= old_val)||(val > new_val));

 

    }

}

 

//--------------------------------------------

void SDA_Output(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.Pin = MYI2C_SDA_PIN;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(MYI2C_SDA_PORT,&GPIO_InitStruct);

}

 

 

void SDA_Input(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.Pin = MYI2C_SDA_PIN;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(MYI2C_SDA_PORT,&GPIO_InitStruct);

}

 

void SCL_Output(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.Pin = MYI2C_SCL_PIN;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(MYI2C_SCL_PORT,&GPIO_InitStruct);

}

 

 

void SCL_Input(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.Pin = MYI2C_SCL_PIN;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(MYI2C_SCL_PORT,&GPIO_InitStruct);

}

 

 

 

 

void I2C_Init(void)

{

SCL_Output();

SDA_Output();

SCL_Dout_HIGH();

SDA_Dout_HIGH();

}

 

 

//产生IIC起始信号

 

void I2C_Start(void)

{

SDA_Output();

SDA_Dout_HIGH();

SCL_Dout_HIGH();

Delay_us(4);

SDA_Dout_LOW();

Delay_us(4);

SCL_Dout_LOW();

}

 

  

//产生IIC停止信号

 

void I2C_Stop(void)

{

SDA_Output();

SCL_Dout_LOW();

SDA_Dout_LOW();

Delay_us(4);

SCL_Dout_HIGH();

SDA_Dout_HIGH();

Delay_us(4);    

}

 

uint8_t I2C_Wait_Ack(void)

{

uint8_t ucErrTime=0;

SDA_Input();

SDA_Dout_HIGH();Delay_us(1);    

SCL_Dout_HIGH();Delay_us(1);  

while(SDA_Data_IN())

{

ucErrTime++;

if(ucErrTime>250)

{

I2C_Stop();

return 1;

}

}

SCL_Dout_LOW();//时钟输出0    

return 0; 

}

 

//产生ACK应答

 

void I2C_Ack(void)

{

SCL_Dout_LOW();

SDA_Output();

SDA_Dout_LOW();

Delay_us(2);

SCL_Dout_HIGH();

Delay_us(2);

SCL_Dout_LOW();

}

 

//不产生ACK应答   

 

void I2C_NAck(void)

{

SCL_Dout_LOW();

SDA_Output();

SDA_Dout_HIGH();

Delay_us(2);

SCL_Dout_HIGH();

Delay_us(2);

SCL_Dout_LOW();

}      

//IIC发送一个字节

//返回从机有无应答

//1,有应答

//0,无应答

void I2C_Send_Byte(uint8_t txd) 

{                        

uint8_t t;      

//拉低时钟开始数据传输

SDA_Output();

SCL_Dout_LOW();

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

{  

SDA_Write((txd&0x80)>>7);    

txd<<=1;   

Delay_us(5);   //对TEA5767这三个延时都是必须的

SCL_Dout_HIGH();

Delay_us(5);

SCL_Dout_LOW();

//Delay_us(2);

  }  

}     

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   

uint8_t I2C_Read_Byte(uint8_t ack)

{

unsigned char i,receive=0;

//SDA设置为输入

SDA_Input();

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

{

SCL_Dout_LOW();

Delay_us(5);

SCL_Dout_HIGH();

receive<<=1;

if(SDA_Data_IN())receive++;   

Delay_us(5); 

  }  

  if(!ack)I2C_NAck();//发送nACK

  else  I2C_Ack(); //发送ACK   

  

return receive;

}

关键字:STM32F103  HAL  软件I2C  硬件I2C 引用地址:STM32F103,HAL实现软件I2C,与硬件I2C

上一篇:I2C上拉电阻问题分析(基于stm32 HAL库)
下一篇:stm32 hal 模拟i2c

推荐阅读最新更新时间:2024-11-06 10:04

STM32F103 使用HSI配置系统时钟为64MHZ
/** * @brief Sets System clock frequency to 64MHz and configure HCLK, PCLK2 * and PCLK1 prescalers. * @note OCS is HSI. This function should be used only after reset. * @param None * @retval None */ void SetSysClockTo64Mhz(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; RCC_
[单片机]
μCOS_II移植到STM32F103VC过程
一.μCOS-II源码文件结构介绍 下载地址: https://www.micrium.com/download/micrium_stm32xxx_ucos-ii/ 这个地址下载的时候需要注册Micrium账号才能下载,源码是Micrium官方提供给移植内核ARM Cortex-M3的例子,我们所要移植的STM32F103VC芯片的内核是ARM Cortex-M3,因此我们下载这个源码文件。 下载成功之后是一个Micrium_STM32xxx_uCOS-II.exe可执行文件的压缩文件(图1)需要我们解压缩(图2)得到(图3)。 图1: 图2: 图3: 树形展开结构:
[单片机]
μCOS_II移植到<font color='red'>STM32F103</font>VC过程
STM32CubeIDE 中 HAL库的串口中断接收函数 HAL_UART_Receive_IT
一、代码自动生成以后的项目及代码结构: main.c中,调用了串口初始化 串口初始化函数赋值了串口的参数 相当于底层的初始化,配置引脚、并开启中断。 至此串口1配置完毕 二、库文件stm32f1xx_hal_uart.c内的秘密 2.1 初始化 1.usart.c中,MX_USART1_UART_Init 调用了库的HAL_UART_Init,将结构体传递进该函数中 2.HAL_UART_Init干了些什么事? if (huart- gState == HAL_UART_STATE_RESET) { huart- Lock = HAL_UNLOCKED; HAL_UART_MspInit(huar
[单片机]
STM32CubeIDE 中 <font color='red'>HAL</font>库的串口中断接收函数 <font color='red'>HAL</font>_UART_Receive_IT
CubeMX 5.5 修改HAL库库函数版本
最初我是按照软件推荐,自动按安装的1.15的。 为了和正点原子的例程统一库函数版本,就下载了1.11。 但是在工程配置界面始终没有办法修改 hal库 版本的选择: 关闭CubeMX,使用记事本打开工程文件: 修改版本号: 重新打开工程,库版本修改成功: 工程生成成功:
[单片机]
CubeMX 5.5 修改<font color='red'>HAL</font>库库函数版本
STM32 HAL库学习系列番外第2篇---LL库定时器配置
cube配置与hal一样 LL库的封装没有HAL库的那么好,需要深入的看下参考手册 定时器启动及中断函数 voiduser_tim17Init() { LL_TIM_EnableIT_UPDATE(TIM17); LL_TIM_EnableCounter(TIM17); } voiduser_tim17IRQ() { if(LL_TIM_IsActiveFlag_UPDATE(TIM17)) { LL_TIM_ClearFlag_UPDATE(TIM17); } } 定时器PWM捕获功能 voiduser_dht11Init() { LL_TIM_EnableIT_CC1(TIM3);
[单片机]
STM32 之二 HAL库详解 及 手动移植
HAL库结构   说到STM32的HAL库,就不得不提STM32CubeMX,其作为一个可视化的配置工具,对于开发者来说,确实大大节省了开发时间。STM32CubeMX就是以HAL库为基础的,且目前仅支持HAL库及LL库!首先看一下,官方给出的HAL库的包含结构: - **stm32f2xx.h**主要包含STM32同系列芯片的不同具体型号的定义,是否使用HAL库等的定义,接着,其会根据定义的芯片信号包含具体的芯片型号的头文件: #if defined(STM32F205xx) #include stm32f205xx.h #elif defined(STM32F215xx) #include stm32f215xx
[单片机]
基于STM32F103 的电压显示
运用STM32F103和LCD1602实现实时显示电压的功能 ADC运用的管脚是 PA(0) 下面是ADC的配置 #include ADC.h void ADC_Init_MY(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_ADC1,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0
[单片机]
基于<font color='red'>STM32F103</font> 的电压显示
基于NiosⅡ软核处理器下SD卡驱动设计
  近年来,基于FPGA的软核处理器以其高度的设计灵活性和低成本在嵌入式市场中得到重视并不断发展。其中具有代表性的软核处理器有Ahera的NiosⅡ处理器和Xilinx的MicroBlaze处理器。NiosⅡ处理器具有完全的可定制性,包括处理器的定制,外设的定制和接口的定制等;32位的NiosⅡ处理器具有超过200 DIMP的性能,而其成本只有同级别性能ARM处理器的l/10。此外,SD存储卡以其大容量和小尺寸的特点,成为市面上各种嵌入式消费产品最常见的存储媒介,探讨SD卡设备的设计具有广泛的应用价值。这里将结合NiosⅡ处理器的总线架构,分析SD卡的接口协议和驱动程序设计方法,并给出SD卡设备在NiosⅡ处理器的设计实例。
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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